LED_Tester.c


1
#include <htc.h>
2
3
__CONFIG(FOSC_LP & 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
129
void main(void)
130
{  
131
  OSCCON=0b01100101;
132
  
133
  ANSEL=ANSELH=0;
134
  
135
  TRISA=0b11111011;
136
  TRISB=0b11111111;
137
  TRISC=0b11000000;
138
  
139
  PORTA=PORTB=PORTC=0b00000000;
140
  RA2=1;
141
  
142
  //----Interrupt-Initialisierung-------
143
  GIE=1;
144
  PEIE=1;
145
  TMR1IF=0;
146
  TMR1IE=1;
147
  
148
  //----Timer1-Initialisierung----------
149
  TMR1H=TMR1L=0;
150
  T1CON=0b00111011;
151
  
152
  
153
  while(1)
154
  {    
155
    if(start==0)//Wenn Uhr nicht mehr im Startmodus ist
156
    {
157
      if(oldtakt!=takt)
158
      {
159
        second++;
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
        oldtakt=takt;
178
      }
179
      
180
      if(oldhalftakt!=halftakt)//Wird alle 0,5 Sek. ausgeführt
181
      {
182
        //RA2=~RA2;//Doppelpunkt blinken
183
        oldhalftakt=halftakt;
184
      }
185
      
186
    }
187
    else//Wenn Uhr angesteckt wird bzw. nach einem Stromausfall (Startmodus ein [Uhr blinkt])
188
    {
189
      if(oldhalftakt!=halftakt)//Wird alle 0,5 Sek. ausgeführt
190
      {
191
        if(hour==0 && minute==0)
192
        {
193
          hour=0b11111111;//Stunden blank schalten
194
          minute=0b11111111;//Minuten blank schalten
195
        }
196
        else
197
        {
198
          hour=0;//Stunden 0 schalten
199
          minute=0;//Minuten 0 schalten
200
        }
201
        //RA2=~RA2;//Doppelpunkt blinken
202
        oldhalftakt=halftakt;
203
      }
204
      
205
    }
206
    //---------------------Tasterteil------------------------------------------//
207
    if(RA0!=taster && hourtime<50)//Stunden Taster ist gedrückt
208
    {
209
      hourtime++;
210
      if(hourtime==50)
211
      {
212
        second=0;
213
        if(hour==255)
214
        {
215
          hour=0;
216
        }
217
        hour++;
218
        start=0;
219
        pressed=1;
220
        clock2=0;
221
      }  
222
        
223
    }
224
    else
225
    {
226
      hourtime=0;  
227
    }
228
    if(RA1!=taster && mintime<50)//Minuten Taster ist gedrückt
229
    {
230
      mintime++;
231
      if(mintime==50)
232
      {
233
        second=0;
234
        if(minute==255)
235
        {
236
          minute=0;
237
        }
238
        minute++;
239
        start=0;
240
        pressed=1;
241
        clock2=0;
242
      }
243
    }
244
    else
245
    {
246
      mintime=0;
247
    }
248
    //--------------------------------------------------------------------//
249
    if(TMR1L!=old_TMR1L)
250
    {
251
      clock++;
252
      clock2++;
253
      RA2=~RA2;
254
    
255
      if((clock%2048)==0 && clock!=0)//alle 500ms wird halftakt getoggled
256
        {
257
            halftakt=~halftakt;
258
        }
259
        if((clock%4096)==0 && clock!=0)//alle 1000ms wird takt getoggled
260
        {
261
            takt=~takt;
262
            clock=0;
263
        }
264
      
265
        if((clock2%20480)==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)
266
        {
267
            pressed=0;
268
            clock2=0;
269
        }
270
        old_TMR1L=TMR1L;
271
    }  
272
    updateclock(); //------Uhrzeit auf LEDs aktualisieren-----
273
  }
274
}
275
276
void interrupt isr(void)
277
{
278
  if(TMR1IF==1)
279
  {
280
    TMR1IF=0;  
281
  }
282
}