Hallo, ich versuche, das C0802-Display von Pollin anzusteuern. Gibt leider kein vernünftiges Datenblatt, deshalb habe ich mich nach http://wiki.atrox.at/images/3/3e/Text-LCDs.pdf gerichtet. Der Controller ist ja HD47780-kompatibel. Mein Problem ist, dass auch nach der Initialisierung ein schwarzer Balken auf dem Display bleibt. Die Zeiten sind recht großzügig und sollten deshalb recht großzügig sein. Der Code lautet:
1 | #define F_CPU 1000000
|
2 | |
3 | #include <avr/io.h> |
4 | #include <util/delay.h> |
5 | |
6 | #define LCD_PORT PORTB
|
7 | #define LCD_DDR DDRB
|
8 | #define LCD_RS PB0
|
9 | #define LCD_E PB1
|
10 | #define LCD_D4 PB2
|
11 | #define LCD_D5 PB3
|
12 | #define LCD_D6 PB4
|
13 | #define LCD_D7 PB5
|
14 | |
15 | |
16 | void lcd_enable(void) { |
17 | _delay_ms(40); |
18 | LCD_PORT |= (1 << LCD_E); |
19 | _delay_ms(40); |
20 | LCD_PORT &= ~(1 << LCD_E); |
21 | _delay_ms(40); |
22 | }
|
23 | |
24 | void set_d7(int i) { |
25 | if(i) { |
26 | LCD_PORT |= (1 << LCD_D7); |
27 | } else { |
28 | LCD_PORT &= ~(1 << LCD_D7); |
29 | }
|
30 | }
|
31 | |
32 | /* ... äquivalente Funktionen für d6 - d4. ... */
|
33 | |
34 | void main(void) { |
35 | LCD_DDR |= (1 << LCD_E) | (1 << LCD_RS); |
36 | LCD_DDR |= (1 << LCD_D4) | (1 << LCD_D5) | (1 << LCD_D6) | (1 << LCD_D7); |
37 | |
38 | _delay_ms(1000); |
39 | |
40 | // Initialisierung.
|
41 | // Drei mal das ganze ...
|
42 | set_d7(0); |
43 | set_d6(0); |
44 | set_d5(1); |
45 | set_d4(1); |
46 | lcd_enable(); |
47 | lcd_enable(); |
48 | lcd_enable(); |
49 | |
50 | // 4-bit-Modus.
|
51 | set_d7(0); |
52 | set_d6(0); |
53 | set_d5(1); |
54 | set_d4(0); |
55 | lcd_enable(); |
56 | |
57 | // System-set.
|
58 | set_d7(0); |
59 | set_d6(0); |
60 | set_d5(1); |
61 | set_d4(0); |
62 | lcd_enable(); |
63 | set_d7(1); |
64 | set_d6(0); |
65 | set_d5(0); |
66 | set_d4(0); |
67 | lcd_enable(); |
68 | |
69 | |
70 | // Display on.
|
71 | set_d7(0); |
72 | set_d6(0); |
73 | set_d5(0); |
74 | set_d4(0); |
75 | lcd_enable(); |
76 | set_d7(1); |
77 | set_d6(1); // Display ein |
78 | set_d5(1); // Unterstrich-Cursor ein |
79 | set_d4(0); // Blinkender Cursor aus |
80 | lcd_enable(); |
81 | |
82 | // Clear display.
|
83 | set_d7(0); |
84 | set_d6(0); |
85 | set_d5(0); |
86 | set_d4(0); |
87 | lcd_enable(); |
88 | set_d7(0); |
89 | set_d6(0); |
90 | set_d5(0); |
91 | set_d4(1); |
92 | lcd_enable(); |
93 | |
94 | // Cursor home
|
95 | set_d7(0); |
96 | set_d6(0); |
97 | set_d5(0); |
98 | set_d4(0); |
99 | lcd_enable(); |
100 | set_d7(0); |
101 | set_d6(0); |
102 | set_d5(1); |
103 | set_d4(0); |
104 | lcd_enable(); |
105 | |
106 | |
107 | // Entry mode set.
|
108 | set_d7(0); |
109 | set_d6(0); |
110 | set_d5(0); |
111 | set_d4(0); |
112 | lcd_enable(); |
113 | set_d7(0); |
114 | set_d6(1); |
115 | set_d5(1); // Schreibrichtung rechts. |
116 | set_d4(0); // Cursor verschieben. |
117 | lcd_enable(); |
118 | }
|
Fällt jemandem da spontan 'n Fehler auf? :S Vielen Dank schonmal.