Ich nutze immer wieder gerne mal die LCD Routine von MyAVR. Normalerweise ist das Display in dieser Routine folgendermaßen angeschlossen: Bit 4-7 - PortD Bit 4-7 ----> Neu PortD Bit 0-3 RS - PortD Bit 2 ----> Neu PortD Bit 5 E - PortD Bit 3 ----> Neu PortD Bit 4 Ich war eigentlich der Meinung ich hätte alles soweit angepasst aber bis auf jeweils einen schwarzen Balken in Zeile 1 und 2 kommt leider nichts. Ich gehe davon aus das ich in der lcd_send Routine etwas falsch habe. Ich habe im übrigen ein 4x20 Zeilen Display und betreibe es im 4 Bit Modus. Hier mal die gesamten Funktionen. Bedanke mich jetzt schonmal für jegliche Hilfe.
1 | //========================================================
|
2 | void lcd_send(char data) |
3 | {
|
4 | char rs=PORTD; |
5 | rs&=20; // aktuelles RS ermitteln |
6 | |
7 | char tmp=data; // high teil |
8 | tmp&=0xf0; |
9 | tmp = tmp >> 4; |
10 | tmp|=rs; |
11 | |
12 | PORTD=tmp; |
13 | |
14 | sbi(PORTD,4); // schreiben |
15 | cbi(PORTD,4); |
16 | |
17 | tmp=data; // low teil |
18 | tmp&=0x0f; |
19 | tmp*=16; |
20 | tmp|=rs; |
21 | |
22 | PORTD=tmp; |
23 | |
24 | sbi(PORTD,4); // schreiben |
25 | cbi(PORTD,4); |
26 | waitMs(1); |
27 | }
|
28 | //========================================================
|
29 | void lcd_cmd(char cmd) |
30 | {
|
31 | cbi(PORTD,5); |
32 | lcd_send(cmd); |
33 | }
|
34 | //========================================================
|
35 | void lcd_write(char text) |
36 | {
|
37 | sbi(PORTD,5); |
38 | lcd_send(text); |
39 | }
|
40 | //========================================================
|
41 | void lcd_write(const char* pText) |
42 | {
|
43 | while(pText[0]!=0) |
44 | {
|
45 | lcd_write(pText[0]); |
46 | pText++; |
47 | }
|
48 | }
|
49 | //========================================================
|
50 | void lcd_write(char* pText, int count) |
51 | {
|
52 | while(count!=0) |
53 | {
|
54 | lcd_write(pText[0]); |
55 | pText++; |
56 | count--; |
57 | }
|
58 | }
|
59 | //========================================================
|
60 | void lcd_home() |
61 | {
|
62 | lcd_cmd(0x02); |
63 | waitMs(2); |
64 | }
|
65 | //========================================================
|
66 | void lcd_clear() |
67 | {
|
68 | lcd_cmd(0x01); |
69 | waitMs(2); |
70 | }
|
71 | //========================================================
|
72 | void lcd_on() |
73 | {
|
74 | lcd_cmd(0x0E); |
75 | }
|
76 | //========================================================
|
77 | void lcd_off() |
78 | {
|
79 | lcd_cmd(0x08); |
80 | }
|
81 | //========================================================
|
82 | void lcd_goto(int row, int col) |
83 | {
|
84 | row--; |
85 | row&=0x01; |
86 | row*=0x40; |
87 | col--; |
88 | col&=0x0f; |
89 | char tmp=row|col; |
90 | tmp|=0x80; |
91 | lcd_cmd(tmp); |
92 | }
|
93 | //========================================================
|
94 | void lcd_init() |
95 | {
|
96 | PORTD = 0b00000011; // soft reset |
97 | sbi(PORTD,4); |
98 | cbi(PORTD,4); |
99 | waitMs(5); |
100 | PORTD = 0b00000011; |
101 | sbi(PORTD,4); |
102 | cbi(PORTD,4); |
103 | waitMs(1); |
104 | PORTD = 0b00000011; |
105 | sbi(PORTD,4); |
106 | cbi(PORTD,4); |
107 | waitMs(5); |
108 | |
109 | PORTD=0b00000010; // 4 Bit aktivieren |
110 | sbi(PORTD,4); |
111 | cbi(PORTD,4); |
112 | waitMs(5); |
113 | |
114 | lcd_cmd (0b00101000); // function set |
115 | lcd_cmd (0b00000110); // entry mode |
116 | lcd_on(); |
117 | lcd_clear(); |
118 | |
119 | }
|
120 | //========================================================
|