Einschaltinitialisierung des HD44780 LCD-Moduls

10

Ich verwende ein HD44780-Klon-LCD-Modul eines KS0066U. Auf dem Modul funktioniert alles in Ordnung, 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 nicht ordnungsgemäß als 1-Zeilen-LCD anstelle eines 2-Zeilen-LCD-Displays initialisiert wird. Was würde dieses Verhalten verursachen? Gibt es eine Möglichkeit, dies in der Software zu verhindern?

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

mjh2007
quelle
Es scheint, dass niemand Ihre Frage für eine Abstimmung wert hielt, ziemlich seltsam.
Kortuk
Die Datenblätter für einige der HD44780-Klone sind ziemlich schlecht geschrieben. Mein Ziel war es, ein Gespräch darüber zu beginnen, wie man sie richtig initialisiert. Vielleicht bin ich der einzige, der Probleme hatte, sie im 4-Bit-Modus zu verwenden.
mjh2007
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 ein echtes Problem war, in der Schule Fehler zu beheben. Ich bin jedoch nicht so weit wie Sie - ich kann nicht einmal die Initialisierung richtig machen, weil ich noch kein einziges Zeichen anzeigen kann. :)
Dave

Antworten:

4

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

// Funktioniert manchmal Pseudo-Code
port = 0x20;
e = 1; e = 0;
Port = 0x20;
e = 1; e = 0;
port = 0xC0;
e = 1; e = 0;

// Funktioniert die ganze Zeit Pseudo-Code
port = 0x20;
e = 1; e = 0;
e = 1; e = 0;
Port = 0x20;
e = 1; e = 0;
port = 0xC0;
e = 1; e = 0;

mjh2007
quelle
2

Ich vermute, dass Ihnen eine notwendige Verzögerung in Ihrer Initialisierungssequenz fehlt. Wenn die Anzeige beim Versuch, einen Befehl zu senden, belegt ist, wird dieser Befehl ignoriert. Wenn sich die Anzeige zu Beginn Ihrer Prozedur im Vier-Bit-Modus befindet und gerade "0000" als erste Hälfte eines Befehls getaktet wurde, wird beim Anzeigen der Uhr "0011" der gesamte Befehl als "00000011" angezeigt. Dadurch ist das Display bis zu 1,6 ms lang besetzt.

Im Übrigen ist es gut, wenn möglich, die Datenleitungen niedriger Ordnung von der Anzeige so zu verdrahten, dass beim Senden eines "0011" -Befehls an die Anzeige die gesamten 8 Bits, die von der Anzeige gesehen werden, einen Modus-Set-Befehl bilden Dies ist korrekt für die Art der Anzeige, die Sie verwenden. Auf diese Weise können Sie Störungen beim Zurücksetzen eines bereits verwendeten Displays vermeiden (ein periodisches Zurücksetzen des Displays ist eine gute Idee, wenn dies problemlos möglich ist, da dadurch sichergestellt wird, dass das Display in einen schlechten Modus versetzt wird selbst).

Superkatze
quelle
1

Ich habe eine Problemumgehung für das Problem gefunden:

Ich habe beim Start eine Verzögerung von 1000 Milisekunden hinzugefügt, bevor ich den LCD-Controller initialisiert / konfiguriert habe. Es hat ziemlich gut für mich funktioniert.

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

Viel Glück!

Eduardo Brandt
quelle
0

Wenn Sie eine Verzögerung in Ihren Code einfügen, damit das LCD beim Einschalten lang genug ist, um beim Start initialisiert zu werden. 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.

Thomas O.
quelle
Habe
Versuchen Sie dann meinen anderen Vorschlag. Sie können die LCD-Leistung sogar direkt über einen Pin steuern. es sollte nicht mehr als ein paar mA ziehen.
Thomas O
Gibt es wirklich eine maximal zulässige Verzögerung? Ich dachte, die Hauptsache bei diesen LCDs ist, dass Sie die Mindestmenge warten, aber wenn Sie das Timing nicht richtig einstellen können, können Sie auf Nummer sicher gehen und einfach länger warten.
Dave
@ Dave, Sie haben möglicherweise "maximale Verzögerung" 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 ...
Thomas O
LOL! Nun, ich dachte, das haben Sie gemeint, aber ich wollte sicherstellen, dass mir nichts entgeht, da ich mein LCD noch nicht initialisiert habe. Ich frage mich, ob ich mir einen Topf schnappen sollte, um sicherzugehen, dass es nicht der Kontrast ist, der mich hier vermasselt. :)
Dave
0

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

ThaKidd KG5ORD
quelle