hallo,
will ein LCD-Display ansteuern, habe nun gerade nach dem Datenblatt die
Init geschrieben, nun möchte ich mit der schreib Funktion Anfangen.
Nun stehe ich vor einem Problem und zwar muss ich ja zuerst die DD-RAM
Adresse setzen dazu steht im Datenblatt:
Set DDRAM address: RS = L, RW = L, DB7 = H, DB6 = AC6, DB5 = AC5, DB4 =
AC4, DB3 = AC3, DB2 = AC2, DB1 = AC1, DB0 = AC0
Also mit L ist ja Low gemeint also 0, mit H High also 1,
nur was soll ich dann bei AC0 - 6 machen? 0 oder 1 ?
Hallo,
naja, vielleicht Datenblatt auch verstehen? ;-)))
AC6...AC0 ist die gewünschte DDRAM-Adresse, an der Du demnächst ein
Zeichen anzeigen willst.
Die Zuordnung der Adressen zur Darstellung im Display (Zeile, Position)
steht auch irgendwo im Datenblatt.
Bei HD44xxx-kompatiblen meist Zeile 1 ab 0x00, Zeile 2 ab 0x40 usw.
0x00 -> 00000000
0x40 -> 01000000
DB0...DB6 davon sind Deine Bits für AC0...AC6.
AC soll wohl Adress-Counter heißen oder so.
Gruß aus Berlin
Michael
Man kann die Fliege auch mit dem Elefanten erschlagen ;)
E muss ein- und wieder ausgeschaltet werden nachdem das Datenbyte
angelegt wurde. Dann muss eine Pause mindestens 40µs, sehr wichtig,
folgen.
Was ich nicht verstehe:
DIESE Frage wird hier im Forum doch inzwischen so zirke 5mal pro Woche
gestellt. Und immer wieder geduldig von irgendjemandem beantwortet.
Ich habe dazu selber schon einen kompletten funktionierenden Code
gepostet.
Aber trotzdem, immer wieder neu: "Wie geht LCD-Ansteuerung?"
Meine Antwort: Ohne RTFM und für 2Cent Phantasie sowieso nicht.
Und keine Bange, ich werde mich nie wieder in dieses Thema einschalten.
Gruß Johannes
Hallo,
@Johannes A.:
ich verstehe es auch nicht.......
Datenblatt Controller
Timingdiagramm lesen und verstehen!
E ist der Übernahme-Eingang.
Der ist immer L
Dann Daten und RS und RW passend setzen
DANN E auf H, mindestens ca. 750ns auf H lassen, dann wieder auf L
Während E auf H ist, müssen Daten, RS, RW stabil am Display anliegen.
Dann gibt es noch Haltezeiten vor und nach dem E-Impuls, die sind aber
bei üblichen AVR-Taktfrequenzen unkritisch.
Außerdem fällt es sehr schwer Deinen Code zu lesen. Schau Dir mal
einfach an, wie andere es machen. Mache Dinge sind in einer Zeile
zusammen merklich lesbarer.
Du steuerst das Display im 8-Bit-Mode an. Da kannman das Datenwort doch
eher in eine OUT-Anweisung zusammenfassen.
Wenn ich ein "A" ans Display schicken will, schicke ich doch auch ein A
und zerlege es nicht erst in einzelne Bits.
Auch schon hundertmal geschrieben: die 0-Schieberei ist witzlos.
PORTB |= (0 << D0);
PORTB |= (0 << D1);
PORTB |= (1 << D2); // Display On Wieso hier Font auf 5x10`?
PORTB |= (0 << D3); // 1 Line Mode Warum? Ich denke, Du hast ein 2x16???
PORTB |= (1 << D4);
PORTB |= (1 << D5);
PORTD |= (0 << D6);
PORTD |= (0 << D7);
PORTB = 0x34; // Display On, 1 Zeile
finde ich lesbarer.
Gruß aus Berlin
Michael
darf man fragen warum du deine datenleitungen auf PB und PD
aufsplittest? unkomfortabler geht es wirklich nicht.
du solltest dafür sorgen, dass du erst deine daten anlegst und dann
executest.
pumpkin
@Michael
Danke!
und @Christian D.
Sorry, aber wenn Du DIESEN Code nicht selber langsam echt krank findest,
wird Dir wohl kaum noch jemand helfen können...
Und Tschüss
Johannes