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?
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.