实时时钟程序中的小问题

一:键盘扫描函数中功能键按下次数判断函数位置

之前将if(K1num!=0)   //功能键按下,判断+-操作//    这一语句以及其后的部分放到了与蓝色部分并列的位置,也就是功能键去抖动判断完成之后的按键确认,但是调试时发现时钟设置中的时间调整无法完成,原因是设置位置错误,因为整个K1功能键按下的操作以及完成的功能还没有完成,应该在这一套操作完成后再来进行设置按键的判断。按照思路,将K2、K3(并列)判断的函数放到整个K1按键判断及后续显示操作完成之后,与K1平齐的位置,能够实现时钟+ -的操作。

void keyscan()

{
/**************时分秒时间调整**********************/
if(K1==0)
{
delay(10);   //去抖动
if(K1==0)  //确定功能键按下
{
K1num++;
while(!K1); //等待按键释放  
if(K1num==1)
{
TR0=0; //K1按下,关闭定时器
write_cmd(0x80+0x40+12);//指针指向秒个位
write_cmd(0x0f);//开闪烁
}
if(K1num==2)
{
write_cmd(0x80+0x40+9);//指针指向分个位
}
if(K1num==3)
{
write_cmd(0x80+0x40+6);//指针指向时个位
}
if(K1num==4)
{
K1num=0;
write_cmd(0x0c);
TR0=1;
}
}
}
if(K1num!=0)  //功能键按下,判断+-操作
{ K5num=0;
if(K2==0)
{
delay(10);
if(K2==0)
{
while(!K2);
if(K1num==1)  //K1num为1的情况下K2按下,秒+1
{
sec++;
if(sec==60)
sec=0; 
write_sfm(12,sec);
write_cmd(0x80+0x40+12);
}
if(K1num==2)  //K1num为2的情况下K2按下,分+1
{
min++;
if(min==60)
min=0;
write_sfm(9,min);
write_cmd(0x80+0x40+9);
}
if(K1num==3)  //K1num为3的情况下K2按下,时+1
{
hour++;
if(hour==24)
hour=0;
write_sfm(6,hour);
write_cmd(0x80+0x40+6);
}
}
}
if(K3==0)
{
delay(10);
if(K3==0)
{
while(!K3);
if(K1num==1)  //K1num为1的情况下K2按下,秒-1
{
sec--;
if(sec==-1)
sec=59; 
write_sfm(12,sec);
write_cmd(0x80+0x40+12);
}
if(K1num==2)  //K1num为2的情况下K2按下,分-1
{
min--;
if(min==-1)
min=59;
write_sfm(9,min);
write_cmd(0x80+0x40+9);
}
if(K1num==3)  //K1num为3的情况下K2按下,时-1
{
hour--;
if(hour==-1)
hour=23;
write_sfm(6,hour);
write_cmd(0x80+0x40+6);
}
}
}

}


二:写年刷新函数时候,因为月日周的范围都在100以内,用unsigned char型变量就能够表示整个范围内的数值,但是函数中设计年的表示范围是0-9999,所以用int型变量来定义。在传递写显示的起始地址时,没有考虑到LCD1602中char型变量为一个字节,占据一个显示位;而int型变量为两个字节,写数据完成后数据指针指向两个显示位之后,所以年的显示出现了混乱,理清楚int型数据的数据指针指向后,将写数据前的指针位置指向两个显示位之前,实现了年数据的正常显示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值