Guten Tag,
ich möchte gern ein Text Display ansteuern.
Sobald das Display Strom bekommt leuchten die 1. und die 3. Zeile.
Dies zeigt mir also, dass nach dem internen Reset der 1 zeilige Modus
aktiviert ist.
Nach meiner Initialisierung leuchten alle Zeilen(alle Pixel des Displays
werden dargestellt).
Mir scheint es, als ob alle weiteren Befehle nach der Umschaltung auf 4
bit und 2 zeilig keine Wirkung mehr haben.
Beispielsweise sollten mit dem Befehl nach:
//Display off control (0000 1DCB) --> (0000 1111)
-Das Display an sein(D=1)
-Der Cursor an sein(C=1)
-Der Cursor blinken(B=1)
Aber ich sehe wie gesagt nur alle Pixel konstant leuchten.
Es wäre super, wenn Ihr euch kurz meinen Code angucken könntet und mir
eventuell ein paar Tips geben könntet, woran es liegen kann. Vorgegangen
bin ich nach dem Flussdiagramm auf Seite 27 im Datenblatt(siehe Anhang).
Bei den Timings habe ich mich einmal relativ genau an das Datenblatt
gehalten und das 2. mal habe ich einfach nach jedem Befehl E getoggelt
und etwas gewartet. Beide Versionen zeigen das gleiche Verhalten!
Die Initialisierung, welche ich im Hauptprogramm aufrufe sieht
folgendermaßen aus:
Die Zahlen in den Kommentaren beschreiben jeweils die Zustände von DB
4,5,6,7
1 | void lcd_init( void )
|
2 | {//Power-ON
|
3 | _delay_ms(30);
|
4 | //Funktion Set (0010 0010 NF--) --> (0010 0010 1110)
|
5 | lcd_write_instruction(0x02);
|
6 | lcd_write_instruction(0x02);
|
7 | lcd_write_instruction(0x0E);
|
8 | _delay_us(45);
|
9 |
|
10 | //Display on/off control (0000 1DCB) --> (0000 1111)
|
11 | lcd_write_instruction(0x00);
|
12 | lcd_write_instruction(0x0F);
|
13 | _delay_us(45);
|
14 |
|
15 | ///Display clear (0000 0001)
|
16 | lcd_write_instruction(0x00);
|
17 | lcd_write_instruction(0x01);
|
18 | _delay_ms(2);
|
19 |
|
20 | //Entry Mode Set (0000 01(ID)(SH)) --> (0000 0110)
|
21 | lcd_write_instruction(0x00);
|
22 | lcd_write_instruction(0x06);
|
23 | }
|
Die Funktion lcd_write_instruction sieht in der 1. Version so aus:
(Port D ist der Port an den die Display Pins angeschlossen sind)
1 | void lcd_write_instruction(uint8_t instruction)
|
2 | {
|
3 | PORTD &= ~(1<<RS); //RS=0
|
4 | PORTD &= ~(1<<RW); //RW=0
|
5 | _delay_us (0.1); //60ns(tSU1) warten
|
6 | PORTD |= (1<<E); //E=1
|
7 | _delay_us (0.5); //warte 255ns (450ns(tW)-195ns(tSU2))
|
8 | PORTD |= instruction; //schreibe DB1-DB4 (unteres Nibble von instruction)
|
9 | _delay_us (0.5); //warte 195ns(tSU2)
|
10 | PORTD &= ~(1<<E); //E=0
|
11 | _delay_us (0.1); //warte 10ns(tH2)
|
12 | _delay_us (0.5); //warte 500ns (1000-(10+450+40)
|
13 | _delay_us (40);
|
14 | }
|
in der 2. Version so:
1 | void lcd_write_instruction(uint8_t instruction)
|
2 | {
|
3 | PORTD &= ~(1<<RS); //RS=0
|
4 | PORTD &= ~(1<<RW); //RW=0
|
5 | _delay_ms (1);
|
6 | PORTD |= instruction; //schreibe DB1-DB4 (unteres Nibble von instruction)
|
7 | PORTD |= (1<<E); //E=1
|
8 | _delay_ms (1);
|
9 | PORTD &= ~(1<<E); //E=0
|
10 | _delay_ms (1);
|
11 | }
|
Vielen Dank für eure Hilfe!