BCD and RTC utility
bcdutil.cpp@0:dc2c526097d2, 2012-10-06 (annotated)
- Committer:
- ykuroda
- Date:
- Sat Oct 06 16:38:23 2012 +0000
- Revision:
- 0:dc2c526097d2
BCD and RTC utility
Who changed what in which revision?
User | Revision | Line number | New 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 | } |