Forum: Mikrocontroller und Digitale Elektronik 2. oder 4. Zeile bei 4 Zeiligen LCD Displays


von Stefan Friedrich (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von usuru (Gast)


Lesenswert?


von me (Gast)


Lesenswert?

>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.

von Klaus W. (mfgkw)


Lesenswert?

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...

von me (Gast)


Lesenswert?

>Ohne Datenblatt ist das aber alles Spekulation, und ich habe
>keine Lust das zu suchen.

Dann geh' schlafen!

von Frank K. (fchk)


Lesenswert?

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

von me (Gast)


Lesenswert?

sach ich doch: CS1 UIND CS2

von Stefan Friedrich (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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...

von Stefan Friedrich (Gast)


Angehängte Dateien:

Lesenswert?

Entschuldigung hab vergessen den Source anzuhängen.

hier nun noch die Files einmal Routines und das eigentliche Programm

von Stefan Friedrich (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Um in die 2. oder 4. zu springen nimmst du auch das zweite Enable?
Ebenso für die Ausgabe der Zeichen dann?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Wenn du enable richtig bedienst und kommst trotzdem nicht in die
richtigen Stellen, dann hast du nicht die richtigen Adressen im
DDRAM erwischt.

von Karl H. (kbuchegg)


Lesenswert?

>> 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.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Stefan Friedrich (Gast)


Lesenswert?

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 .

von Klaus W. (mfgkw)


Lesenswert?

Dann frage ich mal wieder nach, was im Datenblatt steht? :-)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan Friedrich (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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 :-)

von Stefan Friedrich (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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)?

von Klaus W. (mfgkw)


Lesenswert?

Klaus Wachtler schrieb:
> Sie unterscheiden sich also in einem Byte des High-Nibble.

ich meinte natürlich ein Bit des High...

von Hannes H. (mui)


Lesenswert?

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.

von Stefan Friedrich (Gast)


Angehängte Dateien:

Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.