Hier ein stueck code vielleicht kannst Du damit was Anfangen.
Aber in 8-bit mode!
Mfg stephan
struct display
{
// Display control /////////////////
char display_of; // displayn/off
char cursor_of; // cursorn/off
char blinking_of; // blinkingn/off
char cursor_dir; // cursor direction:incr/decr
char display_shift; // display shiftn/off
char bus; // bus type :8/4 chars
char row_size; // lines :2/1 line display
char font; // font :5x10/5x7 dots
char enable; // display enable :E/E2
////////////////////////////////////
/*
// SDCC 3
// Display control /////////////////
bit display_of; // displayn/off
bit cursor_of; // cursorn/off
bit blinking_of; // blinkingn/off
bit cursor_dir; // cursor direction:incr/decr
bit display_shift; // display shiftn/off
bit bus; // bus type :8/4 bits
bit row_size; // lines :2/1 line display
bit font; // font :5x10/5x7 dots
bit enable; // display enable :E/E2
////////////////////////////////////
*/
};
typedef struct display Display;
#define RS P2_4 //
#define RW P2_5 //
#define E P2_6 //
#define E2 P2_7 //
#define DATA P0 // 8 data bits
#define WAITTIME_WRITE 10 // usec time to sleep when writing to lcd
#define WAITTIME_READ 5 // usec time to sleep when reading from lcd
///////////////////////////////
bit WdtLcdIAP=0; // IAP Watchdog
bit ENABLE_NR=0;
/**
* lcdRead()
* read data from LCD and write to dat
**/
char lcdRead(short dat)
{
RS=(dat>>9)&1;
RW=ON;
if (ENABLE_NR==1) E=ON;
else E2=ON;
if(WdtLcdIAP) feedWatchDog();
usleep(WAITTIME_READ);
if(WdtLcdIAP) feedWatchDog();
dat=(short)DATA;
E=OFF; E2=OFF;
RS=OFF;
RW=OFF;
return (char)dat;
}
/**
* lcdWrite()
* write dat direct to LCD bus
* return DD adresse position
**/
void lcdWrite(short dat)
{
while((lcdRead(0)>>7)&1){} // wait until LCD is ready
RS=(dat>>9)&1; // get RS bit
RW=OFF; // set RW bit
if(WdtLcdIAP) feedWatchDog();
usleep(WAITTIME_WRITE);
if(WdtLcdIAP) feedWatchDog();
if (ENABLE_NR==1) E=ON;
else E2=ON;
DATA=(char)dat;
E=OFF; E2=OFF;
RS=OFF;
RW=OFF;
return;
}
/**
* setCursor()
* move cursor to line and row
* line1 = 0 line2 = 1
**/
void setCursor(Display *dis,char line,char col)
{
short dat=0;
ENABLE_NR=dis->enable;
col&=63; // filter
dat|=col; // related adresse
dat|=((line&1)<<6); // line 1 or 2
dat|=(1<<7); // DB7
lcdWrite(dat);
}
Lesezeichen