BCD and RTC utility
bcdutil.cpp
- Committer:
- ykuroda
- Date:
- 2012-10-06
- Revision:
- 0:dc2c526097d2
File content as of revision 0:dc2c526097d2:
//
///
//
//
//
//
//
//
#include "mbed.h"
#include "bcdutil.h"
static struct tm __t;
static char __rtc_data[20];
unsigned int bin2bcd(unsigned int n)
{
unsigned int bcd=0;
unsigned int base=0;
while (n>0) {
bcd |= (n%10)<<base;
base += 4;
n /= 10;
}
return bcd;
}
unsigned char bcd2bin(unsigned char bcd)
{
// return 10*((bcd>>4)&0xF) + bcd&0xF; // not good. don't know why.
unsigned char temp = bcd & 0x0F;
while (bcd>=0x10) {
temp += 10;
bcd -= 0x10;
}
return temp;
}
char*
tm2rtc(struct tm* _t) // tm -> rtc(BCD)
{
__rtc_data[2] = bin2bcd(_t->tm_sec);
__rtc_data[3] = bin2bcd(_t->tm_min);
__rtc_data[4] = bin2bcd(_t->tm_hour);
__rtc_data[5] = bin2bcd(_t->tm_mday);
__rtc_data[7] = bin2bcd(_t->tm_mon);
__rtc_data[8] = bin2bcd(_t->tm_year-100);
return __rtc_data;
}
struct tm*
rtc2tm(char* _bcd) { // rtc(BCD) -> tm
__t.tm_sec = bcd2bin(_bcd[2]&0x7F); // 0-59
__t.tm_min = bcd2bin(_bcd[3]&0x7F); // 0-59
__t.tm_hour= bcd2bin(_bcd[4]&0x3F); // 0-23
__t.tm_mday= bcd2bin(_bcd[5]&0x3F); // 1-31
__t.tm_mon = bcd2bin(_bcd[7]&0x1F); // 0-11
__t.tm_year= bcd2bin(_bcd[8])+100; // year since 1900
return &__t;
}
Yoji KURODA