BCD and RTC utility

Committer:
ykuroda
Date:
Sat Oct 06 16:38:23 2012 +0000
Revision:
0:dc2c526097d2
BCD and RTC utility

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ykuroda 0:dc2c526097d2 1 //
ykuroda 0:dc2c526097d2 2 ///
ykuroda 0:dc2c526097d2 3 //
ykuroda 0:dc2c526097d2 4 //
ykuroda 0:dc2c526097d2 5 //
ykuroda 0:dc2c526097d2 6 //
ykuroda 0:dc2c526097d2 7 //
ykuroda 0:dc2c526097d2 8 //
ykuroda 0:dc2c526097d2 9 #include "mbed.h"
ykuroda 0:dc2c526097d2 10 #include "bcdutil.h"
ykuroda 0:dc2c526097d2 11
ykuroda 0:dc2c526097d2 12
ykuroda 0:dc2c526097d2 13 static struct tm __t;
ykuroda 0:dc2c526097d2 14 static char __rtc_data[20];
ykuroda 0:dc2c526097d2 15
ykuroda 0:dc2c526097d2 16 unsigned int bin2bcd(unsigned int n)
ykuroda 0:dc2c526097d2 17 {
ykuroda 0:dc2c526097d2 18 unsigned int bcd=0;
ykuroda 0:dc2c526097d2 19 unsigned int base=0;
ykuroda 0:dc2c526097d2 20
ykuroda 0:dc2c526097d2 21 while (n>0) {
ykuroda 0:dc2c526097d2 22 bcd |= (n%10)<<base;
ykuroda 0:dc2c526097d2 23 base += 4;
ykuroda 0:dc2c526097d2 24 n /= 10;
ykuroda 0:dc2c526097d2 25 }
ykuroda 0:dc2c526097d2 26 return bcd;
ykuroda 0:dc2c526097d2 27 }
ykuroda 0:dc2c526097d2 28
ykuroda 0:dc2c526097d2 29 unsigned char bcd2bin(unsigned char bcd)
ykuroda 0:dc2c526097d2 30 {
ykuroda 0:dc2c526097d2 31 // return 10*((bcd>>4)&0xF) + bcd&0xF; // not good. don't know why.
ykuroda 0:dc2c526097d2 32 unsigned char temp = bcd & 0x0F;
ykuroda 0:dc2c526097d2 33 while (bcd>=0x10) {
ykuroda 0:dc2c526097d2 34 temp += 10;
ykuroda 0:dc2c526097d2 35 bcd -= 0x10;
ykuroda 0:dc2c526097d2 36 }
ykuroda 0:dc2c526097d2 37 return temp;
ykuroda 0:dc2c526097d2 38 }
ykuroda 0:dc2c526097d2 39
ykuroda 0:dc2c526097d2 40 char*
ykuroda 0:dc2c526097d2 41 tm2rtc(struct tm* _t) // tm -> rtc(BCD)
ykuroda 0:dc2c526097d2 42 {
ykuroda 0:dc2c526097d2 43 __rtc_data[2] = bin2bcd(_t->tm_sec);
ykuroda 0:dc2c526097d2 44 __rtc_data[3] = bin2bcd(_t->tm_min);
ykuroda 0:dc2c526097d2 45 __rtc_data[4] = bin2bcd(_t->tm_hour);
ykuroda 0:dc2c526097d2 46 __rtc_data[5] = bin2bcd(_t->tm_mday);
ykuroda 0:dc2c526097d2 47 __rtc_data[7] = bin2bcd(_t->tm_mon);
ykuroda 0:dc2c526097d2 48 __rtc_data[8] = bin2bcd(_t->tm_year-100);
ykuroda 0:dc2c526097d2 49 return __rtc_data;
ykuroda 0:dc2c526097d2 50 }
ykuroda 0:dc2c526097d2 51
ykuroda 0:dc2c526097d2 52 struct tm*
ykuroda 0:dc2c526097d2 53 rtc2tm(char* _bcd) { // rtc(BCD) -> tm
ykuroda 0:dc2c526097d2 54 __t.tm_sec = bcd2bin(_bcd[2]&0x7F); // 0-59
ykuroda 0:dc2c526097d2 55 __t.tm_min = bcd2bin(_bcd[3]&0x7F); // 0-59
ykuroda 0:dc2c526097d2 56 __t.tm_hour= bcd2bin(_bcd[4]&0x3F); // 0-23
ykuroda 0:dc2c526097d2 57 __t.tm_mday= bcd2bin(_bcd[5]&0x3F); // 1-31
ykuroda 0:dc2c526097d2 58 __t.tm_mon = bcd2bin(_bcd[7]&0x1F); // 0-11
ykuroda 0:dc2c526097d2 59 __t.tm_year= bcd2bin(_bcd[8])+100; // year since 1900
ykuroda 0:dc2c526097d2 60 return &__t;
ykuroda 0:dc2c526097d2 61 }