本帖最后由 罗罗布淖尔 于 2014-6-18 09:14 编辑
//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar tiME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x14};
void main() //这是万年历里的主程序
{
unsigned char i;
Int0Configuration();
LcdInit();
Ds1302Init();
while(1)
{
if(SetState==0)
{
Ds1302ReadTime();
}
else
{
if(K1==0) //检测按键K1是否按下,K1的功能是选择设置秒分时日月周年中哪一个
{
Delay10ms(); //消除抖动
if(K1==0)
{
SetPlace++;
if(SetPlace>=7)
SetPlace=0;
}
while((i<50)&&(K1==0)) //检测按键是否松
{
Delay10ms();
i++;
}
i=0;
}
if(K2==0) //检测按键K2是否按下,K2的功能是按一下,被选中时间项的加一
{
Delay10ms(); //消除抖动
if(K2==0)
{
TIME[SetPlace]++; //我的问题是我这里改成TIME[SetPlace]--,下面对应的范围 // 也改了。秒和分小于等于零就变成59,但是为什么输出会变成乱码
if((TIME[SetPlace]&0x0f)>9) //换成BCD码。
{
TIME[SetPlace]=TIME[SetPlace]+6;
}
if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小时只能到23
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x7)&&(SetPlace==5)) //周只能到7
{
TIME[SetPlace]=1;
}
// if(SetPlace==5) //月只能到12
// {
// TIME[SetPlace]=;
// }
}
while((i<50)&&(K2==0)) //检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
}
Lcddisplay();
}
我的问题在上面的注释,想了很久没想,是因为BCD码不能做减法吗。只截取了一部分程序,不知大家能不嫩看懂。第一次编程单片机,遇到好多问题。顺便提一下,不知道谁有普中科技HC6800-ES v2.0的万年历程序呀,买单片机的时候那个万年历减一按键都没有,我就自己弄,但是老是失败。
|