mikrocontroller.net

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


Autor: Kie Bitz0309 (kiebitz0309)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier's mal hiermit


       ldi temp, 0b11000000
      rcall lcd_command


Bernhard

Autor: Kie Bitz0309 (kiebitz0309)
Datum:

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

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm mal bitte LCD CLEAR raus und starte alles nochmal,

ist dann nur eine Zeile Sichtbar?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kloster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kie Bitz0309 (kiebitz0309)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.progforum.com/showthread.php?t=5913&hig...

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

Autor: M. Beffa (m_beffa)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörn Paschedag (jonnyp)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kie Bitz0309 (kiebitz0309)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kloster (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
die Addresse wird mit dem Befehl: DD RAM Address Set eingestellt.

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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.