EL1602B

Jakub Ladman ladmanj
Středa Březen 17 12:05:40 CET 2004


Nejak se tu marne snazim rozchodit LCD display viz. subj. s atmelem.
Prosim, mate li nekdo cas, mrknete se na to proc to nechodi - treba Vas to
trkne, ja uz tam nic nevidim.

Nejsem na C zadny expert tak me nekamenujte.

1) soubor alphadisp.c
/**********************
 *** main prasogram ***
 **********************/

#include <C:\keil\c51\el1602b\hardware.c>

void main()
{
 unsigned char i;
 char code text[]="Ahoj vole, jak  to jde. 01-2001 ";
 init();
 setadd(0);
 for (i=0; i<16; i++)
 {
  wrdat(text[i]);
 }
 setadd(0x40);
 for (i=0; i<16; i++)
 {
  wrdat(text[i]);
 }
 while(1) {}
}

2) soubor hardware.c
/***********************
 *** HARDWARE DRIVER ***
 ***********************/

#include <c:\keil\c51\EL1602B\connect.h>
#include <c:\keil\c51\inc\atmel\at89x51.h>
#include <intrins.h>

void strobe();
void wrdat(unsigned char inbyte);
unsigned char rddat();
unsigned char rdac();
unsigned char busy();
void comnd(unsigned char inbyte);
void clrdsp();
void curhome();
void entrymode(unsigned char I_D,S);
void onoff(unsigned char D,C,B);
void cur_shift(unsigned char S_C,R_L);
void funcset(unsigned char DL,N,F);
void set4bit (unsigned char byte);
void init();
void setacg(unsigned char ACG);
void setadd(unsigned char ADD);

unsigned char spodek(unsigned char inbyte);
unsigned char vrsek(unsigned char inbyte);
unsigned char spoj(unsigned char inlo,inhi);

void set4bit(unsigned char byte)  //zapisuje inicializacni slova
{          //pred nastavenim rozhrani
 P2 = P2 | 0xf;
 P2 = P2 & byte;
 R_W = 0;
 RS = 0;
 _nop_ ();
 _nop_ ();
 E = 0;
 _nop_ ();
 _nop_ ();
 _nop_ ();
 E = 1;
}
void init()
{
 unsigned int i;
 for (i=0; i<10000; i++) {}   // cekani pred prvnim zapisem (>15ms)
 set4bit(0xf3);
 for (i=0; i<5000; i++) {}   // cekani po prvnim slovu (>4.1ms)
 set4bit(0xf3);
 for (i=0; i<100; i++) {}   // cekani po druhem slovu (>100us)
 set4bit(0xf3);
 for (i=0; i<2000; i++) {}   // cekani po tretim slovu (>1.5ms)
 set4bit(0xf2);
 funcset(0,1,0);     // function set             0 0 0 0 DL N F
 onoff(1,1,1);      // display ON/OFF control   0 0 0 0 0  0 0 D C   B
 clrdsp();       // Clear display      0 0 0 0 0  0 0 0 0   1
 curhome();       // cursor at home     0 0 0 0 0  0 0 0 1   -
 entrymode(1,0);      // entry mod set      0 0 0 0 0  0 0 0 I/D S
}

void wrdat(unsigned char inbyte)
{
 while (busy()) {}
 P2 = P2 | 0xf;    //nastavit low nible na 1111
 P2 = P2 & vrsek(inbyte); //beze zmeny ridicich bitu zapsat na P2 horni cast
dat
 RS = 1;    //nastavit RAM SELECT - budeme pracovat s daty
 R_W = 0;    //nastavit WRITE - budeme zapisovat
 _nop_ ();    //pockame na display min 40 ns
 _nop_ ();
 E = 0;     //sestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame na display min 220 ns
 _nop_ ();
 _nop_ ();
 E = 1;     //vzestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame 220 ns
 _nop_ ();
 _nop_ ();
 P2 = P2 | 0xf;    //nastavit low nible na 1111
 P2 = P2 & spodek(inbyte); //beze zmeny ridicich bitu zapsat na P2 dolni
cast dat
 _nop_ ();    //pockame
 _nop_ ();
 E = 0;     //sestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame na display min 220 ns
 _nop_ ();
 _nop_ ();
 E =1 ;     //vzestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame 220 ns
 _nop_ ();
 _nop_ ();
 RS = 0;     //RAM SELECT do vychozi polohy
}
unsigned char rddat()
{
 unsigned char tmp1,tmp2;
 while (busy()) {}
 RS = 1;    //nastavit RAM SELECT - budeme pracovat s daty
 R_W = 1;    //nastavit READ - budeme cist
 _nop_ ();    //pockame na display min 40 ns
 _nop_ ();
 E = 0;     //sestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame na display min 220 ns
 _nop_ ();
 _nop_ ();
 tmp1 = P2;
 E = 1;     //vzestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame 220 ns
 _nop_ ();
 _nop_ ();
 E = 0;     //sestupna hrana strobe
 _nop_ ();    // 220 ns
 _nop_ ();
 _nop_ ();
 tmp2 = P2;
 E = 1;     //vzestupna hrana strobe
 _nop_ ();    // 220 ns
 _nop_ ();
 _nop_ ();
 RS = 0;     //RAM SELECT do vychozi polohy
 R_W = 0;    //R_W taky
 return spoj(tmp2,tmp1);
}
unsigned char rdac()
{
 unsigned char tmp1,tmp2;
 while (busy()) {}
 RS = 0;    //nulovat RAM SELECT
 R_W = 1;    //nastavit READ - budeme cist
 _nop_ ();    //pockame na display min 40 ns
 _nop_ ();
 E = 0;     //sestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame na display min 220 ns
 _nop_ ();
 _nop_ ();
 tmp1 = P2;
 E = 1;     //vzestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame 220 ns
 _nop_ ();
 _nop_ ();
 E = 0;     //sestupna hrana strobe
 _nop_ ();    // 220 ns
 _nop_ ();
 _nop_ ();
 tmp2 = P2;
 E = 1;     //vzestupna hrana strobe
 _nop_ ();    // 220 ns
 _nop_ ();
 _nop_ ();
 R_W = 0;    //R_W do vychozi polohy
 return (spoj(tmp2,tmp1) & 0x7f);
}
unsigned char busy()
{
 unsigned char out;
 RS = 0;
 R_W = 1;
 _nop_ ();
 _nop_ ();
 E = 0;
 _nop_ ();    //pockame 220 ns
 _nop_ ();
 _nop_ ();
 out = DB7;    //cte busy flag
 E = 1;
 _nop_ ();    //pockame 220 ns
 _nop_ ();
 _nop_ ();
 E = 0;
 _nop_ ();    //pockame 220 ns
 _nop_ ();
 _nop_ ();
 E = 1;
 RS = 0;
 R_W = 0;
 return out;
}
void comnd(unsigned char inbyte)
{
 while (busy()) {}
 P2 = P2 | 0xf;    //nastavit low nible na 1111
 P2 = P2 & vrsek(inbyte); //beze zmeny ridicich bitu zapsat na P2 horni cast
dat
 RS = 0;    //nulovat RAM SELECT
 R_W = 0;    //nastavit WRITE - budeme zapisovat
 _nop_ ();    //pockame na display min 40 ns
 _nop_ ();
 E = 0;     //sestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame na display min 220 ns
 _nop_ ();
 _nop_ ();
 E = 1;     //vzestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame 220 ns
 _nop_ ();
 _nop_ ();
 P2 = P2 | 0xf;    //nastavit low nible na 1111
 P2 = P2 & spodek(inbyte); //beze zmeny ridicich bitu zapsat na P2 dolni
cast dat
 _nop_ ();    //pockame
 _nop_ ();
 E = 0;     //sestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame na display min 220 ns
 _nop_ ();
 _nop_ ();
 E = 1;     //vzestupna hrana strobovaciho vstupu
 _nop_ ();    //pockame 220 ns
 _nop_ ();
 _nop_ ();
}
void clrdsp()
{
 comnd(0x1);
}
void curhome()
{
 comnd(0x2);
}
void entrymode(unsigned char I_D,S)
{
 comnd(4+2*I_D+S);
}
void onoff(unsigned char D,C,B)
{
 comnd(8+4*D+2*C+B);
}
void cur_shift(unsigned char S_C,R_L)
{
 comnd(16+8*S_C+4*R_L);
}
void funcset(unsigned char DL,N,F)
{
comnd(32+16*DL+8*N+4*F);
}
void setacg(unsigned char ACG)
{
 comnd(64+ACG);
}
void setadd(unsigned char ADD)
{
 comnd(128+ADD);
}
unsigned char spodek(unsigned char inbyte)  //vytahne z bytu low nibble
{            // ... takhle: 1  1  1  1  D3 D2 D1 D0
 unsigned char out;
 out = 0xf0 | inbyte;
 return out;
}
unsigned char vrsek(unsigned char inbyte)  //vytahne z bytu high nibble
{            // ... takhle: 1  1  1  1  D7 D6 D5 D4
 unsigned char out;
 inbyte = inbyte >> 4;
 out = 0xf0 | inbyte;
 return out;
}
unsigned char spoj(unsigned char inlo,inhi)  // spojí low a high nibble do
jednoho
{            // bytu
 unsigned char out;
 inlo = inlo | 0xf0;
 inhi = inhi << 4;
 inhi = inhi | 0xf;
 out = inhi & inlo;
 return out;
}

3) soubor connect.h
/***********************************
 *** definice připojení displaye ***
 ***********************************/
sbit DB4 = 0xA0; // nejnižší bit čtyřbitového slova
sbit DB5 = 0xA1;
sbit DB6 = 0xA2;
sbit DB7 = 0xA3; // nejvyšší ...
sbit E = 0xA4;  // Enable (strobe) bit - reaguje na -_
sbit R_W = 0xA5; // - = read _ = write
sbit RS = 0xA6;  // - = ram _ = other
sbit LED = 0xA7; // back light - spínání ledky podsvícení


Diky za pomoc
Jakub Ladman






Další informace o konferenci Hw-list