/** TIME.C ********************************************************** Zeitfunktionen (nur gemeisam mit timer0.c) MAKROS CPU517,CPU517s wenn definiert, wird die Aritmetik-Einheit benutzt PUBLIC time_set_s() Setzt die Tageszeit als die Anzahl von Sekunden seit Mitternacht time_get_s() Liefert die Tageszeit als die Anzahl von Sekunden seit Mitternacht time_set_hms() Setzt die Tageszeit in Stunden, Minuten und Sekunden time_get_hms() Liefert die Tageszeit in Stunden, Minuten und Sekunden *******************************************************************/ #ifdef LDEBUG #define CPU517a #include #else #include "bios.h" #endif #include "time.h" #include "timer0.h" #ifndef __C51__ #include /* #define CLK_TCK 18.2 */ #endif /** LOCAL **********************************************************/ #if defined(CPU517) || defined(CPU517a) #ifdef LDEBUG #undef LDEBUG #include "arith.h" #define LDEBUG #define hide #else #include "arith.h" #define hide static #endif hide unsigned int i1,i2,i3; hide unsigned long l; #endif /* CPU517x */ /** PUBLIC **********************************************************/ /* time_set_s Setzt die Tageszeit als die Anzahl von Sekunden seit Mitternacht zu große Zahlenwerte werden abgeschnitten */ void time_set_s(unsigned long s) { /* zu grosse Eingaben abschneiden */ if (s>(unsigned long)60*60*24) s=(unsigned long)60*60*24; /* s * CLK_TCK kann nicht durch die Arithmetik-Einheit durchgeführt werden, da s bereits eine Long-Zahl sein kann */ timer0_set( (unsigned long)( s * CLK_TCK )); } /* time_get_s Holt die Tageszeit als die Anzahl von Sekunden seit Mitternacht */ unsigned long time_get_s(void) { l = timer0_get(); #if defined(CPU517) || defined(CPU517a) i1 = CLK_TCK; DIVL(l,i1,l,i2); return (unsigned long)l; #else return (unsigned long)(l/CLK_TCK); #endif } void time_set_hms(unsigned char h, unsigned char m, unsigned char s) { #if defined(CPU517) || defined(CPU517a) /* h->h*60 Stunden in Minuten */ i1=h; i2=24; DIV(i1,i2,i3,i1); /* zu große Stundenzahlen abschneiden */ i2=60; MUL(i1,i2,l); /* ((h*60)+m)*60 Stunden und Minuten in Sekunden */ i1=m; i2=60; DIV(i1,i2,i3,i1); /* zu große Minutenzahlen abschneiden */ l += i1; i1=(unsigned int)l; MUL(i1,i2,l); /* */ i1=s; i2=60; DIV(i1,i2,i3,i1); /* zu große Sekundenzahlen abschneiden */ l += i1; time_set_s(l); #else l = ((unsigned long)(h%24)*60 + (m%60))*60 + (s%60); time_set_s(l); #endif } void time_get_hms(unsigned char *h, unsigned char *m, unsigned char *s) { l=time_get_s(); #if defined(CPU517) || defined(CPU517a) i1=60; #endif /* Sekunden = Sekundenzahl % 60 */ #if defined(CPU517) || defined(CPU517a) DIVL(l,i1,l,i2); *s = (unsigned char)i2; #else *s = l%60; l = l/60; #endif /* Minuten = Minutenzahl % 60 Stunden = Minutenzahl / 60 */ #if defined(CPU517) || defined(CPU517a) DIVL(l,i1,l,i2); *h = (unsigned char)l; *m = (unsigned char)i2; #else *m = (unsigned char)(l%60); *h = (unsigned char)(l/60); #endif }