/*************读取时间、并实现BCD和十进制间的转化***************/ /**************************************************************** 十进制转8421编码:
32/10 = 3*16= 48(十进制)= 30(16进制) 32 = 2
30+2 = 32 * 16 + 32 % 10 = 32(8421编码)(即:a/10*10+a) 8421编码转十进制:
51 / 16 = 5 * 10(16进制) = 50(十进制) 51 % 16 = 1
50 + 1 = 51 / 16 + 51 % 16 = 51(十进制)(即:a/16*10+a)
*****************************************************************/ void get_time(date_time *Time) {
uchar value; value=read_data(DS1302_SECOND); Time->second=(value/16)*10+(value); value=read_data(DS1302_MINUTE); Time->minute=(value/16)*10+(value); value=read_data(DS1302_HOUR); Time->hour=(value/16)*10+(value); value=read_data(DS1302_WEEK); Time->week=(value/16)*10+(value-1); //星期的显示数值比正确值多一 value=read_data(DS1302_DAY); Time->day=(value/16)*10+(value); value=read_data(DS1302_MONTH); Time->month=(value/16)*10+(value); value=read_data(DS1302_YEAR); Time->year=(value/16)*10+(value); }
/**************年-月-日-星期“字符”显示***************/ void date_to_str(date_time *Time) {
Time->date_str[0]=Time->year/10+'0'; //加'0'转化成字符 Time->date_str[1]=Time->year+'0'; Time->date_str[2]='-'; Time->date_str[3]=Time->month/10+'0'; Time->date_str[4]=Time->month+'0'; Time->date_str[5]='-'; Time->date_str[6]=Time->day/10+'0'; Time->date_str[7]=Time->day+'0'; Time->date_str[8]='-'; Time->date_str[9]=Time->week+'0'; Time->date_str[10]='\\0';
}
/**************时-分-秒“字符”显示***************/ void time_to_str(date_time *Time) {
Time->time_str[0]=Time->hour/10+'0'; Time->time_str[1]=Time->hour+'0'; Time->time_str[2]='-'; Time->time_str[3]=Time->minute/10+'0'; Time->time_str[4]=Time->minute+'0'; Time->time_str[5]='-'; Time->time_str[6]=Time->second/10+'0'; Time->time_str[7]=Time->second+'0'; Time->time_str[8]='\\0'; }
#endif
万年历C文件:
/********************************************************* TITLE: 实时时钟
FUNCTION: DS1302+LCD1602显示实时时钟 WRITER: LINLIANHUO TIME: 2014-07-30
REMARK: matters need attention
**********************************************************/ #include
#define uint unsigned int #define uchar unsigned char
date_time current_time;
void main( ) {
init_LCD1602(); init_DS1302(); display(\ write_com(0x80+0x40); display(\
}
while(1) {
get_time(¤t_time); date_to_str(¤t_time); time_to_str(¤t_time); write_com(0x80+0x06); display(current_time.date_str); write_com(0x80+0x40+0x06); display(current_time.time_str); }