Ich habe ein LCD-Display, das ich mit einem ATMega8 ansteuere (HD44780
kompatibel).Das funktioniert so weit ganz gut, solange ich einzeilig
ausgebe. Habe ich längere Zeichenketten erfolgt kein Zeilenumbruch.
Da ich aber auch nur definiere, das mein Display zweizeilig ist, kann
der Chip logischerweise nicht wissen,wann die 1. Zeile zu ende ist. An
welcher Stelle der Initialisierung und wie kann ich die Anzahl der
Zeichen definieren (16) ?
Vielen Dank im Vorraus, allen einen guten Rutsch ins Neue Jahr.
Lutz
Meine Initialisierung:
ldi temp1, 0b00110000 ;3 x hintereinander initial.
out PORTD, temp1
rcall lcd_enable ; 1. Init
rcall wait5ms
rcall lcd_enable ; 2. Init
rcall wait5ms
rcall lcd_enable ; 3. Init
rcall wait5ms
ldi temp1, 0b00100000 ; 4bit-Modus aktivieren
out PORTD, temp1
rcall lcd_enable
rcall wait5ms
ldi temp1, 0b00101000 ;5x7 Punktmatrix, zweizeilig
rcall lcd_command
ldi temp1, 0b00001100 ;Display On
rcall lcd_command
ldi temp1, 0b00000110 ;Einfügemodus
rcall lcd_command
ldi temp1, 0b00000001 ;LCD Clear
rcall lcd_command
Probier's mal hiermit
ldi temp, 0b11000000
rcall lcd_command
Bernhard
Vielen Dank,aber funktioniert leider nicht. :o( Grüße Lutz
Nimm mal bitte LCD CLEAR raus und starte alles nochmal, ist dann nur eine Zeile Sichtbar?
Meines Wissens kannst du das gar nicht programmieren. Das das LCD zweizeilig ist musst du beim Ausgeben der Zeichen bzw. beim Cursor positionieren berücksichtigen. Das LCD verhält sich immer so als ob eine Zeile 40 Zeichen lang wäre, egal ob diese Zeichen auch tatsächlich sichtbar sind oder nicht.
Die meisten LCDs programmiere ich so:
LCD_INITIALISIERUNG:
ldi temp, 0b00000011 ;muss 3mal hintereinander
gesendet
out PORTB, temp ;werden zur Initialisierung
rcall lcd_enable ;1
rcall wait5ms
rcall lcd_enable ;2
rcall wait5ms
rcall lcd_enable ;und 3!
rcall wait5ms
ldi temp, 0b00000010 ;4bit-Modus einstellen
out PORTB, temp
rcall lcd_enable
rcall wait5ms
ldi temp, 0b00000001 ; DISPLAY löschen
rcall lcd_command
ldi temp, 0b00001111 ; DISPLAY ein / CURSOR blinken
rcall lcd_command
ldi temp, 0b00000110 ; Cursor Auto-Increment
rcall lcd_command
ret
LCD_CLEAR:
ldi temp, 0b00000001
rcall lcd_command
ret
LCD_GO_HOME:
ldi temp, 0b00000010
rcall lcd_command
ret
LCD_ZEILE2:
ldi temp, 0b11000000
rcall lcd_command
ret
Hi Lutz ******** , Wenn du dir das Datenblatt eines LCD's ganz genau anschaust, dann stellst du fest, dass die Angezeigten Zeichen in einen DDRAM Speicher linear abgelegt werden. Die Zwete Zeile beginnt aber nicht da wo die erste Zeile endet. wenn die erste Zeile endet, setze die DDRAM adresse auf 0x40 und schreibe ab da weiter. Dann müsste es klappen.. mfg Kloster
Hallo Kloster, genau in diese Richtung gingen meine Gedanken. Im Datenblatt habe ich auch die einzelnen Adressen der Zeichen angegeben. Jedoch weiß ich eben nicht, mit welchem Befehl und an welcher Stelle ich die DDRAM-Adresse angeben muss. Vielen Dank. Hallo Bernhard probiere Initialisierung mal aus. Thx. Grüße Lutz
http://www.progforum.com/showthread.php?t=5913&highlight=Batron habe immer pufferstrins benutz das zu lösen, welche ich en bloc versendet habe.
Ich sehe es ebenfalls so, dass man dem Controller nicht mit einem Command mitteilen kann wie lange eine Zeile ist. Vielmehr musst du immer wissen, wann du die erste Zeile vollgeschrieben hast und dann den Cursor auf die zweite Zeile setzen. Ich hab das in meinen Display-Routinen so gelöst, dass ich bei der Funktion write_character (schreibt einen Buchstaben) zuerst überprüfe wo sich der Cursor befindet. Ist er bereits ausserhalb des Sichtbereiches, setze ich ihn auf die zweite Zeile, dann schreibe ich den Character. Grüsse
So wie es m_beffa beschrieben hat geht es am besten. Dabei läßt sich die Routine auch noch spielend an die verschiedenen Displaygößen anpassen.
Vielen Dank nochmals an alle für die Hilfe. Habe mich für die einfache (aber eben nicht unbedingt elegante) Methode entschieden. Fülle meine Zeile bis 40`tem Zeichen mit Leerzeichen. Da ich aus dem Datenblatt die Anzahl der Zeichen entnehmen konnte. Danach kommt der Zeilenumbruch ja von allein *grins. Nochmals Thx. Kiebitz
die Addresse wird mit dem Befehl: DD RAM Address Set eingestellt. RS=0 RW=0 DB7=1 DB6-DB0=1000000 (Alles binär!)
@Kie Bitz0309: Das geht bei einem zweizeiligen Display, bei einem vierzeiligen aber nicht mehr. Da kommt erst Zeile 1, dann Zeile 3, dann Zeile 2 und am Ende Zeile 4.
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.