Sorry, hier ist der Code.
Es soll im 4Bit Modus angesprochen werden. Ich habe alle Wartezeiten
viel größer gemacht, als sie sein müssten. Der Controller sitzt auf
einem STK500, das Display habe ich über Flachbandkabel an die
Stiftleiste angeschlossen (PORT D), die Verdrahtung ist korrekt, wie
gesagt kommen ja auch Buchstaben an. Die Stromversorgung läuft auch über
das STK, Laut Datenblatt braucht das Display nur 3mA max. (Backlight
wird nicht verwendet).
Grüße und Danke
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <util/delay.h>
|
4 |
|
5 | #define F_CPU 1000000
|
6 | #define DB4 PD0
|
7 | #define DB5 PD1
|
8 | #define DB6 PD2
|
9 | #define DB7 PD3
|
10 | #define RegSelect PD4
|
11 | #define RW PD5
|
12 | #define Enable PD6
|
13 | #define LCD_Port PORTD
|
14 |
|
15 | //Prototypen der Funktionen------------------
|
16 | void lcdInit(void);
|
17 | void enable(void);
|
18 | void lcdClear(void);
|
19 | void schreibeZeichen(char Zeichen);
|
20 |
|
21 | int main (void) {
|
22 |
|
23 | DDRD=0xff; //Ausgang
|
24 |
|
25 | lcdInit();
|
26 | _delay_ms(50);
|
27 | lcdClear();
|
28 |
|
29 | while(1){
|
30 | schreibeZeichen('W');
|
31 | }
|
32 |
|
33 | }
|
34 |
|
35 | //Funktionen------------------------------------
|
36 |
|
37 | void lcdInit(void){
|
38 | LCD_Port = 0x00;
|
39 | _delay_ms(20); //Boot Zeit
|
40 |
|
41 | LCD_Port |= ((1<<DB4)|(1<<DB5));
|
42 | _delay_ms(5);
|
43 | enable();
|
44 | enable();
|
45 | enable();
|
46 | //--------------------------------------------------------
|
47 | LCD_Port = 0x00;
|
48 | LCD_Port |= (1<<DB5); //4 Bit Ansteuerung
|
49 | enable();
|
50 | //--------------------------------------------------------
|
51 | LCD_Port |= (1<<DB5); //2-zeilig, 5x8
|
52 | enable();
|
53 | LCD_Port |= (1<<DB7);
|
54 | enable();
|
55 | //--------------------------------------------------------
|
56 | //Display einschalten, blinkender Cursor ein
|
57 | LCD_Port = 0x00;
|
58 | enable();
|
59 | LCD_Port |=0b11110000;
|
60 | enable();
|
61 | }
|
62 |
|
63 | void enable(void) {
|
64 | LCD_Port |= (1<<Enable);
|
65 | _delay_us(20);
|
66 | LCD_Port &= ~(1<<Enable);
|
67 | _delay_us(20);
|
68 | }
|
69 |
|
70 |
|
71 | void lcdClear(void){
|
72 | LCD_Port &=~(1<<RegSelect);
|
73 | _delay_ms(4);
|
74 | LCD_Port = 0x00; //Display löschen
|
75 | enable();
|
76 | LCD_Port |= (1<<DB4);
|
77 | enable();
|
78 | }
|
79 |
|
80 |
|
81 | void schreibeZeichen(char Zeichen){
|
82 | LCD_Port |=(1<<RegSelect);
|
83 | _delay_ms(5);
|
84 | LCD_Port = 0x00;
|
85 |
|
86 | switch(Zeichen){
|
87 |
|
88 | //als Beispiel ein W
|
89 |
|
90 | case 'W':
|
91 | { LCD_Port |=((1<<DB4)|(1<<DB6)); //bit 0-3
|
92 | enable();
|
93 | LCD_Port |=((1<<DB4)|(1<<DB6)|(1<<DB5)); //bit 4-7
|
94 | enable();
|
95 | break;
|
96 | }
|
97 | }
|
98 | }
|