www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR-Tutorial: Initialisierung 4 zeiliges LCD


Autor: Markus Pfleger (maxpg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich mach jetzt meine ersten Versuche im MC Bereich und arbeite gerade 
das AVR Tutorial durch. Bin gerade beim Kapitel LCD, aber irgendwie 
komme ich nicht drauf wie ich mein 4x20 Display richtig initialisiere.

Im Tutorial wird ein zweizeiliges Display benutzt, das so initialisiert 
wird (4-Bit Modus):

ldi temp1, 0b00101000        ; 4Bit  2 Zeilen  5x8
rcall lcd_command

Ich hab bei den Commands folgendes gefunden:
Konfiguration: 0b001dnfxx Einstellen der Interface Art, Modus, Font
• d = 0, 4-Bit Interface
• d = 1, 8-Bit Interface
• n = 0, 1 zeilig
• n = 1, 2 zeilig
• f = 0, 5x7 Pixel
• f = 1, 5x11 Pixel

Hier gibts aber nur die Möglichkeiten einzeilig oer zweizeilig zu 
wählen.

Wenn ich es mal auf zweizeilig lasse so wie im Tutorial und dann einfach 
die Zeilen der Reihe nach schreibe, dann wird zuerst in die 1., dann in 
die 3., danach in die 2. und danach in die 4. Zeile geschrieben.

Ich hab mal im Datenblatt etwas gelesen und gesehen, dass das vermutlich 
an der Adresse im Display liegt. Da deckt der erste Speicherbereich die 
1. Zeile ab, danach kommt die 3.,... Aber warum das so ist und wie ich 
hinbekomme, dass die Zeilen der Reihe nach mit meinen Zeichen befüllt 
werden kapier ich irgendwie nicht.

Kann mir da wer weiterhelfen?

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus Pfleger schrieb:
> Wenn ich es mal auf zweizeilig lasse so wie im Tutorial und dann einfach
> die Zeilen der Reihe nach schreibe, dann wird zuerst in die 1., dann in
> die 3., danach in die 2. und danach in die 4. Zeile geschrieben.
>
> Ich hab mal im Datenblatt etwas gelesen und gesehen, dass das vermutlich
> an der Adresse im Display liegt. Da deckt der erste Speicherbereich die
> 1. Zeile ab, danach kommt die 3.,... Aber warum das so ist und wie ich
> hinbekomme, dass die Zeilen der Reihe nach mit meinen Zeichen befüllt
> werden kapier ich irgendwie nicht.

Das ist nunmal so! Die erste Zeile geht in der dritten weiter...die 
zweite in der vierten. Da musst du dir ne Funktion schreiben, die die 
Zeilen und ihre Buchstaben verwaltet.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst ein Zähler mitlaufen lassen, der sich merkt, an welche Stelle der 
Buchstabe gesschrieben werden soll und wenn er aus der Zeile läuft, 
musst du einen Offset dazuaddieren, damit du in der zweiten Zeile 
landest.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also so in etwa (nur als Beispiel):
#define LCD_LINES          2
#define LCD_CHARS          16

#define LCD_START_1ST_LINE 0x80
#define LCD_START_2ND_LINE 0xC0
#define LCD_START_3RD_LINE 0x94
#define LCD_START_4TH_LINE 0xD4

...

void lcd_set_cursor (uint8_t row, uint8_t column)
{
  if (row <= LCD_LINES)
  {  
    if (column <= LCD_CHARS)
    {
      if (row == 1)
      {
        lcd_send_byte ((LCD_START_1ST_LINE + (column - 1)), LCD_COMMAND);
      }
      
      else if (row == 2)
      {
        lcd_send_byte ((LCD_START_2ND_LINE + (column - 1)), LCD_COMMAND);
      }
      
      else if (row == 3)
      {
        lcd_send_byte ((LCD_START_3RD_LINE + (column - 1)), LCD_COMMAND);
      }
      
      else if (row == 4)
      {
        lcd_send_byte ((LCD_START_4TH_LINE + (column - 1)), LCD_COMMAND);
      }
    }
  }
}


Und hier noch die ganzen Befehle für den HD44780:
/*

Display-Befehle:

// Clear Display
0x01   // [0000 0001]

// Return Home
0x02   // [0000 001x]

// Entry Mode Set
0x04   // [0000 0100] Cursor Dekrement, Cursor begleitet Shift nicht
0x05   // [0000 0101] Cursor Dekrement, Cursor begleitet Shift
0x06   // [0000 0110] Cursor Inkrement, Cursor begleitet Shift nicht
0x07   // [0000 0111] Cursor Inkrement, Cursor begleitet Shift

// Display On / Off Control
0x08   // [0000 1000] Display aus, Cursor aus, Stelle blinkt nicht
0x09   // [0000 1001] Display aus, Cursor aus, Stelle blinkt
0x0A   // [0000 1010] Display aus, Cursor an, Stelle blinkt nicht
0x0B   // [0000 1011] Display aus, Cursor an, Stelle blinkt
0x0C   // [0000 1100] Display an, Cursor aus, Stelle blinkt nicht
0x0D   // [0000 1101] Display an, Cursor aus, Stelle blinkt
0x0E   // [0000 1110] Display an, Cursor an, Stelle blinkt nicht
0x0F   // [0000 1111] Display an, Cursor an, Stelle blinkt

// Cursor Or Display Shift
0x10   // [0001 00xx] Cursor Bewegung, Links Shift
0x14   // [0001 01xx] Cursor Bewegung, Rechts Shift
0x18   // [0001 10xx] Display Shift, Left Shift
0x22   // [0001 11xx] Display Shift, Rechts Shift

// Function Set
0x20   // [0010 00xx] 4-Bit-Modus, 1 Zeile, 5x8 Punkte
0x24   // [0010 01xx] 4-Bit-Modus, 1 Zeile, 5x10 Punkte
0x28   // [0010 10xx] 4-Bit-Modus, 2 Zeilen, 5x8 Punkte
0x30   // [0011 00xx] 8-Bit-Modus, 1 Zeilen, 5x8 Punkte
0x34   // [0011 01xx] 8-Bit-Modus, 1 Zeile, 5x10 Punkte
0x38   // [0011 10xx] 8-Bit-Modus, 2 Zeilen, 5x8 Punkte
0x3C   // [0011 11xx] 8-Bit-Modus, 2 Zeilen, 5x10 Punkte

// Set DDRAM Adress
0x80   // [1000 0000] Erste Adresse fuer Daten

*/

Gruß, Dennis

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei einem Fließtext musst du halt erkennen, an welcher Stelle dein 
Zähler ist und dann entsprechend den Cursor neu setzen, wenn du aus 
einer Zeile rausläufst.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja: Dein vierzeiliges LCD ist in Wirklichkeit halt nur ein 
zweizeiliges ;-)

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.