/****************************************************************************/ /* Verschiedene Routinen zur Ansteuerung eines Sharp LCD Displays */ /* vom Typ LM20A21 (2 Zeilen, 20 Spalten) */ /****************************************************************************/ #include #include "lcd.h" #define SPALTEN 16 #define ZEILEN 2 /* LCD-Anschluesse an Ports */ sbit RS = P5^1; // MUSST DU NATÜRLICH AUF DEINEN sbit RW = P5^2; // KONTROLLER ANPASSEN sbit EN = P5^3; sbit D4 = P5^4; sbit D5 = P5^5; sbit D6 = P5^6; sbit D7 = P5^7; /* Wartet eine entsprechende Anzahl von Millisekunden */ void warte(unsigned int msec) { data char i; for (msec; msec!=0; msec--) for (i=0; i<83; i++); } /* Wartet, bis LCD neue Daten aufnehmen kann */ void busy_lcd(void) { data bit busy; busy =1; while (busy == 1) { D7=1; D6=1; D5=1; D4=1; /*Ports auf Eingabe*/ RS=0; RW=1; EN=1; busy=D7; EN=0; /*lese 1.Halbbyte */ /*busy-flag in D7 */ EN=1; EN=0; /*lese 2.Halbbyte */ } } /*initialisiert den LCD-Controller auf 4 Bit Betrieb etc */ void init_lcd(void) { D7=1; D6=1; D5=1; D4=1; RS=0; RW=0; EN=0; warte (20); D7=0; D6=0; D5=1; D4=1; EN=1; EN=0; /*func set: interface is 8 bit long*/ warte (5); D7=0; D6=0; D5=1; D4=1; EN=1; EN=0; /*func set: interface is 8 bit long*/ warte (1); D7=0; D6=0; D5=1; D4=1; EN=1; EN=0; /*func set: interface is 8 bit long*/ warte (1); D7=0; D6=0; D5=1; D4=0; EN=1; EN=0; /*func set: interface is 4 bit long*/ warte (1); D7=0; D6=0; D5=1; D4=0; EN=1; EN=0; /*func set: interface is 4 bit long*/ D7=1; D6=0; D5=0; D4=0; EN=1; EN=0; /* number of display lines is 2 */ busy_lcd (); RS=0; RW=0; D7=0; D6=0; D5=0; D4=0; EN=1; EN=0; /* D6=1 display on; */ D7=1; D6=1; D5=0; D4=0; EN=1; EN=0; busy_lcd (); RS=0; RW=0; D7=0; D6=0; D5=0; D4=0; EN=1; EN=0; /* clear display */ D7=0; D6=0; D5=0; D4=1; EN=1; EN=0; busy_lcd (); RS=0; RW=0; D7=0; D6=0; D5=0; D4=0; EN=1; EN=0; /* entry mode: decrement, no shift */ D7=0; D6=1; D5=0; D4=0; EN=1; EN=0; } void blank_lcd(void) /*loescht die Anzeige und stellt den Cursor zurck*/ { busy_lcd (); RS=0; RW=0; D7=0; D6=0; D5=0; D4=0; EN=1; EN=0; /* clear display */ D7=0; D6=0; D5=0; D4=1; EN=1; EN=0; busy_lcd (); RS=0; RW=0; D7=0; D6=0; D5=0; D4=0; EN=1; EN=0; /* return home */ D7=0; D6=0; D5=1; D4=0; EN=1; EN=0; } void char_lcd(char zeile, char spalte, char ascii) { data char adresse; if (zeile>0 && zeile<(ZEILEN+1)) if (spalte>0 && spalte<(SPALTEN+1)) { adresse = spalte-1 + (zeile-1)*64; busy_lcd(); RS=0; RW=0; D7 = 1; D6 = adresse & 64; D5 = adresse & 32; D4 = adresse & 16; EN=1; EN=0; D7 = adresse & 8; D6 = adresse & 4; D5 = adresse & 2; D4 = adresse & 1; EN=1; EN=0; busy_lcd(); RS=1; RW=0; D7 = ascii & 128; D6 = ascii & 64; D5 = ascii & 32; D4 = ascii & 16; EN=1; EN=0; D7 = ascii & 8; D6 = ascii & 4; D5 = ascii & 2; D4 = ascii & 1; EN=1; EN=0; } } void print_lcd(char zeile, char spalte, char *str) { char i; for ( i = spalte; (i <= 20) && *str; i++) { warte(10); char_lcd(zeile,i,*str); str++; }; }