Hallo zusammen!
Ich schlage mich seit nun 2 Stunden mit der Initialisierung eines
HD44780 LCD (2 x 16 Zeichen!) herum und stehe kurz vor der Verzweiflung.
Das LCD soll im 4-Bit Modus betrieben werden und ist wie folgt
angeschlossen:
LCD-DB7: PORTB 7
LCD-DB6: PORTB 6
LCD-DB5: PORTB 5
LCD-DB4: PORTB 4
LCD-DB3: OFFEN
LCD-DB2: OFFEN
LCD-DB1: OFFEN
LCD-DB0: OFFEN
LCD-RW: GND
LCD-RS: PORTA 1
LCD-EN: PORTA 0
Der Test-Code sieht so aus:
1 | #define F_CPU 3686400UL
|
2 | #include <avr/io.h>
|
3 | #include <util/delay.h>
|
4 |
|
5 |
|
6 | void LcdClock (void)
|
7 | {
|
8 | PORTA |= 0b00000001; //HIGH
|
9 | _delay_us(2); //WAIT
|
10 | PORTA &= 0b11111110; //LOW
|
11 | //_delay_us(2); //WAIT
|
12 | }
|
13 |
|
14 | void LcdOut (char nibble)
|
15 | {
|
16 | //PORTB &= 0b00001000; //PWM-Sig2
|
17 | PORTB = nibble & 0xF0;
|
18 | LcdClock();
|
19 | }
|
20 |
|
21 | void LcdData (char data)
|
22 | {
|
23 | PORTA |= 0b00000010; //RS = 1
|
24 | LcdOut(data << 4);
|
25 | LcdOut(data);
|
26 | _delay_ms(2);
|
27 | }
|
28 |
|
29 | void LcdCmd (char data)
|
30 | {
|
31 | PORTA &= 0b11111101; //RS = 0
|
32 | LcdOut(data << 4);
|
33 | LcdOut(data);
|
34 | _delay_ms(4);
|
35 | }
|
36 |
|
37 | void LcdInit (void)
|
38 | {
|
39 | //DDR-Setup
|
40 | DDRA |= 0b00000011; //Steuerleitungen
|
41 | DDRB |= 0b11110000; //Datenleitungen
|
42 | PORTA = 0;
|
43 | PORTB = 0;
|
44 |
|
45 | //8-Bit-Modus
|
46 | _delay_ms(20);
|
47 | PORTB = 0b00110000;
|
48 | LcdClock();
|
49 |
|
50 | //8-Bit-Modus
|
51 | _delay_ms(6);
|
52 | PORTB = 0b00110000;
|
53 | LcdClock();
|
54 |
|
55 | //8-Bit-Modus
|
56 | _delay_ms(1);
|
57 | PORTB = 0b00110000;
|
58 | LcdClock();
|
59 |
|
60 | //4-Bit-Modus
|
61 | PORTB = 0b00100000;
|
62 | LcdClock();
|
63 |
|
64 | //2-zeilig, 5x8-Punkt-Matrix
|
65 | LcdCmd(0b00111000);
|
66 |
|
67 | //Display aus
|
68 | LcdCmd(0b00001000);
|
69 |
|
70 | //Display löschen
|
71 | LcdCmd(0b00000001);
|
72 |
|
73 | //Kursor nach rechts wandernd, kein Display shift
|
74 | LcdCmd(0b00000110);
|
75 |
|
76 | //Display ein
|
77 | LcdCmd(0b00001100);
|
78 | }
|
79 |
|
80 |
|
81 | int main(void)
|
82 | {
|
83 | LcdInit();
|
84 | LcdData('H');
|
85 | LcdData('A');
|
86 | LcdData('L');
|
87 | LcdData('L');
|
88 | LcdData('O');
|
89 | while(1)
|
90 | {
|
91 |
|
92 | }
|
93 | }
|
Kriege damit nur beide(!) Zeilen mit weißen balken ausgefüllt -.-
Danke schonmal für eure Hilfe