1 | //----------------------------------------------------------------------
|
2 | // Titel : LCD-Ansteuerung
|
3 | //----------------------------------------------------------------------
|
4 | // Funktion : LCD-Ausgaben
|
5 | // Schaltung : MyAVR USB 2.0 Board + LCD Display 2.2
|
6 | //----------------------------------------------------------------------
|
7 | // Prozessor : ATmega8
|
8 | // Takt : 3.6864 MHz
|
9 | // Sprache : C
|
10 | // Datum : 02.12.2005
|
11 | // Version : 1.3
|
12 | // Autor : Tim Ullmqann
|
13 | //----------------------------------------------------------------------
|
14 | #define F_CPU 3686400 // Taktferquenz des myAVR-Boards
|
15 | #include <avr\io.h> // AVR Register und Konstantendefinitionen
|
16 | #define CLOCK 3686400
|
17 | #include <avr\delay.h>
|
18 |
|
19 | //Funktion für Warteschleife
|
20 | void wait_ms(int miliSec)
|
21 | {
|
22 | // 4 Zyklen Warteschleife
|
23 | _delay_loop_2( 1*(CLOCK/(1000/4)) * miliSec);
|
24 | }
|
25 |
|
26 | //Funktion zum LCD-Display Initialisieren
|
27 | void lcd_init()
|
28 | {
|
29 | //Port D = Ausgang
|
30 | DDRD=0x0Fff;
|
31 | PORTD= 0;
|
32 |
|
33 | //warten bis LCD-Display gebootet hat
|
34 | wait_ms(50);
|
35 |
|
36 | //4-BitModus einschalten
|
37 | PORTD=0x20;
|
38 |
|
39 | //Schreibsignal Enable-Impuls
|
40 | sbi(PORTD,3);
|
41 | cbi(PORTD,3);
|
42 |
|
43 | //Zeit zum Umschalten lassen
|
44 | wait_ms(5);
|
45 |
|
46 | //ab hier im 4 Bit-Modus
|
47 | //Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
|
48 | lcd_cmd(0x28);
|
49 | lcd_off();
|
50 | lcd_clear;
|
51 |
|
52 | //Entry Mode
|
53 | lcd_cmd(0x06);
|
54 | lcd_on();
|
55 | }
|
56 |
|
57 | //LCD-Ansteuerung
|
58 | void lcd_send(char data)
|
59 | {
|
60 | //Aktuelles RS ermitteln
|
61 | char rs=PORTD;
|
62 | rs&=4;
|
63 |
|
64 | //High-Teil senden
|
65 | char tmp=data;
|
66 | tmp&=0xf0;
|
67 | tmp|=rs;
|
68 | PORTD=tmp;
|
69 |
|
70 | //Schreibsignal
|
71 | sbi(PORTD,3);
|
72 | cbi(PORTD,3);
|
73 |
|
74 | //Low-Teil senden
|
75 | tmp=data;
|
76 | tmp&=0x0f;
|
77 | tmp*=16;
|
78 | tmp|=rs;
|
79 | PORTD=tmp;
|
80 |
|
81 | //Schreibsignal
|
82 | sbi(PORTD,3);
|
83 | cbi(PORTD,3);
|
84 |
|
85 | //Verarbeiten lassen
|
86 | wait_ms(1);
|
87 | }
|
88 |
|
89 | //Funktion zum senden von Kommandos an das LCD-Display
|
90 | void lcd_cmd()
|
91 | {
|
92 | cbi(PORTD,2); //RS löschen = Kommando folgt
|
93 | lcd_send(cmd);
|
94 | }
|
95 |
|
96 | //Funktion zur löschen der LCD-Anzeige
|
97 | void lcd_clear()
|
98 | {
|
99 | lcd_cmd(0x01);
|
100 | wait_ms(2);
|
101 | }
|
102 |
|
103 | //Funktion zum setzen des LCD-Cursors auf Position 1,1
|
104 | void lcd_home()
|
105 | {
|
106 | lcd_cmd(0x02);
|
107 | wait_ms(2);
|
108 | }
|
109 |
|
110 | //Funktion zum einschalten des LCD-Displays
|
111 | void lcd_on()
|
112 | {
|
113 | lcd_cmd(0x0E);
|
114 | }
|
115 |
|
116 | //Funktion zum ausschalten des LCD-Displays
|
117 | void lcd_on()
|
118 | {
|
119 | lcd_cmd(0x08);
|
120 | }
|
121 |
|
122 | //Funktion zum setzen des Cursors an eine beliebige Stelle
|
123 | //row = Zeile 1/2
|
124 | //col = Spalte 1..16
|
125 | void lcd_goto(int row, int col)
|
126 | {
|
127 | row--;
|
128 | row&=0x01;
|
129 | row*=40;
|
130 | col--;
|
131 | col&=0x0f;
|
132 | char tmp=row|col;
|
133 | tmp|=0x80;
|
134 | lcd_cmd(tmp);
|
135 | }
|
136 |
|
137 | //Backlight Funktion
|
138 | bool lcd_dimmer_is_init=false;
|
139 | void lcd_light(bool on_off)
|
140 | {
|
141 | //wenn dimmer an, dann PWM deinit
|
142 | if (lcd_dimmer_is_init)
|
143 | {
|
144 | TCCR1A=0;
|
145 | lcd_dimmer_is_init=false;
|
146 | }
|
147 |
|
148 | sbi(DDRB,1); // Port B1 als Ausgang definieren
|
149 | if(on_off)
|
150 | sbi(PORTB,1); //AN
|
151 | else
|
152 | cbi(PORTB,1); //Aus
|
153 | }
|
154 |
|
155 | //Dimmfunktion für LCD-Display
|
156 | void lcd_dimmer(char light)
|
157 | {
|
158 | //init
|
159 | if(!lcd_dimmer_is_init)
|
160 | {
|
161 | sbi(DDRB,1); //PORRB1 als Ausgang definieren
|
162 | TCCR1A=0x81; //PWM Mode 1, Channel A
|
163 | TCCR1A=0x82; //PWM Frequenz CLK/8
|
164 | lcd_dimmer_is_init=true;
|
165 | }
|
166 | OCR1A=light;
|
167 | }
|
168 |
|
169 | //Funktion zum Senden eines Zeichens an das LCD-Display
|
170 | //text = Zeichen
|
171 | void lcd_write(char text)
|
172 | {
|
173 | sbi(PORTB,2);
|
174 | lcd_send(text);
|
175 | }
|
176 |
|
177 | //Funktion zum Senden einer Zeichenkette an das LCD-Display
|
178 | //Zeichenkette muss mit 0x00 abgeschlossen sein
|
179 | //pText = Zeiger auf Zeichenkette
|
180 | void lcd_write(char* pText)
|
181 | {
|
182 | while(pText[0]!=0)
|
183 | {
|
184 | lcd_wirte(pText[0]);
|
185 | pText++;
|
186 | }
|
187 | }
|
188 |
|
189 | //Funktion zum Senden der gesamten Zeichenkette
|
190 | //count = Anzahl der zu sendenden Zeichen
|
191 | void lcd_write(char* pText, int count)
|
192 | {
|
193 | while(count!=0)
|
194 | {
|
195 | lcd_write(pText[0]);
|
196 | pText++;
|
197 | count--;
|
198 | }
|
199 | }
|
200 | //----------------------------------------------------------------------
|
201 | main (void) // Hauptprogramm, startet bei Power ON und Reset
|
202 | {
|
203 | char d=0;
|
204 | wait_ms(200);
|
205 | lcd_init();
|
206 |
|
207 | while(1)
|
208 | {
|
209 | lcd_dimmer(d+=5);
|
210 | lcd_write("Hallo ");
|
211 | wait_ms(100);
|
212 | }
|
213 | return 0;
|
214 | }
|
215 | //----------------------------------------------------------------------
|