Einschaltinitialisierung des HD44780 LCD-Moduls

Ich verwende ein HD44780-Clone-LCD-Modul, ein KS0066U. Auf dem Modul funktioniert alles einwandfrei, außer wenn ich das Gerät schnell aus- und wieder einschalte (Ein-> Aus-> Ein). Aus irgendeinem Grund führt eine sehr kurze Unterbrechung der Stromversorgung dazu, dass das Anzeigemodul fälschlicherweise als 1-zeiliges LCD statt als 2-zeiliges LCD-Display initialisiert wird. Was würde dieses Verhalten verursachen? Gibt es eine Möglichkeit, dies per Software zu verhindern?

BEARBEITEN: Ich verwende den Display-Controller im 4-Bit-Modus, nicht im 8-Bit-Modus.

Es scheint, dass niemand Ihre Frage für wert gehalten hat, positiv abgestimmt zu werden, ziemlich seltsam.
Die Datenblätter für einige der HD44780-Klone sind ziemlich schlecht geschrieben. Mein Ziel war es, ein Gespräch darüber in Gang zu bringen, wie man sie richtig initialisiert. Vielleicht bin ich der einzige, der Probleme hatte, sie im 4-Bit-Modus zu verwenden.
Nein, ich habe gerade die gleichen Probleme im 4-Bit-Modus. Es ist ungefähr 15 Jahre her, seit ich das letzte Mal ein einfaches Zeichen-LCD programmiert habe, und ich erinnere mich, dass es in meiner Schulzeit eine echte Qual war, Fehler zu beheben. Ich bin aber noch nicht so weit wie Sie – ich kann nicht einmal die Initialisierung richtig hinbekommen, weil ich noch kein einziges Zeichen anzeigen kann. :)

Antworten (5)

Ich habe meinen Initialisierungscode so geändert, dass er das obere 4-Bit-Nibble des Funktionssatzbefehls zweimal sendet. Anschließend sende ich das obere 4-Bit-Nibble, gefolgt vom unteren 4-Bit-Nibble. Dies stimmt nicht mit dem Datenblatt überein, das darauf hinzudeuten scheint, dass Sie das obere 4-Bit-Nibble senden und dann den Funktionssatzbefehl obere 4-Bit gefolgt von unteren 4-Bit senden können.

// Funktioniert manchmal Pseudocode
port=0x20;
e=1; e=0;
port=0x20;
e=1; e=0;
port=0xC0;
e=1; e=0;

// Funktioniert immer Pseudocode
port=0x20;
e=1; e=0;
e=1; e=0;
port=0x20;
e=1; e=0;
port=0xC0;
e=1; e=0;

Ich vermute, dass Ihnen eine notwendige Verzögerung in Ihrer Initialisierungssequenz fehlt. Wenn das Display beschäftigt ist, wenn Sie versuchen, einen Befehl zu senden, wird dieser Befehl ignoriert. Wenn sich das Display zu Beginn Ihres Vorgangs im Vier-Bit-Modus befindet und gerade „0000“ als erste Hälfte eines Befehls eingegeben wurde, wird beim Eingeben von „0011“ auf dem Display der gesamte Befehl als „00000011“ angezeigt. , was dazu führt, dass das Display bis zu 1,6 ms beschäftigt ist.

Übrigens ist es gut, wenn möglich, die niederwertigen Datenleitungen von der Anzeige so zu verdrahten, dass, wenn ein "0011"-Befehl an die Anzeige gesendet wird, die gesamten 8 Bits, die von der Anzeige gesehen werden, einen Modus-Einstellbefehl bilden die für den von Ihnen verwendeten Anzeigetyp richtig ist. Dies hilft dabei, Anzeigestörungen zu vermeiden, wenn ein bereits verwendetes Display zurückgesetzt wird (das regelmäßige Zurücksetzen des Displays ist eine gute Idee, wenn es störungsfrei durchgeführt werden kann, da es sicherstellt, dass es behoben wird, wenn das Display irgendwie in einen schlechten Modus gerät selbst).

Ich habe einen Workaround für das Problem gefunden:

Ich habe beim Start eine Verzögerung von 1000 Millisekunden hinzugefügt, bevor der LCD-Controller initialisiert/konfiguriert wird. Es funktionierte ziemlich gut für mich.

Eine niedrigere Verzögerung (100, 200 ms) funktionierte nicht so gut. Nur eine Anmerkung: Es passierte nur im 4-Bit-Datenbus.

Viel Glück!

Durch Einfügen einer Verzögerung in Ihren Code, damit das LCD beim Einschalten lange genug Zeit hat, um beim Start zu initialisieren. Maximal einige hundert Millisekunden.

Sie können auch versuchen, die LCD-Stromversorgung an den Mikrocontroller anzuschließen und das LCD nach dem Start für eine Sekunde auszuschalten.

Habe bereits 100 ms Verzögerung beim Start
Probieren Sie dann meinen anderen Vorschlag aus. Sie könnten sogar die LCD-Stromversorgung direkt von einem Stift aus steuern; Es sollte nicht mehr als ein paar mA ziehen.
Gibt es wirklich eine maximal zulässige Verzögerung? Ich dachte, das Wichtigste bei diesen LCDs ist, dass Sie den Mindestbetrag warten, aber wenn Sie das Timing nicht richtig hinbekommen, können Sie auf Nummer sicher gehen und einfach länger warten.
@Dave, Sie haben "maximale Verzögerung" möglicherweise falsch interpretiert, es ist nur eine vernünftige Verzögerung, die ich empfehlen würde. Ein paar Stunden zu warten wäre zum Beispiel etwas extrem...
LOL! Nun, ich dachte mir, das meinten Sie, aber ich wollte sicherstellen, dass mir nichts fehlt, da ich mein LCD noch nicht initialisiert habe. Ich frage mich, ob ich mir einen Topf holen soll, um sicherzugehen, dass es nicht der Kontrast ist, der mich hier vermasselt. :)

Ich bin mir nicht sicher, ob das überhaupt hilft, aber ich habe mit dem KS0066U in einem Arduino-Projekt herumgespielt. Hier ist der Link .