Hallo
ich hab wieder mal ein Problem mit meinem LCD Display.
wie schaffe ich es denn das ich einen Text zum Beispiel in Zeile 2 oder
Zeile 4 ausgeben kann ?
Muss ich hierfür den Befehl Set CG RAM Address
Set DD RAM Address
oder den shift cursor/display
verwenden ?
Falls es wichtig ist ich verwende das "berühmte" pollin wintek wd2704
Display
Vielen Dank schonmal
Die Ausgabeposition setzt man bei HD44780-Controllern oder
ähnlichen mit 0b1..., also DRAM Address Set.
Mit CGRAM... kann man Zeichen definieren.
Näheres sollte im Datenblatt stehen, das musst du selber lesen,
da meine Suche bei Pollin nach wd2704 ergibt:
> Suchergebnis> Ihre Suche nach "wd2704" ergab 0 Ergebnisse.
>wie schaffe ich es denn das ich einen Text zum Beispiel in Zeile 2 oder>Zeile 4 ausgeben kann ?
Das WD2704 sind eigendlich zwei Displays in einem. Du hast also ZWEI
Controller, wobei der erste Zeile 1 und 2, und der zweite Zeile 3 und 4
bediennt. Ich habe dafür ein Unit in mikroPascal geschreiben. Falls du
Interesse daran hast, um sie nach z.B. C zu übersetzen, melde dich
einfach.
Im Prinzip wird 2x initialisiert.
Wenn es ein 4x40 ist, steht hier im Forum auch eine C++-Version
von mir, die das bedient.
Nur bei 4x40 hat es zwei Controller.
Ohne Datenblatt ist das aber alles Spekulation, und ich habe
keine Lust das zu suchen.
Das Ding ist ncht so berühmt, daß ich es hier liegen habe...
Stefan Friedrich schrieb:> wie schaffe ich es denn das ich einen Text zum Beispiel in Zeile 2 oder> Zeile 4 ausgeben kann ?
Die üblichen HD44780-Controller unterstützen nur zwei Zeilen zu je 40
Zeichen. Die zweite Zeile fängt dabei ab Adresse 64 an.
Bei Displays bis 20*4 wird meistens die interne Zeile 1 in Zeile 1 und 3
und die interne Zeile 2 in Zeile 2 und 4 ausgegeben, dh die
Startadressen für den DRAM Address Set Befehl lauten: (X=Zeichen in
einer Zeile, dh. 16 oder 20)
Z 1: 0
Z 2:64
Z 3:X
Z 4:64+X
Bei größeren Displays bis 40*4 sind zwei getrennte Controller mit
getrennten Chip-Select Leitungen vorhanden, einer für die obere und
einer für die untere Hälfte.
Z 1: 0 (1. C.)
Z 2:64 (1. C.)
Z 3: 0 (2. C.)
Z 4:64 (2. C.)
fchk
Wow :) Danke für die vielen Antworten.
Also es ist ein 4* 27 Display
Das hier ist das Datenblatt
http://s-frei.de/online/microcontroller/Projekte/LCD/Doku%20SF/Beschaltung%20LCD-Display-HC12.pdf
Die initialisierung hat auch bis jetzt ganz gut funktioniert nur als ich
eben statt zeile 1 un 3 die Zeilen 2 und 4 bedienen wollte kamen die
zeichen überall raus nur nicht da wo sie sollten.
line1: ldi temp1, 0b10000000
rcall lcd_command
rcall delay5ms
ret
line2: ldi temp1, 0b11000000
rcall lcd_command
rcall delay5ms
ret
line3: ldi temp1, 0b10000000
rcall lcd_command1
rcall delay5ms
ret
line4: ldi temp1, 0b11000000
rcall lcd_command1
rcall delay5ms
ret
Das sind meine Zeilensprung Commands so wie ich sie mir aus dem
Datenblatt rausgelesen hab, allerdings funktionierts damit irgendwie
nicht wirklich
Wie schon gesagt:
Bei mehr als 4x20 musst du zweimal initialisieren (einmal mit
der Enable1-Leitung, einmal mit Enable2) und zum Positionieren und
Ausgeben musst du wieder bei Zeile 1 und 3 Enable1 bedienen, bei
2 und 4 dann Enable2.
Wie zwei getrennte LCD.
Beide habe ihre eigene Initialisierung, ihre aktuelle Position,
ihren eigenen Speicher...
Klaus Wachtler schrieb:> Wie schon gesagt:> Bei mehr als 4x20 musst du zweimal initialisieren (einmal mit> der Enable1-Leitung, einmal mit Enable2) und zum Positionieren und> Ausgeben musst du wieder bei Zeile 1 und 3 Enable1 bedienen, bei> 2 und 4 dann Enable2.
Das ist mir klar und das habe ich auch in lcd_routines_new.asm so
gemacht.
Es funktioniert auch solange ich meinen Text nur in Zeile 1 und 3
ausgebe.
Mein Problem ist das ich es nicht schaffe mit den Commands so wie ich
sie aus dem Datenblatt verstanden hab in die 2. oder 4. Zeile zu
springen.
PS: weiß jetzt aus dem Kopf nicht, ob 1. und 2. vom
ersten Controller bedient werden und 3.+4. vom zweiten, oder 1.+3.
vom ersten und 2.+4. vom zweiten.
>> Ausgeben musst du wieder bei Zeile 1 und 3 Enable1 bedienen, bei>> 2 und 4 dann Enable2.>> Das ist mir klar und das habe ich auch in lcd_routines_new.asm> so gemacht.
Eigentlich hast du das nicht so gemacht.
line2: ldi temp1, 0b11000000
rcall lcd_command
rcall delay5ms
ret
Probier einfach mal kleiner Offsets als 64
Die LCD sind da nicht ganz einheitlich.
Die Sache wird einfacher, wenn man einfach mal in Zeile 1 zu schreiben
anfängt, und dann gaaaaanz viele Zeichen ausgibt. Irgednwann tauchen
dann ganz von alleine in der (für diesen Controller) 2. Zeile die
Zeichen wieder auf.
Gibt man aus "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg.." (du hast die Idee),
dann braucht man sich nur ansehen, welches das erste Zeichen in der (für
diesen einen LCD-Controller) 2ten Zeile ist und man hat dann den Offset
bestimmt.
PS: Deine Push und pop un den Command Funktionen sind durcheinander
gekommen.
Bei meinem 4x40 ist Controller 1 für die ersten beiden Zeilen,
Controller 2 für die 3.+4. zuständig.
Nachdem bei dir 2. und 4. nicht gehen, würde ich auf falsche
Adressen tippen - falls es bei deinem Controller genauso ist.
Ich habe aber wie gesagt kein Datenblatt dazu, deshalb mit Vorbehalt.
Klaus Wachtler schrieb:> PS: weiß jetzt aus dem Kopf nicht, ob 1. und 2. vom> ersten Controller bedient werden und 3.+4. vom zweiten, oder 1.+3.> vom ersten und 2.+4. vom zweiten.
Also laut Datasheet sollte E1 für Zeile 1 und 2 zuständig sein und E2
für Zeile 3 und 4 .
Was auch so aussieht wenn ich nur Zeile 1 und 3 benutze.
Klaus Wachtler schrieb:> Um in die 2. oder 4. zu springen nimmst du auch das zweite Enable?> Ebenso für die Ausgabe der Zeichen dann?
Für Zeile 1 und 2 benutze ich init , command und data befehl welche
immer den ersten Controller ansprechen
Für Zeile 3 und 4 benutze ich init1, command1 und data1 befehl welche
immer den zweiten Controller ansprechen.
Klaus Wachtler schrieb:> Wenn du enable richtig bedienst und kommst trotzdem nicht in die> richtigen Stellen, dann hast du nicht die richtigen Adressen im> DDRAM erwischt.
Das ist auch meine Befürchtung allerdings habe ich auch schon einiges
dahingehend ausprobiert und werd aus den Resultaten nicht schlau .
Stefan Friedrich schrieb:> Klaus Wachtler schrieb:>> PS: weiß jetzt aus dem Kopf nicht, ob 1. und 2. vom>> ersten Controller bedient werden und 3.+4. vom zweiten, oder 1.+3.>> vom ersten und 2.+4. vom zweiten.>> Also laut Datasheet sollte E1 für Zeile 1 und 2 zuständig sein und E2> für Zeile 3 und 4 .> Was auch so aussieht wenn ich nur Zeile 1 und 3 benutze.
OK.
Das bedeutet also, du kannst von jedem Controller seine jeweils erste
Zeile korrekt ansteuern.
> Das ist auch meine Befürchtung allerdings habe ich auch schon einiges> dahingehend ausprobiert und werd aus den Resultaten nicht schlau .
Wie schon weiter oben ausgeführt:
konzentrier dich erst mal nur auf 1. Controller.
Den lässt du Zeichen ausgeben (aber verschiedene). Und zwar beginnend in
der ersten Zeile. Die werden natürlich am rechten Rand rausgehen. Aber
irgendwann wird der Controller anfangen auch die 2te Zeile zu
beschreiben. Du musst jetzr nur dein Zeichen so wählen, dass du
eindeutig aus dem ersten sichtbaren Zeichen in der 2ten Zeile bestimmen
kannst, welchen Offset dein LCD-Controller tatsächlich benutzt. Oft ist
das 0x40, so wie du das eingetragen hast. Aber manchmal ist es das eben
nicht.
Karl heinz Buchegger schrieb:> Wie schon weiter oben ausgeführt:> konzentrier dich erst mal nur auf 1. Controller.> Den lässt du Zeichen ausgeben (aber verschiedene). Und zwar beginnend in> der ersten Zeile. Die werden natürlich am rechten Rand rausgehen. Aber> irgendwann wird der Controller anfangen auch die 2te Zeile zu> beschreiben. Du musst jetzr nur dein Zeichen so wählen, dass du> eindeutig aus dem ersten sichtbaren Zeichen in der 2ten Zeile bestimmen> kannst, welchen Offset dein LCD-Controller tatsächlich benutzt. Oft ist> das 0x40, so wie du das eingetragen hast. Aber manchmal ist es das eben> nicht.>>
Danke für den Tipp das hab ich schonmal ausprobiert.
Wie erwartet zeigt die erste Zeile 27 Zeichen an un dann kommen die die
nicht mehr angezeigt werden. sind in dem Fall 13 Zeichen
-> Zeile 2 würde bei 41 anfangen
Ausserdem ist auf dem ersten Bild zu sehen das
Ich habe also dementsprechend meine lcd_routines angepasst und das
Testprogramm so umgeschrieben das in Zeile 1 ein A ausgegeben werden
soll und in Zeile 2 ein B, jeweils auf Controller 1.
B wird in Zeile 2 ausgegeben aber statt einem A in Zeile 1 gibt er mir
ein µ aus .
Kann es sein das das an dem command liegt oder an welcher Stelle ich den
Command ausführe?
Stefan Friedrich schrieb:> Kann es sein das das an dem command liegt oder an welcher Stelle ich den> Command ausführe?
Ich würde eher darauf tippen, daß das erste Kommando zu früh nach
dem Initialisieren kommt.
Vielleicht bist du mit den Pausen etwas zu geizig?
Ansonsten steht die Lösung doch unter deinen Bildern:
Bei Fragen und Problemen Hotline (03301)206730 :-)
Klaus Wachtler schrieb:> Vielleicht bist du mit den Pausen etwas zu geizig?
An den Pausen liegts glaub ich nicht, hab nun vor den commands immer 5ms
pause eingefügt sowie danach.
Der einzigste unterschied ist das das µ in der ersten Zeile jetzt hin
und wieder ein Ohm-Zeichen wird.
Klaus Wachtler schrieb:> Ansonsten steht die Lösung doch unter deinen Bildern:> Bei Fragen und Problemen Hotline (03301)206730 :-)
Ich wusste ich hätte die Rechnung weglegen sollen :D
Das mue ist 0b1110 0100, das Ohm 0b1111 0100
Sie unterscheiden sich also in einem Byte des High-Nibble.
Da das High-Nibble zuerst übertragen wird, vielleicht zwischen
den beiden ein Päuschen vergrössern (falls du den 4-Bit-Modus
nimmst)?
hier
http://www.pollin.de/shop/dt/NzY3OTc4OTk-/Bauelemente/Aktiv/Displays/LCD_Modul_WINTEK_WD_C2704M_1HNN.html
gibts auch das Datenblatt, falls das interessant sein sollte...über die
Pollin-Seite findet man das Display nämlich ohne weiteres nicht...
EDIT: Gerade gesehen: Der Link zum Datenblatt (und zum Beispielprogramm)
dort funktioniert nicht. Sucht man aber im Downloadbereich nach
Bestellnummer 120232 findet man alles.
Also .. Ich denke die Lösung des Problems gefunden zu haben:
Zunächst war ein Problem das die Leitungen in meinem Fall zu lange
waren.
Ausserdem hat es sich bei mir hilfreich erwiesen die restlichen
Datenleitungen die zuvor 'offen' waren auf GND zu legen.
Und zu guter letzt habe ich statt einer externen Spannungsversorgung
(bei der ich mir irgendwann die stabilität angezweifelt habe) die
Spannungsversorgung vom Evaluationboard mitbenuzt.
Die überarbeiteten funktionierenden LCD_routines hab ich auch mal
angehängt.
Vielleicht hilft es ja jemand weiter der ähnliche Probleme bei diesem
LCD hatte
Viele Grüße
Stefan
Hi
>Ausserdem hat es sich bei mir hilfreich erwiesen die restlichen>Datenleitungen die zuvor 'offen' waren auf GND zu legen.
Ich möchte mal wissen welcher Chaot das aufgebracht hat. Die
Datenleitungen von Displaycontrollern haben interne Pull-Ups . Wenn
man meint zusätzlich etwas machen zu müssen, dann externe
Pull-Up-Widerstände und nicht GND.
MfG Spess