Moin,
ich versuche grade ein LCD mit dem ks0073 im 4 Bit Modus zu
initialisieren und ein zeichen auszugeben. Mit einem anderen LCD,
welches den anderen Standartchip benutzt habe ichs schon hinbekommen -
mir fällt der Name grade nicht ein. Es wird sich hier wieder um einen
grundsätzlichen kleinen Fehler handeln, auf dem ich nicht komme.
Bei diesem sehe ich nun allerdings nur schwarze große Zeichen und kein
'a' wie gewünscht. Die ganze Routine hängt in der lcd_busy funktion in
der Schleife fest.
Die pinbelegung am Atmega16 ist:
Portc->
7: RS
6: RW
5: D7
..
2: D4
1: E
Resetleitung des Displays ist auf 0V gezogen.
Ich habe folgende Funktionen gebastelt.
1 | #define LCD_PORT PORTC
|
2 | #define LCD_INPUT PINC
|
3 | #define LCD_DIRECTION_CONTROL DDRC
|
4 | #define LCD_READWRITE 6
|
5 | #define LCD_DATACOMMAND 7
|
6 | #define LCD_ENABLE 1
|
7 |
|
8 | inline void lcd_execute(){
|
9 | LCD_PORT |= 1<<LCD_ENABLE;
|
10 | _delay_ms(1);
|
11 | LCD_PORT &= ~(1<<LCD_ENABLE);
|
12 | }
|
13 |
|
14 | inline void lcd_init(){
|
15 |
|
16 | _delay_ms(50);
|
17 |
|
18 | LCD_PORT = 0b00001000;
|
19 | lcd_execute();
|
20 |
|
21 | _delay_ms(1);
|
22 | LCD_PORT = 0b00001000;
|
23 | lcd_execute();
|
24 | LCD_PORT = 0b00100000;
|
25 | lcd_execute();
|
26 |
|
27 | _delay_ms(1);
|
28 | LCD_PORT = 0b00000000;
|
29 | lcd_execute();
|
30 | LCD_PORT = 0b00110000;
|
31 | lcd_execute();
|
32 |
|
33 | _delay_ms(1);
|
34 | LCD_PORT = 0b00000000;
|
35 | lcd_execute();
|
36 | LCD_PORT = 0b00000100;
|
37 | lcd_execute();
|
38 |
|
39 | _delay_ms(4);
|
40 | LCD_PORT = 0b00000000;
|
41 | lcd_execute();
|
42 | LCD_PORT = 0b00011000;
|
43 | lcd_execute();
|
44 | }
|
45 |
|
46 | inline void lcd_busy(){
|
47 | unsigned char x;
|
48 |
|
49 | LCD_DIRECTION_CONTROL = 0b11000011; //Daten aufnEingang
|
50 | LCD_PORT |= (1<<LCD_READWRITE); //1 = Read
|
51 | LCD_PORT &= ~(1<<LCD_DATACOMMAND); //0 = Command
|
52 |
|
53 | do{
|
54 | LCD_PORT |= 1<<LCD_ENABLE;
|
55 | x = LCD_INPUT<<2;
|
56 | LCD_PORT &= ~(1<<LCD_ENABLE);
|
57 | lcd_execute();
|
58 | }while(x >= 0x80);
|
59 |
|
60 | LCD_DIRECTION_CONTROL = 0xFF;PORTB = 1;
|
61 | }
|
62 |
|
63 | inline void lcd_command(unsigned char command){
|
64 | lcd_busy();
|
65 |
|
66 | LCD_PORT = (command>>2)&0b00111100;
|
67 | lcd_execute();
|
68 | LCD_PORT = (command<<2)&0b00111100;
|
69 | lcd_execute();
|
70 | }
|
71 |
|
72 | inline void lcd_send_character(unsigned char character){
|
73 | lcd_busy();
|
74 |
|
75 | LCD_PORT = ((character>>2)&0b00111100) | 0b10000000;
|
76 | lcd_execute();
|
77 | LCD_PORT = ((character<<2)&0b00111100) | 0b10000000;
|
78 | lcd_execute();
|
79 | }
|
In der main Funktion steht nur folgendes:
1 | lcd_init();
|
2 | lcd_send_character('a');
|
mfg