Hallo Zusammen, hier ist ein Stück eines Programmes die ich verstehen will aber schwierigkeiten habe. Mein Problem liegt daran, ich verstehe nicht warum er für die Funktionen clear_display: P0=0x01, shift_links: P0=0x10, shift_recht: P0=0x14, return_home: P0=0x02 und ausgabe: P0=aus hinschreibt? void init_display(void) // Display initialisieren { char i=0; // Hilfsvariable // Array für Grundeinstellung unsigned char array[7]={0x30,0x30,0x30,0x30,0x0e,0x01,0x06}; pause(1500); // Warten >15ms for(i=0;i<7;i++) // Schleife für Initialisierung { P2_7=1; // Enable auf 1 setzen P2_5=0; // RS auf Code Input P2_6=0; // R/W auf Write pause(500); // Warten >4.1ms P0=array[i]; // Daten an LCD anlegen pause(120); // Warten >450ns P2_7=0; // Enable auf 0 setzen pause(120); // Warten >450ns } } void intro (void) // Intro schreiben { unsigned char i; // Hilfsvariable unsigned char intro[16]={"Arbeit"} @ xdata; for(i=0;i<16;i++) ausgabe (intro[i]); // Ausgabe Intro pause(150000); // Pause für Intro-Anzeige } void clear_display (void) // Display löschen { P2_7=1; // Enable auf 1 setzen P2_5=0; // RS auf Code Input P2_6=0; // R/W auf Write P0=0x01; // Default (Clear Display) pause(120); // Warten >450ns P2_7=0; // Enable auf 0 setzen pause(120); // Warten >450ns } void clear_zeichen(void) // Zeichen löschen { shift_links(); // Cursor nach links verschieben ausgabe(0xa0); // Ausgabe Leerzeichen } void shift_links (void) // Cursor nach links verschieben { P2_7=1; // Enable auf 1 setzen P2_5=0; // RS auf Code Input P2_6=0; // R/W auf Write P0=0x10; // Shift links pause(120); // Warten >450ns P2_7=0; // Enable auf 0 setzen pause(120); // Warten >450ns } void shift_rechts (void) // Cursor nach rechts verschieben { P2_7=1; // Enable auf 1 setzen P2_5=0; // RS auf Code Input P2_6=0; // R/W auf Write P0=0x14; // Shift rechts pause(120); // Warten >450ns P2_7=0; // Enable auf 0 setzen pause(120); // Warten >450ns } void return_home(void) // Dispaly zum Zeilenanfang { P2_7=1; // Enable auf 1 setzen P2_5=0; // RS auf Code Input P2_6=0; // R/W auf Write P0=0x02; // Zeilenanfang pause(120); // Warten >450ns P2_7=0; // Enable auf 0 setzen pause(120); // Warten >450ns } void bf_display(void) // Busy-Flag abfragen { unsigned char a; // Hilfsvariable do // Warteschleife { P2_7=1; // Enable auf 1 setzen P2_5=0; // RS auf Code Input P2_6=1; // R/W auf Read pause(120); // Warten >450ns P2_7=0; // Enable auf 0 setzen pause(120); // Warten >450ns a=P0_7; // Busy-Flag abfragen }while(a!=0); // Warteschleife } void ausgabe(unsigned char aus) // Daten auf Display ausgeben { bf_display(); // Busy-Flag Abfrage P2_7=1; // Enable auf 1 setzen P2_5=1; // RS auf Data Input P2_6=0; // R/W auf Write P0=aus; // Daten an LCD anlegen pause(120); // Warten >450ns P2_7=0; // Enable auf 0 setzen pause(120); // Warten >450ns P0=0; // Datenbits zurücksetzen } void pause(unsigned long warten) // Delay { unsigned long i=0; // Hilfsvariable for(i=0;i<=warten;i++); // Warteschleife } void send_char(char C) // Senden über die UART { while(!TI); TI = 0; SBUF = C; }
Das liegt an den Befehlen, die der Controller im LCD Display versteht.
Wenn man ihm z.B. am Datenport (und der ist offensichtlich mit dem Port
P0 des Mikrocontrollers verbunden) den Hexwert 01 schickt, dann wird das
>Display gelöscht.
Analoges gilt für die Schiftbefehlt.
Im Falle ausgabe, wird die Variable, die der Routine als Parameter
übergeben wirdan den datenport gelegt.
Du mußt die, um das zu verstehen entwerder das datenbaltt des LCD
Controllers (schwere Kost) oder das LCD Tutorial auf dieser Site
ansehen. Wenn du verstanden hast, wie das Display angesteuert wird,
dann ist das verständnis des C-Programms einfach.
Viel Glück
Remo
also ich habe mir heute auch ein display gekauft und ("als 4 bit variante") angeschlossen. Nachdem ich einfach mal so eingeschaltet hab, zeigt mein 2x16 Display nur in der unteren Zeile ausgefüllte Felder, in der oberen nichts. Kann das sein, oder ist es defekt?
Enable auf 1 setzen? Hallo erstmal. Was mir auffällt: Ein HD44780 hat kein Enable-Eingang. Der E-Pin wird beschrieben als "Starts data read/write". Somit fällt die Prozedur folgendermaßen aus: 1. E = 0 2. Anlegen der Daten/Steuerleitungen, d.h. RS, R/W und mindestens DB4 bis DB7 ausgeben; im 8-bit-Betrieb natürlich DB0 bis DB7 3. E = 1 4. mind. 450 ns warten 5. E = 0 6. Befehlausführungsende abwarten. Entweder pollen, oder stupide warten Gruß Marco -
also ich verwende die Peter Fleury's LCD-Library, allerdings steht bei mir alles aufr dem Kopf, hab ich das Display falschrum eingebaut oder ist das eine Softwaresache?! Im Moment steht die Beschriftung des Displays (z.B. Pinning) aufm Kopf, in Bezug auf die Displayausgabe. Muss das nicht gleich sein?!
Eigentlich sollte nicht die Beschriftung der Platine, sondern die Anzeige auf dem Display maßgeblich sein. Die ASCII-Zeichen sind ja ohnehin in den Controller auf der Platine einprogrammiert, somit kann es eigentlich keine "Softwaresache" sein. Man sagt dem Controller ja nur "Zeige Zeichen XX an!". Deshalb sollte man vielleicht doch besser vorm Einbau mal ausprobieren, wie rum es richtig ist!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.