Hallo Forum, ich habe versucht mit dem LCD-Tutorial ein 4x20 Zeichen Display anzusteuern. Irgendwie will das Teil nicht so wie ich. Im Anhang ist das Datenblatt. Nach dem 12. Zeichen schreibt das Display gleichzeitig in die erste und zweite Zeile. Statt dem Scrollen fängt das Display irgendwan, nachdem einige Zeichen verloren gehen wieder oben an. Hier meine Initialisierungsroutine: lcd_init: ldi temp3,50 powerupwait: rcall delay5ms dec temp3 brne powerupwait ldi temp1, 0b00000011 ;muss 3mal hintereinander gesendet out PORTB, temp1 ;werden zur Initialisierung rcall lcd_enable ;1 rcall delay5ms rcall lcd_enable ;2 rcall delay5ms rcall lcd_enable ;und 3! rcall delay5ms ldi temp1, 0b00000010 ;4bit-Modus einstellen out PORTB, temp1 rcall lcd_enable rcall delay5ms ldi temp1, 0b00101010 ;noch was einstellen... rcall lcd_command ldi temp1, 0b00001101 ;...nochwas... rcall lcd_command ldi temp1, 0b00000100 ;endlich fertig rcall lcd_command ret ...wie gesagt, das meiste aus dem Tutorial. Was ist hier falsch ?
Hi... Bei 4x20 musst du erstmal ermitteln, welche Ausgabeposition welchem Speicherbereich entspricht. Scrollen dürfte nicht so sinnvoll sein, der Controller kann (glaube) nur 80 Zeichen adressieren. Da ich kein 4x20 habe, habe ich auch kein Datenblatt griffbereit, weiß daher auch nicht, welche Zeile welchem Speicherbereich zugeordnet ist. ...
Hallo HanneS... alles was ich an Datenblatt zu dem Display gefunden habe, ist im Anhang meines ersten Postings. Aus dem Bereich Adressregister in der Befehlstabelle werde ich nicht schlau. Meine Timer-Routine habe ich übrigens umgebaut. Um die Subroutinen ausserhalb des Interrupts komme ich aber nicht herum, da ich das UART benutze und hier öfters warten muss. Aber nun zurück zu meinem Display. muss ich dann etwa jeden Buchstaben explizit platzieren? Das muss doch einfacher möglich sein :-(
Sorry, PDFs mag mein Browser (aus gutem Grund) nicht. Und Downloaden und separat öffnen mach ich eigentlich nur, wenn ich es selbst brauche, was für die meisten Forum-Anhänge nicht zutrifft. Das Display hat Auto-Increment. Du legst die Position des ersten Zeichens fest und gibst dann den Rest der Zeile aus. Bei Zeilenwechsel legst du wieder zuerst die Ausgabeposition fest (Kommando Set DD-RAM-address) und schreibst dann munter drauflos. ...
Hmm... Im Grunde gebe ich dem Display am Start vor, dass der Cursor an den Anfang, resp. oben links steht. Dann schreibe ich drauf los, habe aber dann ab dem 13.Zeichen Dieses bereits in der Zweiten Zeile (zusätzlich zur Ersten). D.h. nach dem Initialisieren schicke ich dem Display eine 1 und lösche es damit. Ausserdem wird der Cursor laut Datenblatt auf die home-position gesetzt.
Sorry, ich bezog mich auf den Controller HD44780. Dein Display hat aber den Controller KS0073. (stellte ich nach Lesen deines PDFs fest) Damit habe ich noch keinerlei Erfahrung. ...
Warte mal... die hatten doch geschrieben, dass der kompatibel ist :-( Na toll. Wo bekomme ich denn jetzt etwas mehr Infos her ? Oder sollte das reichen, was im Datenblatt steht ?
So, das passt jetzt. Ich musste erst das NW-Bit setzen, damit das Display weiß, dass es 4-Zeilig ist. Das einzige, was jetzt noch nicht klappern will ist das scrollen, obwohl es dafür diverse Einstellungen gibt :-( Hat vielleicht schon mal jemand so einen KS0073 programmiert ? Woher weiß ich, wann das Display voll ist um es eventuell zu löschen ? Wie kann man einem solchen Display sagen, dass es in der nächsten Zeile weiter geht ? Fragen über Fragen....
...denkste passt jetzt... Einmal aus und an, nix mehr. Ich glaube das Problem liegt beim Enable-Bit. Wenn ich das Datenblatt richtig verstehe, gibt es Befehle mit und ohne Enable. Wie kann denn dann das Display wissen, wann es ohne Enable Daten empfangen muss ? Irgendwie habe ich das Gefühl, dass das Teil den anliegenden Port fehlinterpretiert, sobald das E-Bit abfällt. Kann mir das mal jemand erklären ?
Von Befehlen ohne Enable hab ich noch nie gehört. Ich hab mal ein besseres Datenblatt für dich.
das habe ich auch mittlerweile gefunden... Aber auch da ist immer von Befehlen mit RE-Bit =0 und RE-Bit=1 die Rede. Das ist aber doch das Enable-bit. Oder ?
Nö, wie ich das mal kurz überflogen habe, ist RE ein Bit in einem Register, welches gesetzt werden muss, um in den extended function mode zu kommen. Nachdem die extended functions gesetzt sind, löscht man das Bit wieder. Aber wie gesagt, ich habs nur überflogen.
Kein Pin, ein Bit! Bit 2 bei Function Set (Table 10 Seite 39)=1 Danach schreibt man Extended F.Set (S. 38) auf 4-Line-Mode. Danach Bit 2 F.Set wieder =0.
Aaahhh... Jetzt dämmerts. Ist die Reihenfolge der Befehle eigentlich grundsätzlich egal ?
So, jetzt hab ich es einigermaßen im Griff. Das einzige, wo ich noch nicht hinter gekommen bin: wie kann ich einen Zeilenumbruch programmieren ? Wie kann das Display gescrollt werden ?
Es gibt keinen Zeilenumbruch wie CR+LF. Man setzt den Cursor an die entsprechende RAM-Adresse. Steht in deinem Datenblatt auf Seite 3 rechts oben. Der Scrollbefehl ist in der Befehlstabelle beschrieben.
Was macht denn dann der Scrollbefehl ? Egal was ich mache, da ist nix auf'm Display anders als vorher. Ich würde gerne alles nach oben scrollen, sobald die vierte Zeile voll ist. Mit dem Zeilenumbruch ist ja ganz nett aber woher weiß ich, in welcher Zeile der Cursor grade steht ?
entweder "mitzählen" oder auslesen! Die genauen befehle weiss ich jetzt leider nicht
Hi... Vertikales Scrollen gibt es nicht. Nur Horizontales. Inwieweit dein Display das kann, weiß ich nicht. Das Scrollen beruht (zumindest beim Controller HD44780) darauf, dass für jede Zeile mehr Speicher zur Verfügung steht, als Anzeigepositionen vorhanden sind. Man kann die Anzeigepositionen als "Fenster" über den Display-RAM verstehen. Dummerweise verschieben sich aber bei mehrzeiligen LCDs immer alle Zeilen gleichzeitig. Dir wird nix weiter übrig bleiben, als das LCD nach der Methode "Locate / Print" anzusteuern, also zuerst die Ausgabeposition zu setzen (DD-RAM-Address) und danach die Zeichen einer Zeile auszugeben. Vor jeder neuen Ausgabe einer Zeile (oder einer Zahl an einer fixen Position) ist dann der Schreibcursor (DD-RAM-Address) erneut zu positionieren. Das LCD lässt sich also nicht hintereinander weg mit Text beschreiben, ähnlich des PRINT-Befehls in BASIC oder der Ausgabe auf einem (Zeilen-) Drucker. Ist vielleicht schade, ist aber so... ...
Display Shift/Scrollen: Schau mal im ausführlichen Datenblatt auf Seite 14 und 18. Dort ist der Mechanismus aufgezeigt. Auf Seite 32 & 33 ist das Shiften aller oder einzelner Zeilen beschrieben. Ein hochscrollen der Zeilen gibt es nicht. Dazu müssen die Zeilen neu geschrieben werden.
stimmt, ist schade... Zum Mitzählen muss ich sagen, dass meine Register langsam knapp werden. Wie macht man das erst bei wirklich großen Programmen ? Gibt's da mehr als r0-r31 in größeren MC's? Na ja, im Moment macht mir mein UART auch noch viel mehr sorgen. Da mir meine Pins langsam knapp werden, versuche ich mal das Display über SPI anzusteuern. Danke Euch auf jeden Fall erstmal. By the way, HanneS. Hab mal versucht den Großteil meines Programmes in die Timer0 ISR zu schieben aber irgendwie wird das zu viel, zumal ich beim UART relativ hohe Wartezeiten hab. Ich hab dafür aber schon versucht in einem anderen Threat Hilfe zu bekommen. Mal sehn, was draus wird.
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.