1 | #define F_CPU 3686400
|
2 | #include <avr\io.h>
|
3 | #include <util\delay.h>
|
4 |
|
5 |
|
6 |
|
7 | /////////////////////////////////////////////////////////////////////////////
|
8 | // allgemeine-Funktionen
|
9 | //---------------------------------------------------------------------------
|
10 | // wait_ms(..) - Wartet einige Millisekunden
|
11 | // Die Dauer ist nicht kalibriert.
|
12 | // PE: miliSec=Anzahl der zu wartenden Millisekunden
|
13 | //---------------------------------------------------------------------------
|
14 | void wait_ms(int miliSec)
|
15 | {
|
16 | _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec); // 4 Zyklen warteschleife
|
17 | }
|
18 | void wait_us(int mikroSec)
|
19 | {
|
20 | _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec); // 4 Zyklen warteschleife
|
21 | }
|
22 | //////////////////////////////////////////////////////////////////////////////
|
23 | // LCD-Funktionen für myAVR-Board + myAVR-LCD
|
24 | // 4-BitModus an PortD Bit 4-7
|
25 | // PortD Bit 2 = RS, high=Daten, low=Kommando
|
26 | // PortD Bit 3 = E, high-Impuls für gültige Daten
|
27 | //---------------------------------------------------------------------------
|
28 | // lcd_send(..) - sendet ein Byte an LCD im 4-Bit-Modus
|
29 | // RS muss vorher richtig gesetzt sein
|
30 | // PE: data=zu sendendes Byte
|
31 | //---------------------------------------------------------------------------
|
32 | void lcd_send(char data)
|
33 | {
|
34 | // aktuelles RS ermitteln
|
35 | char rs=PORTD;
|
36 | rs&=4;
|
37 | // High-Teil senden
|
38 | char tmp=data;
|
39 | tmp&=0xf0;
|
40 | tmp|=rs;
|
41 | PORTD=tmp;
|
42 | // Schreibsignal
|
43 | sbi(PORTD,3);
|
44 | cbi(PORTD,3);
|
45 | // Low-Teil senden
|
46 | tmp=data;
|
47 | tmp&=0x0f;
|
48 | tmp*=16;
|
49 | tmp|=rs;
|
50 | PORTD=tmp;
|
51 | // Schreibsignal
|
52 | sbi(PORTD,3);
|
53 | cbi(PORTD,3);
|
54 | // verarbeiten lassen
|
55 | wait_ms(1);
|
56 | }
|
57 | //---------------------------------------------------------------------------
|
58 | // lcd_cmd(..) - sendet ein Kommando an LCD
|
59 | // PE: cmd=Kommando-Byte
|
60 | //---------------------------------------------------------------------------
|
61 | void lcd_cmd(char cmd)
|
62 | {
|
63 | cbi(PORTD,2); // RS löschen = Kommando
|
64 | lcd_send(cmd); // senden
|
65 | }
|
66 | //---------------------------------------------------------------------------
|
67 | // lcd_write(..) - sendet ein Zeichen (Daten) an LCD
|
68 | // PE: text=Zeichen
|
69 | //---------------------------------------------------------------------------
|
70 | void lcd_write(char text)
|
71 | {
|
72 | sbi(PORTD,2); // RS setzen = Daten
|
73 | lcd_send(text); // senden
|
74 | }
|
75 | //---------------------------------------------------------------------------
|
76 | // lcd_write(..) - sendet eine Zeichenkette an LCD
|
77 | // Die Zeichenkette muss mit 0x00 abgeschlossen sein
|
78 | // PE: pText=Zeiger auf Zeichenkette
|
79 | //---------------------------------------------------------------------------
|
80 | void lcd_write(char* pText)
|
81 | {
|
82 | while(pText[0]!=0)
|
83 | {
|
84 | lcd_write(pText[0]);
|
85 | pText++;
|
86 | }
|
87 | }
|
88 | //---------------------------------------------------------------------------
|
89 | // lcd_write(..) - sendet eine Zeichenkette an LCD
|
90 | // PE: pText=Zeiger auf Zeichenkette
|
91 | // count=Anzahl der zu sendenden Zeichen
|
92 | //---------------------------------------------------------------------------
|
93 | void lcd_write(char* pText, int count)
|
94 | {
|
95 | while(count!=0)
|
96 | {
|
97 | lcd_write(pText[0]);
|
98 | pText++;
|
99 | count--;
|
100 | }
|
101 | }
|
102 | //---------------------------------------------------------------------------
|
103 | // lcd_home(..) - Cursor auf Position 1,1
|
104 | //---------------------------------------------------------------------------
|
105 | void lcd_home()
|
106 | {
|
107 | lcd_cmd(0x02);
|
108 | wait_ms(2); // warten
|
109 | }
|
110 | //---------------------------------------------------------------------------
|
111 | // lcd_clear(..) - löscht die Anzeige im LCD
|
112 | //---------------------------------------------------------------------------
|
113 | void lcd_clear()
|
114 | {
|
115 | lcd_cmd(0x01);
|
116 | wait_ms(2); // warten
|
117 | }
|
118 | //---------------------------------------------------------------------------
|
119 | // lcd_on(..) - schaltet das LCD an
|
120 | //---------------------------------------------------------------------------
|
121 | void lcd_on()
|
122 | {
|
123 | lcd_cmd(0x0E);
|
124 | }
|
125 | //---------------------------------------------------------------------------
|
126 | // lcd_off(..) - schaltet das LCD aus
|
127 | //---------------------------------------------------------------------------
|
128 | void lcd_off()
|
129 | {
|
130 | lcd_cmd(0x08);
|
131 | }
|
132 | //---------------------------------------------------------------------------
|
133 | // lcd_goto(..) - setzt die Cursorposition
|
134 | // PE: row = Zeile 1..2
|
135 | // col = Spalte 1..16
|
136 | //---------------------------------------------------------------------------
|
137 | void lcd_goto(int row, int col)
|
138 | {
|
139 | row--; // Null-basierend
|
140 | row&=0x01; // sicherheitshalber
|
141 | row*=0x40; // Zeile nach Bit 6 bringen
|
142 | col--; // Null-basierend
|
143 | col&=0x0f; // sicherheitshalber
|
144 | char tmp=row|col;
|
145 | tmp|=0x80; // Cursor setzen
|
146 | lcd_cmd(tmp); // senden
|
147 | }
|
148 | //---------------------------------------------------------------------------
|
149 | // lcd_init(..) - Schaltet die Ports und Initialisiert das LCD
|
150 | //---------------------------------------------------------------------------
|
151 | void lcd_init()
|
152 | {
|
153 | // Port D = Ausgang
|
154 | DDRD=0xff;
|
155 | PORTD=0;
|
156 | // warten bist LCD-Controller gebootet
|
157 | wait_ms(50);
|
158 | // SOFT-RESET
|
159 | PORTD = 0x30; //0b00110000;
|
160 | sbi(PORTD,3);
|
161 | cbi(PORTD,3);
|
162 | wait_ms(5);
|
163 | PORTD = 0x30; //0b00110000;
|
164 | sbi(PORTD,3);
|
165 | cbi(PORTD,3);
|
166 | wait_us(100);
|
167 | PORTD = 0x30; //0b00110000;
|
168 | sbi(PORTD,3);
|
169 | cbi(PORTD,3);
|
170 | wait_ms(5);
|
171 |
|
172 | // 4-BitModus einschalten
|
173 | PORTD=0x20;
|
174 | // Schreibsignal
|
175 | sbi(PORTD,3);
|
176 | cbi(PORTD,3);
|
177 | wait_ms(5);
|
178 |
|
179 | // ab hier im 4-Bit-Modus
|
180 | lcd_cmd(0x28); // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
|
181 | //lcd_off();
|
182 | lcd_cmd(0x06); // Entry Mode
|
183 | lcd_on();
|
184 | lcd_clear();
|
185 | }
|
186 | //---------------------------------------------------------------------------
|
187 | // Main-Funktion
|
188 | //---------------------------------------------------------------------------
|
189 | int main (void)
|
190 | {
|
191 | wait_ms(200);
|
192 | lcd_init();
|
193 | lcd_goto(1,1);
|
194 | lcd_write("Hallo LCD");
|
195 | lcd_goto(2,1);
|
196 | lcd_write("12345678");
|
197 | while (1) { } // Mainloop
|
198 | return 0;
|
199 | }
|
200 | //---------------------------------------------------------------------------
|