1 | #define F_CPU 3686400UL
|
2 | #include <avr/io.h>
|
3 | #include <stdio.h>
|
4 | #include <avr/delay.h>
|
5 | #include "lcd.h"
|
6 |
|
7 |
|
8 | // ====================================================== //
|
9 | // Hauptprogramm
|
10 | // ====================================================== //
|
11 | int main(void)
|
12 | {
|
13 |
|
14 | //lcd_init();
|
15 | PIND |= (1<<PD3) | (1<<PD4);
|
16 |
|
17 | while(1)
|
18 | {
|
19 |
|
20 | // # Leerlauf ========================================== //
|
21 | if( (PIND &(1<<PD3 |1<<PD4)))
|
22 | {
|
23 | lcd_init();
|
24 |
|
25 | lcd_clear();
|
26 | lcd_write_s("Welcome,Switch ?");
|
27 | }
|
28 | // ====================================================== //
|
29 |
|
30 | // # Taster 1 =========================================== //
|
31 | if(!(PIND &(1<<PD3)))
|
32 | {
|
33 | lcd_init();
|
34 |
|
35 | lcd_clear();
|
36 | lcd_write_s("Name1");
|
37 | PORTD |= (1<<PD3);
|
38 | }
|
39 | // ====================================================== //
|
40 |
|
41 |
|
42 | // # Taster 2 =========================================== //
|
43 | if(! (PIND &(1<<PD4)))
|
44 | {
|
45 | lcd_init();
|
46 |
|
47 | lcd_clear();
|
48 | lcd_write_s("Name2");
|
49 | PORTD |= (1<<PD4);
|
50 | PORTD |= (1<<PD3);
|
51 |
|
52 | }
|
53 | // ====================================================== //
|
54 |
|
55 | // # Taster 1 + # Taster 2 ============================== //
|
56 |
|
57 | if(! (PIND &(1<<PD3) | (1<<PD4)))
|
58 | {
|
59 | lcd_init();
|
60 |
|
61 | lcd_clear();
|
62 | lcd_write_s("Root User");
|
63 | }
|
64 | // ====================================================== //
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 | } // Ende Endlosschleife
|
71 |
|
72 | } // Ende Hauptprogramm
|
73 |
|
74 |
|
75 | // ====================================================== //
|
76 | // Funktionen Deklaration
|
77 | // ====================================================== //
|
78 |
|
79 |
|
80 | void lcd_init(void)
|
81 | {
|
82 | // Port D = Ausgang
|
83 | DDRD=0xff; // alle gesetzten Bits werden auf Ausgang gesetzt
|
84 | PORTD= (1<<PD3) | (1<<PD4);
|
85 | // warten bist LCD-Controller gebootet
|
86 | wait_ms(200);
|
87 | // 4-BitModus einschalten
|
88 | PORTD=0x20;
|
89 | // Schreibsignal
|
90 | PORTD |= (1<<3); //sbi(PORTD,3);
|
91 | PORTD &= ~(1<<3); //cbi(PORTD,3);
|
92 |
|
93 | PORTD |= (1<<4); //sbi(PORTD,3);
|
94 | PORTD &= ~(1<<4);
|
95 |
|
96 | wait_ms(5); // Zeit zum Umschalten lassen
|
97 | // ab hier im 4-Bit-Modus
|
98 | lcd_cmd(0x28); // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
|
99 | //lcd_off();
|
100 | lcd_cmd(0x06); // Entry Mode => Verschiebung des Cursors
|
101 | lcd_on();
|
102 | lcd_clear();
|
103 | }
|
104 |
|
105 | void lcd_send(char data)
|
106 | {
|
107 | // aktuelles RS ermitteln
|
108 | char rs=PORTD;
|
109 | rs&=4;
|
110 | // High-Teil senden
|
111 | char tmp=data;
|
112 | tmp&=0xf0;
|
113 | tmp|=rs;
|
114 | PORTD=tmp;
|
115 | // Schreibsignal
|
116 | PORTD |= (1<<3); //sbi(PORTD,3);
|
117 | PORTD &= ~(1<<3); //cbi(PORTD,3);
|
118 | // Low-Teil senden
|
119 | tmp=data;
|
120 | tmp&=0x0f;
|
121 | tmp*=16;
|
122 | tmp|=rs;
|
123 | PORTD=tmp;
|
124 | // Schreibsignal
|
125 | PORTD |= (1<<3); //sbi(PORTD,3);
|
126 | PORTD &= ~(1<<3); //cbi(PORTD,3);
|
127 | // verarbeiten lassen
|
128 | wait_ms(1);
|
129 | }
|
130 |
|
131 | //---------------------------------------------------------------------------
|
132 | // lcd_write(..) - sendet ein Zeichen (Daten) an LCD
|
133 | //---------------------------------------------------------------------------
|
134 | void lcd_write(char text)
|
135 | {
|
136 | PORTD |= (1<<2); //sbi(PORTD,2); // RS setzen = Daten
|
137 | lcd_send(text); // senden
|
138 | }
|
139 | //---------------------------------------------------------------------------
|
140 | // lcd_write(..) - sendet eine Zeichenkette an LCD
|
141 | // Die Zeichenkette muss mit 0x00 abgeschlossen sein
|
142 | //---------------------------------------------------------------------------
|
143 | void lcd_write_s(char* pText)
|
144 | {
|
145 | while(pText[0]!=0)
|
146 | {
|
147 | lcd_write(pText[0]);
|
148 | pText++;
|
149 | }
|
150 | }
|
151 |
|
152 | //---------------------------------------------------------------------------
|
153 | // lcd_clear(..) - löscht die Anzeige im LCD
|
154 | //---------------------------------------------------------------------------
|
155 | void lcd_clear(void)
|
156 | {
|
157 | lcd_cmd(0x01);
|
158 | wait_ms(2); // warten
|
159 | }
|
160 | //---------------------------------------------------------------------------
|
161 | // lcd_on(..) - schaltet das LCD an
|
162 | //---------------------------------------------------------------------------
|
163 | void lcd_on(void)
|
164 | {
|
165 | lcd_cmd(0x0E);
|
166 | }
|
167 | //---------------------------------------------------------------------------
|
168 | // lcd_off(..) - schaltet das LCD aus
|
169 | //---------------------------------------------------------------------------
|
170 | void lcd_off(void)
|
171 | {
|
172 | lcd_cmd(0x08);
|
173 | }
|
174 | //---------------------------------------------------------------------------
|
175 | // lcd_goto(..) - setzt die Cursorposition
|
176 | //---------------------------------------------------------------------------
|
177 | void lcd_goto(int row, int col)
|
178 | {
|
179 | row--; // Null-basierend
|
180 | row&=0x01; // sicherheitshalber
|
181 | row*=0x40; // Zeile nach Bit 6 bringen
|
182 | col--; // Null-basierend
|
183 | col&=0x0f; // sicherheitshalber
|
184 | char tmp=row|col;
|
185 | tmp|=0x80; // Cursor setzen
|
186 | lcd_cmd(tmp); // senden
|
187 | }
|
188 | //---------------------------------------------------------------------------
|
189 | // lcd_init(..) - Schaltet die Ports und Initialisiert das LCD
|
190 | //---------------------------------------------------------------------------
|
191 |
|
192 | //---------------------------------------------------------------------------
|
193 | // lcd_charDef(..) - initialisiert benutzerdefinierte Zeichen für das LCD
|
194 | //---------------------------------------------------------------------------
|
195 | void lcd_charDef(void)
|
196 | {
|
197 | // 1. Kommando CGRAM + Adresse setzen
|
198 | // 2. Punktmatrix-Daten laden
|
199 | unsigned char charSet[64]={
|
200 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
|
201 | 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
|
202 | 0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,
|
203 | 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
|
204 | 0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,
|
205 | 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
206 | 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
207 | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
208 | };
|
209 | int i=0;
|
210 | for (i=0;i<64;i++)
|
211 | {
|
212 | lcd_cmd(0x40+i); // cmd 0x40 + Adr
|
213 | lcd_write(charSet[i]); // Pixel
|
214 | }
|
215 | }
|
216 | //---------------------------------------------------------------------------
|
217 |
|
218 | //---------------------------------------------------------------------------
|
219 | void wait_ms(int miliSec)
|
220 | {
|
221 | _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec); // 4 Zyklen warteschleife
|
222 | }
|
223 | //////////////////////////////////////////////////////////////////////////////
|
224 | // lcd_send(..) - sendet ein Byte an LCD im 4-Bit-Modus
|
225 | // nicht direkt aufrufen sondern lcd_cmd oder lcd_write nutzen
|
226 | //---------------------------------------------------------------------------
|
227 |
|
228 | //---------------------------------------------------------------------------
|
229 | // lcd_cmd(..) - sendet ein Kommando an LCD
|
230 | //---------------------------------------------------------------------------
|
231 | void lcd_cmd(char cmd)
|
232 | {
|
233 | PORTD &= ~(1<<2); //cbi(PORTD,2); // RS löschen = Kommando
|
234 | lcd_send(cmd); // senden
|
235 | }
|
236 | //---------------------------------------------------------------------------
|
237 | // lcd_home(..) - Cursor auf Position 1,1
|
238 | //---------------------------------------------------------------------------
|
239 | void lcd_home(void)
|
240 | {
|
241 | lcd_cmd(0x02);
|
242 | wait_ms(2); // warten
|