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.