前言
BCD码作为DS1302以及个别时间传感器的是以BCD码的形式来储存数据的,所以,显示与设置数据的时候需要代码手动进行设置。
BCD码介绍
BCD码是以十六进制方式显示为十进制的计数方式
比如:0x00~0x09,代表十进制中的1—9
0x10代表的并不是传统十六进制所代表的128,而是10,
十六进制的abcbdef在bcd码中并不存在。
代码
Sec代表秒
Min代表分钟
Hour代表小时
加法:
Sec++; //按下按键秒时间增加1
if((Sec&0x0f) == 0x0a) //当后四位值变成10
{
Sec = Sec&0xf0; //后四位归零
Sec += 16; //前四位进1
if(Sec >= 0x60)
{
Sec = 0x00;
Min++;
if((Min&0x0f)
{
Min= Min&0xf0; //后四位归零
Min+= 16;
if(Min >= 0x60)
{
Min = 0x00;
Hour++; //按下按键小时时间增加1
if(Hour >= 0x24) //当所得值为24
{
Hour = 0x00; //全部归零
}
if((Hour&0x0f) == 0x0a) //当后四位值变成10
{
Hour = Hour&0xf0; //后四位归零
Hour += 16; //前四位进1
}
}
}
}
}
减法
Sec--; //按下按键分钟时间减去1
if((Sec&0x0f) == 0x0f) //当后四位值变成15
{
Sec = (Sec&0xf0)|0x09; //后四位改为9
if(Sec == 0xf9) //0x00-1 = 0xff 经程序变成0xf9
{
Sec = 0x59;
Min--; //按下按键分钟时间减去1
if((Min&0x0f) == 0x0f) //当后四位值变成15
{
Min = (Min&0xf0)|0x09; //后四位改为9
if(Min == 0xf9) //0x00-1 = 0xff 经程序变成0xf9
{
Min = 0x59;
Hour--; //按下按键小时时间减1
if(Hour == 0xff) //当所得值为-1(unsigned char)
{
Hour = 0x23; //变成最大数减1(24-1)
}
if((Hour&0x0f) == 0x0f) //当后四位值变成15
{
Hour = (Hour&0xf0)|0x09;//后四位改为9
}
}
}
}
}