Forum: Mikrocontroller und Digitale Elektronik Zeilenumbruch am LCD initialisieren ? (Assembler)


von Kie B. (kiebitz0309)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

Probier's mal hiermit


       ldi temp, 0b11000000
      rcall lcd_command


Bernhard

von Kie B. (kiebitz0309)


Lesenswert?

Vielen Dank,aber funktioniert leider nicht. :o(
Grüße Lutz

von Bernhard S. (bernhard)


Lesenswert?

Nimm mal bitte LCD CLEAR raus und starte alles nochmal,

ist dann nur eine Zeile Sichtbar?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?


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

von Kloster (Gast)


Lesenswert?

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

von Kie B. (kiebitz0309)


Lesenswert?

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

von winne (Gast)


Lesenswert?

http://www.progforum.com/showthread.php?t=5913&highlight=Batron

habe immer pufferstrins benutz das zu lösen, welche ich en bloc 
versendet habe.

von M. B. (m_beffa)


Lesenswert?

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

von Jörn P. (jonnyp)


Lesenswert?

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.

von Kie B. (kiebitz0309)


Lesenswert?

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

von Kloster (Gast)


Angehängte Dateien:

Lesenswert?

die Addresse wird mit dem Befehl: DD RAM Address Set eingestellt.

RS=0 RW=0 DB7=1 DB6-DB0=1000000 (Alles binär!)

von Philipp B. (philipp_burch)


Lesenswert?

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