LED_Wanduhr.c


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
}