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


von Markus P. (maxpg)


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?

von Dennis (Gast)


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.

von Dennis (Gast)


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.

von Dennis (Gast)


Lesenswert?

Also so in etwa (nur als Beispiel):
1
#define LCD_LINES          2
2
#define LCD_CHARS          16
3
4
#define LCD_START_1ST_LINE 0x80
5
#define LCD_START_2ND_LINE 0xC0
6
#define LCD_START_3RD_LINE 0x94
7
#define LCD_START_4TH_LINE 0xD4
8
9
...
10
11
void lcd_set_cursor (uint8_t row, uint8_t column)
12
{
13
  if (row <= LCD_LINES)
14
  {  
15
    if (column <= LCD_CHARS)
16
    {
17
      if (row == 1)
18
      {
19
        lcd_send_byte ((LCD_START_1ST_LINE + (column - 1)), LCD_COMMAND);
20
      }
21
      
22
      else if (row == 2)
23
      {
24
        lcd_send_byte ((LCD_START_2ND_LINE + (column - 1)), LCD_COMMAND);
25
      }
26
      
27
      else if (row == 3)
28
      {
29
        lcd_send_byte ((LCD_START_3RD_LINE + (column - 1)), LCD_COMMAND);
30
      }
31
      
32
      else if (row == 4)
33
      {
34
        lcd_send_byte ((LCD_START_4TH_LINE + (column - 1)), LCD_COMMAND);
35
      }
36
    }
37
  }
38
}

Und hier noch die ganzen Befehle für den HD44780:
1
/*
2
3
Display-Befehle:
4
5
// Clear Display
6
0x01   // [0000 0001]
7
8
// Return Home
9
0x02   // [0000 001x]
10
11
// Entry Mode Set
12
0x04   // [0000 0100] Cursor Dekrement, Cursor begleitet Shift nicht
13
0x05   // [0000 0101] Cursor Dekrement, Cursor begleitet Shift
14
0x06   // [0000 0110] Cursor Inkrement, Cursor begleitet Shift nicht
15
0x07   // [0000 0111] Cursor Inkrement, Cursor begleitet Shift
16
17
// Display On / Off Control
18
0x08   // [0000 1000] Display aus, Cursor aus, Stelle blinkt nicht
19
0x09   // [0000 1001] Display aus, Cursor aus, Stelle blinkt
20
0x0A   // [0000 1010] Display aus, Cursor an, Stelle blinkt nicht
21
0x0B   // [0000 1011] Display aus, Cursor an, Stelle blinkt
22
0x0C   // [0000 1100] Display an, Cursor aus, Stelle blinkt nicht
23
0x0D   // [0000 1101] Display an, Cursor aus, Stelle blinkt
24
0x0E   // [0000 1110] Display an, Cursor an, Stelle blinkt nicht
25
0x0F   // [0000 1111] Display an, Cursor an, Stelle blinkt
26
27
// Cursor Or Display Shift
28
0x10   // [0001 00xx] Cursor Bewegung, Links Shift
29
0x14   // [0001 01xx] Cursor Bewegung, Rechts Shift
30
0x18   // [0001 10xx] Display Shift, Left Shift
31
0x22   // [0001 11xx] Display Shift, Rechts Shift
32
33
// Function Set
34
0x20   // [0010 00xx] 4-Bit-Modus, 1 Zeile, 5x8 Punkte
35
0x24   // [0010 01xx] 4-Bit-Modus, 1 Zeile, 5x10 Punkte
36
0x28   // [0010 10xx] 4-Bit-Modus, 2 Zeilen, 5x8 Punkte
37
0x30   // [0011 00xx] 8-Bit-Modus, 1 Zeilen, 5x8 Punkte
38
0x34   // [0011 01xx] 8-Bit-Modus, 1 Zeile, 5x10 Punkte
39
0x38   // [0011 10xx] 8-Bit-Modus, 2 Zeilen, 5x8 Punkte
40
0x3C   // [0011 11xx] 8-Bit-Modus, 2 Zeilen, 5x10 Punkte
41
42
// Set DDRAM Adress
43
0x80   // [1000 0000] Erste Adresse fuer Daten
44
45
*/

Gruß, Dennis

von Dennis (Gast)


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.

von Dennis (Gast)


Lesenswert?

Achja: Dein vierzeiliges LCD ist in Wirklichkeit halt nur ein 
zweizeiliges ;-)

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.