Hallo,
ich fange gerade mit Mikrocontrollern an und habe mir vor kurzem ein
HD44780-gesteuertes LCD-Display (2x16) geholt, das mit einem ATMega
32-16 ansteuere. Ich kann das Display soweit auch gut ansprechen und
darauf schreiben, aber beim Definieren eigener Zeichen hakt es.
Wenn ich versuche, den Anfang des CGRAM auszuwählen und etwas rein zu
schreiben, springt der Cursor stattdessen in die untere Zeile des
Displays. Wenn ich dann versuche, ein Zeichen ins CGRAM zu schreiben,
läuft der Cursor weiter. Versuche ich dann (nach einem Rücksprung an den
Beginn der ersten Zeile) das Zeichen auszugeben, passiert nichts.
Verlötung und Verkabelung habe ich schon x-mal gecheckt und ich kann das
Display sonst ja auch problemlos ansprechen.
Ich komme nicht weiter und habe auch keine Idee. Ich habe meinen Code
mal angehängt. Er ist krude, aber ich will gerne das Display wirklich
Schritt für Schritt betreiben, um zu verstehen was da abläuft. Ich
denke, das Problem ist vielleicht offensichtlich, aber ich komme
momentan einfach nicht dahinter.
Weiß nicht ob es einen Unterschied macht aber mein Display hat
japanische statt europäische Sonderzeichen (aber eigentlich sind die
CGRAM-Adressen ja identisch).
Viele Grüße,
Thomas
1 | #define F_CPU 1000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | int main(void)
|
7 | {
|
8 | DDRA = 0b11111111; //Bank A: Data
|
9 | DDRD = 0x00000001; //PD0: Register select
|
10 | PORTC = 0b00000001; //Enable: high
|
11 | DDRC = 0x00000001; //PC0: Enable
|
12 |
|
13 | PORTD = 0b00000000; //Instruction mode
|
14 |
|
15 | _delay_ms(500);
|
16 |
|
17 | PORTA = 0b00111000; //8 bit, 2 Zeilen, 5×7 Font
|
18 | PORTC = 0b00000000; //Enable
|
19 | PORTC = 0b00000001;
|
20 |
|
21 | _delay_ms(500);
|
22 |
|
23 | PORTA = 0b00001111; //Display an, Cursor move, Cursor blinkt nicht
|
24 | PORTC = 0b00000000; //Enable
|
25 | PORTC = 0b00000001;
|
26 |
|
27 | _delay_ms(500);
|
28 |
|
29 | PORTA = 0b00000110; //Entry mode, Increment cursor, kein display shift
|
30 | PORTC = 0b00000000; //Enable
|
31 | PORTC = 0b00000001;
|
32 |
|
33 | _delay_ms(500);
|
34 |
|
35 | PORTD = 0b00000001; //Data mode
|
36 |
|
37 | int i;
|
38 |
|
39 | for (i = 0; i < 5; i++)
|
40 | {
|
41 | PORTA = 0b00110000; //Schreibe "0", damit was passiert
|
42 | PORTC = 0b00000000; //Enable
|
43 | PORTC = 0b00000001;
|
44 |
|
45 | _delay_ms(10);
|
46 | }
|
47 |
|
48 | _delay_ms(500);
|
49 |
|
50 | PORTD = 0b00000000; //Instruction mode
|
51 | PORTA = 0b01000000; //Sprung @CGRAM: 0x40 --> Sprung erfolgt aber in zweite Displayzeile (DDRAM 0x40) !?
|
52 | PORTC = 0b00000000; //Enable
|
53 | PORTC = 0b00000001;
|
54 |
|
55 | _delay_ms(500);
|
56 |
|
57 | PORTD = 0b00000001; //Data mode
|
58 | PORTA = 0b00100001; //CGRAM(1): Punkt rechts oben (im DDRAM käme "!") --> Cursor springt eine Position weiter (DDRAM 0x41)
|
59 | PORTC = 0b00000000; //Enable
|
60 | PORTC = 0b00000001;
|
61 |
|
62 | _delay_ms(500);
|
63 |
|
64 | PORTD = 0b00000000; //Instruction mode
|
65 | PORTA = 0b10000000; //Sprung @DDRAM: 0x0 (funktioniert)
|
66 | PORTC = 0b00000000; //Enable
|
67 | PORTC = 0b00000001;
|
68 |
|
69 | PORTD = 0b00000001; //Data mode
|
70 | PORTA = 0b00000000; //Schreibe neues Zeichen --> nichts passiert
|
71 | PORTC = 0b00000000; //Enable
|
72 | PORTC = 0b00000001;
|
73 |
|
74 | while(1) {}
|
75 |
|
76 | return (1);
|
77 | }
|