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