1 | //---------------------------------------------------------------------------
|
2 | // Titel : myAVR Beispiel "LCD Ausgabe auf einer Zeile" für den ATmega8/48/88/168
|
3 | //---------------------------------------------------------------------------
|
4 | // Funktion : gibt eine Zeichenkette auf dem myAVR LCD Modul, 1 Zeile
|
5 | // Schaltung : PORTD.2 = RS, PORTD.3 = E, PORTD.4-7 = D4-7
|
6 | //---------------------------------------------------------------------------
|
7 | // Prozessor :
|
8 | // Takt : 3.6864 MHz
|
9 | // Sprache : C
|
10 | // Datum : 09.11.2007
|
11 | // Version : 1.0
|
12 | // Autor : S. Hänsel
|
13 | // Programmer : ...
|
14 | // Port : ...
|
15 | //----------------------------------------------------------------------
|
16 | #define F_CPU 3686400
|
17 | #include <avr\io.h>
|
18 | #include <util\delay.h>
|
19 | #include <inttypes.h>
|
20 | #include <avr\interrupt.h>
|
21 |
|
22 | //----------------------------------------------------------------------
|
23 | volatile int ADC_value;
|
24 |
|
25 | ISR (ADC_vect)
|
26 |
|
27 | {
|
28 | ADC_value=ADC;
|
29 | }
|
30 | //----------------------------------------------------------------------
|
31 | void delay_us(unsigned int count)
|
32 | {
|
33 | _delay_loop_2(count);
|
34 | }
|
35 | //----------------------------------------------------------------------
|
36 | void initADC()
|
37 | {
|
38 | ADMUX=0;
|
39 | ADCSRA=0xDD; //0b11011101
|
40 | }
|
41 | //----------------------------------------------------------------------
|
42 | void initPWM()
|
43 | {
|
44 | DDRB=0x02; //sbi(DDRB,1);
|
45 | TCCR1A=0x83; //0b10000011
|
46 | TCCR1B=0x02; //0b00000010
|
47 | }
|
48 | //----------------------------------------------------------------------
|
49 |
|
50 | /////////////////////////////////////////////////////////////////////////////
|
51 | // allgemeine-Funktionen
|
52 | //---------------------------------------------------------------------------
|
53 | // waitMs(..) - Wartet einige Millisekunden
|
54 | // Die Dauer ist nicht kalibriert.
|
55 | // PE: miliSec=Anzahl der zu wartenden Millisekunden
|
56 | //---------------------------------------------------------------------------
|
57 | void waitMs(int miliSec)
|
58 | {
|
59 | _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec); // 4 Zyklen warteschleife
|
60 | }
|
61 | void waitUs(int mikroSec)
|
62 | {
|
63 | _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec); // 4 Zyklen warteschleife
|
64 | }
|
65 | //////////////////////////////////////////////////////////////////////////////
|
66 | // LCD-Funktionen für myAVR-Board + myAVR-LCD
|
67 | // 4-BitModus an PortD Bit 4-7
|
68 | // PortD Bit 2 = RS, high=Daten, low=Kommando
|
69 | // PortD Bit 3 = E, high-Impuls für gültige Daten
|
70 | //---------------------------------------------------------------------------
|
71 | // lcdSend(..) - sendet ein Byte an LCD im 4-Bit-Modus
|
72 | // RS muss vorher richtig gesetzt sein
|
73 | // PE: data=zu sendendes Byte
|
74 | //---------------------------------------------------------------------------
|
75 | void lcdSend(char data)
|
76 | {
|
77 | // aktuelles RS ermitteln
|
78 | char rs=PORTD;
|
79 | rs&=4;
|
80 | // High-Teil senden
|
81 | char tmp=data;
|
82 | tmp&=0xf0;
|
83 | tmp|=rs;
|
84 | PORTD=tmp;
|
85 | // Schreibsignal
|
86 | sbi(PORTD,3);
|
87 | cbi(PORTD,3);
|
88 | // Low-Teil senden
|
89 | tmp=data;
|
90 | tmp&=0x0f;
|
91 | tmp*=16;
|
92 | tmp|=rs;
|
93 | PORTD=tmp;
|
94 | // Schreibsignal
|
95 | sbi(PORTD,3);
|
96 | cbi(PORTD,3);
|
97 | // verarbeiten lassen
|
98 | waitMs(1);
|
99 | }
|
100 | //---------------------------------------------------------------------------
|
101 | // lcdCmd(..) - sendet ein Kommando an LCD
|
102 | // PE: cmd=Kommando-Byte
|
103 | //---------------------------------------------------------------------------
|
104 | void lcdCmd(char cmd)
|
105 | {
|
106 | cbi(PORTD,2); // RS löschen = Kommando
|
107 | lcdSend(cmd); // senden
|
108 | }
|
109 | //---------------------------------------------------------------------------
|
110 | // lcdWrite(..) - sendet ein Zeichen (Daten) an LCD
|
111 | // PE: text=Zeichen
|
112 | //---------------------------------------------------------------------------
|
113 | void lcdWrite(char text)
|
114 | {
|
115 | sbi(PORTD,2); // RS setzen = Daten
|
116 | lcdSend(text); // senden
|
117 | }
|
118 | //---------------------------------------------------------------------------
|
119 | // lcdWrite(..) - sendet eine Zeichenkette an LCD
|
120 | // Die Zeichenkette muss mit 0x00 abgeschlossen sein
|
121 | // PE: pText=Zeiger auf Zeichenkette
|
122 | //---------------------------------------------------------------------------
|
123 | void lcdWrite(char* pText)
|
124 | {
|
125 | while(pText[0]!=0)
|
126 | {
|
127 | lcdWrite(pText[0]);
|
128 | pText++;
|
129 | }
|
130 | }
|
131 | //---------------------------------------------------------------------------
|
132 | // lcdWrite(..) - sendet eine Zeichenkette an LCD
|
133 | // PE: pText=Zeiger auf Zeichenkette
|
134 | // count=Anzahl der zu sendenden Zeichen
|
135 | //---------------------------------------------------------------------------
|
136 | void lcdWrite(char* pText, int count)
|
137 | {
|
138 | while(count!=0)
|
139 | {
|
140 | lcdWrite(pText[0]);
|
141 | pText++;
|
142 | count--;
|
143 | }
|
144 | }
|
145 | //---------------------------------------------------------------------------
|
146 | // lcdHome(..) - Cursor auf Position 1,1
|
147 | //---------------------------------------------------------------------------
|
148 | void lcdHome()
|
149 | {
|
150 | lcdCmd(0x02);
|
151 | waitMs(2); // warten
|
152 | }
|
153 | //---------------------------------------------------------------------------
|
154 | // lcdClear(..) - löscht die Anzeige im LCD
|
155 | //---------------------------------------------------------------------------
|
156 | void lcdClear()
|
157 | {
|
158 | lcdCmd(0x01);
|
159 | waitMs(2); // warten
|
160 | }
|
161 | //---------------------------------------------------------------------------
|
162 | // lcdOn(..) - schaltet das LCD an
|
163 | //---------------------------------------------------------------------------
|
164 | void lcdOn()
|
165 | {
|
166 | lcdCmd(0x0E);
|
167 | }
|
168 | //---------------------------------------------------------------------------
|
169 | // lcdOff(..) - schaltet das LCD aus
|
170 | //---------------------------------------------------------------------------
|
171 | void lcdOff()
|
172 | {
|
173 | lcdCmd(0x08);
|
174 | }
|
175 | //---------------------------------------------------------------------------
|
176 | // lcdGoto(..) - setzt die Cursorposition
|
177 | // PE: row = Zeile 1..2
|
178 | // col = Spalte 1..16
|
179 | //---------------------------------------------------------------------------
|
180 | void lcdGoto(int row, int col)
|
181 | {
|
182 | row--; // Null-basierend
|
183 | row&=0x01; // sicherheitshalber
|
184 | row*=0x40; // Zeile nach Bit 6 bringen
|
185 | col--; // Null-basierend
|
186 | col&=0x0f; // sicherheitshalber
|
187 | char tmp=row|col;
|
188 | tmp|=0x80; // Cursor setzen
|
189 | lcdCmd(tmp); // senden
|
190 | }
|
191 | //---------------------------------------------------------------------------
|
192 | // lcdInit(..) - Schaltet die Ports und Initialisiert das LCD
|
193 | //---------------------------------------------------------------------------
|
194 | void lcdInit()
|
195 | {
|
196 | // Port D = Ausgang
|
197 | DDRD=0xff;
|
198 | PORTD=0;
|
199 | // warten bist LCD-Controller gebootet
|
200 | waitMs(50);
|
201 | // SOFT-RESET
|
202 | PORTD = 0x30; //0b00110000;
|
203 | sbi(PORTD,3);
|
204 | cbi(PORTD,3);
|
205 | waitMs(5);
|
206 | PORTD = 0x30; //0b00110000;
|
207 | sbi(PORTD,3);
|
208 | cbi(PORTD,3);
|
209 | waitUs(100);
|
210 | PORTD = 0x30; //0b00110000;
|
211 | sbi(PORTD,3);
|
212 | cbi(PORTD,3);
|
213 | waitMs(5);
|
214 |
|
215 | // 4-BitModus einschalten
|
216 | PORTD=0x20;
|
217 | // Schreibsignal
|
218 | sbi(PORTD,3);
|
219 | cbi(PORTD,3);
|
220 | waitMs(5);
|
221 |
|
222 | // ab hier im 4-Bit-Modus
|
223 | lcdCmd(0x28); // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
|
224 | //lcdOff();
|
225 | lcdCmd(0x06); // Entry Mode
|
226 | lcdOn();
|
227 | lcdClear();
|
228 | }
|
229 | //---------------------------------------------------------------------------
|
230 | // Main-Funktion
|
231 | //---------------------------------------------------------------------------
|
232 | int main (void)
|
233 | {
|
234 | waitMs(200);
|
235 | lcdInit();
|
236 | initADC(); //init ADC
|
237 | sei(); //enable INT
|
238 | while (1) {
|
239 | sbi(ADCSRA,6); //start ADC
|
240 | lcdGoto(2,5);
|
241 | lcdWrite(ADC_value);} // Mainloop
|
242 | return 0;
|
243 | }
|
244 | //es kommen nur einstellige Zeichen heraus. von $zu 9
|