1 | #include <htc.h>
|
2 |
|
3 | __CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CPD_OFF & CP_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF);
|
4 |
|
5 | #define taster 0 // 1 für Schließer, 0 für Öffner
|
6 |
|
7 | unsigned char second=0;
|
8 | unsigned char minute=0;
|
9 | unsigned char hour=0;
|
10 |
|
11 | unsigned int clock=0;
|
12 | unsigned int clock2=0;
|
13 | int old_TMR1L=0;
|
14 | int mintime=0;
|
15 | int hourtime=0;
|
16 | char takt=0;
|
17 | char halftakt=0;
|
18 | char oldtakt=0;
|
19 | char oldhalftakt=0;
|
20 | char start=1;
|
21 | char pressed=0;
|
22 | char old_RA1=1;
|
23 | char old_RA0=1;
|
24 |
|
25 |
|
26 | char einer(char zahl)
|
27 | {
|
28 | return zahl%10;
|
29 | }
|
30 |
|
31 | char zehner(char zahl)
|
32 | {
|
33 | return zahl/10;
|
34 | }
|
35 |
|
36 | void throwbit(char hm)
|
37 | {
|
38 | if (hm==0)//Minuten Schiebetakt togglen
|
39 | {
|
40 | RC4=1;
|
41 | RC4=0;
|
42 | }
|
43 | else//Stunden Schiebetakt togglen
|
44 | {
|
45 | RC1=1;
|
46 | RC1=0;
|
47 | }
|
48 | }
|
49 |
|
50 | void showbits(char hm)
|
51 | {
|
52 | if (hm==0)//Minuten Schieberegister übernehmen
|
53 | {
|
54 | RC5=1;
|
55 | RC5=0;
|
56 | }
|
57 | else//Stunden Schieberegister übernehmen
|
58 | {
|
59 | RC2=1;
|
60 | RC2=0;
|
61 | }
|
62 | }
|
63 |
|
64 | void transport(char hm, char byte)
|
65 | {
|
66 | if(hm==0)//Minuten schieben
|
67 | {
|
68 | for(signed char x=3;x>=0;x--)
|
69 | {
|
70 | RC3= 1&(byte>>x);
|
71 | throwbit(0);
|
72 | }
|
73 | for(signed char x=7;x>=4;x--)
|
74 | {
|
75 | RC3= 1&(byte>>x);
|
76 | throwbit(0);
|
77 | }
|
78 | showbits(0);
|
79 | }
|
80 | else// Stunden schieben
|
81 | {
|
82 | for(signed char x=3;x>=0;x--)
|
83 | {
|
84 | RC0= 1&(byte>>x);
|
85 | throwbit(1);
|
86 | }
|
87 | for(signed char x=7;x>=4;x--)
|
88 | {
|
89 | RC0= 1&(byte>>x);
|
90 | throwbit(1);
|
91 | }
|
92 | showbits(1);
|
93 | }
|
94 | }
|
95 |
|
96 |
|
97 | void updateclock(void)
|
98 | {
|
99 | char hour1,hour2,minute1,minute2,h,m;
|
100 |
|
101 | if(hour==255)
|
102 | {
|
103 | h=0b11111111;
|
104 | }
|
105 | else
|
106 | {
|
107 | hour1=zehner(hour);
|
108 | hour2=einer(hour);
|
109 | h = (0b00000001&hour2) + (0b00000010&hour2) + (0b00000100&hour2) + (0b00001000&hour2) + (0b00010000&(hour1<<4)) + (0b00100000&(hour1<<4)) + (0b01000000&(hour1<<4)) + (0b10000000&(hour1<<4));
|
110 | }
|
111 |
|
112 | if(minute==255)
|
113 | {
|
114 | m=0b11111111;
|
115 | }
|
116 | else
|
117 | {
|
118 | minute1=zehner(minute);
|
119 | minute2=einer(minute);
|
120 | m = (0b00000001&minute2) + (0b00000010&minute2) + (0b00000100&minute2) + (0b00001000&minute2) + (0b00010000&(minute1<<4)) + (0b00100000&(minute1<<4)) + (0b01000000&(minute1<<4)) + (0b10000000&(minute1<<4));
|
121 | }
|
122 |
|
123 | // 8Bits schieben
|
124 | transport(0,m);
|
125 | transport(1,h);
|
126 | }
|
127 |
|
128 | void main(void)
|
129 | {
|
130 | ANSEL=ANSELH=0;
|
131 |
|
132 | TRISA=0b11111011;
|
133 | TRISB=0b11111111;
|
134 | TRISC=0b11100000;
|
135 |
|
136 | PORTA=PORTB=PORTC=0b00000000;
|
137 | RA2=1;
|
138 |
|
139 | //----Interrupt-Initialisierung-------
|
140 | GIE=1;
|
141 | PEIE=1;
|
142 | TMR2IF=0;
|
143 | TMR2IE=1;
|
144 |
|
145 | //----Timer1-Initialisierung----------
|
146 | TMR2=0;
|
147 | PR2=250;
|
148 | T2CON=0b00000111;
|
149 |
|
150 |
|
151 | while(1)
|
152 | {
|
153 | if(start==0)//Wenn Uhr nicht mehr im Startmodus ist
|
154 | {
|
155 | if(oldtakt!=takt)
|
156 | {
|
157 | second++;
|
158 | oldtakt=takt;
|
159 | }
|
160 | if(second>=60)
|
161 | {
|
162 | second=0;
|
163 | minute++;
|
164 | }
|
165 | if(minute>=60)
|
166 | {
|
167 | minute=0;
|
168 | if(pressed==0)
|
169 | {
|
170 | hour++;
|
171 | }
|
172 | }
|
173 | if(hour>=24)
|
174 | {
|
175 | hour=0;
|
176 | }
|
177 |
|
178 | if(oldhalftakt!=halftakt)//Wird alle 0,5 Sek. ausgeführt
|
179 | {
|
180 | RA2=~RA2;//Doppelpunkt blinken
|
181 | oldhalftakt=halftakt;
|
182 | }
|
183 |
|
184 | }
|
185 | else//Wenn Uhr angesteckt wird bzw. nach einem Stromausfall (Startmodus ein [Uhr blinkt])
|
186 | {
|
187 | if(oldhalftakt!=halftakt)//Wird alle 0,5 Sek. ausgeführt
|
188 | {
|
189 | if(hour==0 && minute==0)
|
190 | {
|
191 | hour=0b11111111;//Stunden blank schalten
|
192 | minute=0b11111111;//Minuten blank schalten
|
193 | }
|
194 | else
|
195 | {
|
196 | hour=0;//Stunden 0 schalten
|
197 | minute=0;//Minuten 0 schalten
|
198 | }
|
199 | RA2=~RA2;//Doppelpunkt blinken
|
200 | oldhalftakt=halftakt;
|
201 | }
|
202 |
|
203 | }
|
204 | //---------------------Tasterteil------------------------------------------//
|
205 | if(RA0!=taster && hourtime<50)//Stunden Taster ist gedrückt
|
206 | {
|
207 | hourtime++;
|
208 | if(hourtime==50)
|
209 | {
|
210 | second=0;
|
211 | if(hour==255)
|
212 | {
|
213 | hour=0;
|
214 | }
|
215 | hour++;
|
216 | start=0;
|
217 | pressed=1;
|
218 | clock2=0;
|
219 | }
|
220 |
|
221 | }
|
222 | else
|
223 | {
|
224 | hourtime=0;
|
225 | }
|
226 | if(RA1!=taster && mintime<50)//Minuten Taster ist gedrückt
|
227 | {
|
228 | mintime++;
|
229 | if(mintime==50)
|
230 | {
|
231 | second=0;
|
232 | if(minute==255)
|
233 | {
|
234 | minute=0;
|
235 | }
|
236 | minute++;
|
237 | start=0;
|
238 | pressed=1;
|
239 | clock2=0;
|
240 | }
|
241 | }
|
242 | else
|
243 | {
|
244 | mintime=0;
|
245 | }
|
246 | //--------------------------------------------------------------------//
|
247 | updateclock(); //------Uhrzeit auf LEDs aktualisieren-----
|
248 | }
|
249 | }
|
250 |
|
251 | void interrupt isr(void)
|
252 | {
|
253 | if(TMR2IF==1)
|
254 | {
|
255 | clock++;
|
256 | clock2++;
|
257 |
|
258 | if((clock%125)==0 && clock!=0)//alle 500ms wird halftakt getoggled
|
259 | {
|
260 | halftakt=~halftakt;
|
261 | }
|
262 | if((clock%250)==0 && clock!=0)//alle 1000ms wird takt getoggled
|
263 | {
|
264 | takt=~takt;
|
265 | clock=0;
|
266 | }
|
267 |
|
268 | if((clock2%1250)==0 && clock2!=0)//alle 5000ms wird pressed auf 0 gesetzt (damit bei Einstellen der Minuten von 59 auf 0, Stunde nicht um 1 erhöht wird)
|
269 | {
|
270 | pressed=0;
|
271 | clock2=0;
|
272 | }
|
273 | TMR2IF=0;
|
274 | }
|
275 | }
|