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.