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