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...
>Ohne Datenblatt ist das aber alles Spekulation, und ich habe >keine Lust das zu suchen. Dann geh' schlafen!
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...
Entschuldigung hab vergessen den Source anzuhängen. hier nun noch die Files einmal Routines und das eigentliche Programm
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.
Um in die 2. oder 4. zu springen nimmst du auch das zweite Enable? Ebenso für die Ausgabe der Zeichen dann?
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.
Wenn du enable richtig bedienst und kommst trotzdem nicht in die richtigen Stellen, dann hast du nicht die richtigen Adressen im DDRAM erwischt.
>> 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 .
Dann frage ich mal wieder nach, was im Datenblatt steht? :-)
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)?
Klaus Wachtler schrieb: > Sie unterscheiden sich also in einem Byte des High-Nibble. ich meinte natürlich ein Bit des High...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.