hi,
LCD Display gekauft und Probleme...
War nicht anders zu erwarten...
Vor ca. 15 Jahren habe ich schon mal eines im 8-Bit Modus angesteuert.
Das hat gut funktioniert.
Nun habe ich mir ein 4*20 Display von Reichelt gekauft:
file:///E:/DMC/Makrolon-Stirnseitenbeleuchtung/Bauteile/LCD%20Modul%20-%20LCD%20204B%20BL%20%20LCD%20Dot-Matrix-Modul%204x20%20Zeichen,%20blau/LCD%20204B%20BL%20Dot-Matrix-Modul.htm
* LED Hintergrund angeschlossen; funktioniert.
* Spannung und Poti für den Kontrast; einwandfrei
* Restliche Leitungen wie im Datenblatt:
Nun wollte ich das Teil mit folgendem Programm im 4-Bit Modus initialisieren und ein "A" ausgeben.
Code:
$regfile = "m168def.dat" 'Compilerdefinition
$crystal = 16000000 'Quarzfrequenz
'Ports initialisieren:
Ddrb = &B00000000 'PB alle Eingang
Ddrc = &B00111111 'PC 7 & 6 Eingang; 5-0 Ausgang
'C0=DB4; C1=DB5; C2=DB6; C3=DB7
'C4=E; C5=RS (0=Initialisieren; 1=Daten)
Ddrd = &B00000000 'PD3, PD5 & PD 6 Ausgang; Rest Eingang
'----------------------------------------------------------------------------------------------------
'LCD
'C0=DB4
'C1=DB5
'C2=DB6
'C3=DB7
'C4=E (Daten werden bei fallender Flanke übernommen)
'C5=RS (0=Initialisieren; 1=Daten schreiben)
'R/W permanent auf LOW; Zeichen schreiben - HIGH = Zeichen vom Display lesen.
'LCD initialisieren:
Portc = &B00010010 ' 4 Bit Modus
Waitms 10
Portc = &B00000010 'E auf LOW (PORTC.4)
Waitms 10
Portc = &B00010010 '4Bit Datenlänge; Einzeiliges Display; 5x7 Font - HIGH BYTE
Waitms 10
Portc = &B00000010 'E auf LOW (PORTC.4)
Waitms 10
Portc = &B00010000 ' LOW BYTE
Waitms 10
Portc = &B00000000 'E auf LOW (PORTC.4)
Waitms 10
Portc = &B00010000 'Display ein; Cursor ein; Cursor blinken - HIGH BYTE
Waitms 10
Portc = &B00000000 'E auf LOW (PORTC.4)
Waitms 10
Portc = &B00011111 ' LOW BYTE
Waitms 10
Portc = &B00001111 'E auf LOW (PORTC.4)
Waitms 10
Portc = &B00010000 'Display löschen: Cursor auf 1. Spalte von Zeile 1 - HIGH BYTE
Waitms 10
Portc = &B00000000 'E auf LOW (PORTC.4)
Waitms 10
Portc = &B00010001 ' LOW BYTE
Waitms 10
Portc = &B00000001 'E auf LOW (PORTC.4)
Waitms 10
'Zeichen Uebertragen 'Zeichen "A" übertragen (HEX 65) & RS =1 (Port C5)
Portc = &B00110100 ' HIGH BYTE
Waitms 10
Portc = &B00100100 'E auf LOW (PORTC.4)
Waitms 10
Portc = &B00110001 ' LOW BYTE
Waitms 10
Portc = &B00100001 'E auf LOW (PORTC.4)
Waitms 10
End 'end program
Die übertriebenen 10ms Pause zwischen den einzelnen Befehlen sind erstmal zur Sicherheit, damit es keine Timingprobleme gibt.
Ich schreibe zuerst das HIGH-Byte in den Port "C"
Dabei ist E (PortC.5) = HIGH
Dann wird das gleiche High-BYTE mit E = LOW nochmal geschrieben.
Bei fallender Flanke sollten die Daten übernommen werden.
Das selbe Spiel mit dem LOW-Byte.
Leider tut sich nichts.
Das Display funktioniert.
Bei einem Test gingen bei der Datenübertragung zum AVR die einzelen Matrixfelder der Reihe nach an.
Was mache ich falsch? Ich denke mal es liegt an der Initialisierung (ist nach dem Datenblatt).
Code:
INITIALISIERUNGSBEISPIEL FÜR DEN 4-BIT MODUS
RS=0; R/W=0
DB7 - DB4
0 0 1 0 4-Bit Datenlänge einschalten (noch im 8-Bit Modus)
0 0 1 0 4-Bit Datenlänge, 1-zeiliges Display, 5x7 Font
0 0 0 0
0 0 0 0 Display ein, Cursor ein, Cursor blinken
1 1 1 1
0 0 0 0 Display löschen, Cursor auf 1. Spalte von 1. Zeile
0 0 0 1
0 0 0 0 Cursor Auto-Increment
0 1 1 0
Was ich noch versuchte:
* Eine vertauschte Reihenfolge von HIGH- und LOW-BYTE Übertragung
* Port C4 (Enable am Display) separat auf LOW zu schalten
* Port C4 (Enable am Display) mit dem Befehl "Toggle" zweimal umzuschalten
brachte keinen Erfolg
Nach der Initialisierung sollte doch der Blinkende Cursor auf POS: 1.1 im Display zusehen sein?
Der Kontrast war eben so eingestellt, daß ich die 5x7 Quadrate sehen konnte.
Ein Zeichen/Cursor sollte also auf jeden Fall sichtbar sein.
Die Hintergrundbeleuchtung war ebenfalls eingeschaltet.
Nun stehe ich ein wenig auf dem Schlauch; bin erstmal am Ende meines begrenzten "Latein´s"...
liebe Grüße,
Klingon77
Lesezeichen