#include #include #include sbit RS = P1^0; sbit RW = P1^1; sbit EN = P1^2; sbit D0 = P2^0; sbit D1 = P2^1; sbit D2 = P2^2; sbit D3 = P2^3; sbit D4 = P2^4; sbit D5 = P2^5; sbit D6 = P2^6; sbit D7 = P2^7; // Warteschleife, in etwa i x 0,5 msec @12 MHz void warte(unsigned int steps) { data char i; for (steps; steps!=0; steps--) for (i=0; i<120; i++); } // Überprüfung d. Busy-flags void busychk(void) { data bit busy; busy =1; while (busy == 1) { P2=0xff; RS=0; RW=1; EN=1; busy=D7; EN=0; /*Display Status*/ RW=0; } } void initlcd(void) { RW=0;RS=0; P2=0x30; EN=1;EN=0; warte(20); RS=0; P2=0x30; EN=1;EN=0; warte(10); RS=0; P2=0x30; EN=1;EN=0; warte(10); //System Set Command busychk(); RS=0; P2=0x38; EN=1;EN=0; //DSP on/off command busychk(); RS=0; P2=0x0C; // <-- Cursor style EN=1;EN=0; //ENTRY MODE Command busychk(); RS=0; P2=0x06; EN=1;EN=0; clearnhome(); } void clearnhome (void) { busychk (); RS=0; RW=0; // LCD löschen P2=0x01; EN=1;EN=0; busychk (); RS=0; RW=0; // Cursor zurück P2=0x02; EN=1;EN=0; } void move (int cline, int crow) // Funktion für Cursorbewegung { // move (zeile 1/2, Zeichen 1...16) int pos; switch(cline) { case 1: pos=0x00;break; case 2: pos=0xC0;break; default: pos=0x00; } pos=pos+crow; RS=0;RW=0;P2=pos;EN=1;EN=0; busychk(); RS=1; } char putchar (char zeichen) // Ersetzen der Originalfunktion { if(zeichen=='\n') // Prüfen ob Steuerzeichen gesendet wird RS=0; // wenn ja RS auf 0 setzen, Steuermodus ein else { P2=zeichen; // Zu sendendes Zeichen in Port 2 schreiben. EN=0; EN=1; // Übernahme des Zeichens im LCD warte(5); // Warten bis LCD stabil. RS=1; // RS auf 1 setzen, Datenmodus einschalten } return(zeichen); } void main (void) { initlcd(); clearnhome(); busychk(); move(2,1); busychk(); printf("Zeichenfehlt"); while(1); }