51单片机做的时钟 ds1302 通过按键改变时间,写了个按键程序,但下进去不好用,求大神指点!
#include<reg52.h>#include"keyscan.h"#include"delay.h"#include"ds1302.h"unsignedcharnu...
#include<reg52.h>
#include"keyscan.h"
#include"delay.h"
#include"ds1302.h"
unsigned char num,k1num=0;
void keyscan()
{
num=keynum();
if(k1!=0)
{
if(k2==0)
{
DelayMs(10);
if(k2==0)
{
switch(num)
{
case 1:
time_buf[4]++;if(time_buf[4]==24) time_buf[4]=0; //time_buf[4]是 时
Ds1302_Write_Time();
break;
case 2:
time_buf[5]++; if(time_buf[5]==60) time_buf[5]=0; //time_buf[5]是分
Ds1302_Write_Time();
break;
default:break;
}
}
}
if(k3==0)
DelayMs(10);
if(k3==0)
{
switch(num)
{
case 1:
time_buf[4]--;if(time_buf[4]==255)time_buf[4]=23;
Ds1302_Write_Time();
break;
case 2:
time_buf[5]--;if(time_buf[5]==255)time_buf[5]=59;
Ds1302_Write_Time();
break;
default:break;
}
}
}
}
unsigned char keynum(void)
{
if(k1==0)
{
DelayMs(10);
if(k1==0)
{
k1num++;
}
if(k1num==3) k1num=1;
}
return k1num;
}
大体思路就是k1键的次数可以确定改变时 或分,k2 k3 为加减,需要完整程序的化可以留下邮箱,我发过去给你看下。 展开
#include"keyscan.h"
#include"delay.h"
#include"ds1302.h"
unsigned char num,k1num=0;
void keyscan()
{
num=keynum();
if(k1!=0)
{
if(k2==0)
{
DelayMs(10);
if(k2==0)
{
switch(num)
{
case 1:
time_buf[4]++;if(time_buf[4]==24) time_buf[4]=0; //time_buf[4]是 时
Ds1302_Write_Time();
break;
case 2:
time_buf[5]++; if(time_buf[5]==60) time_buf[5]=0; //time_buf[5]是分
Ds1302_Write_Time();
break;
default:break;
}
}
}
if(k3==0)
DelayMs(10);
if(k3==0)
{
switch(num)
{
case 1:
time_buf[4]--;if(time_buf[4]==255)time_buf[4]=23;
Ds1302_Write_Time();
break;
case 2:
time_buf[5]--;if(time_buf[5]==255)time_buf[5]=59;
Ds1302_Write_Time();
break;
default:break;
}
}
}
}
unsigned char keynum(void)
{
if(k1==0)
{
DelayMs(10);
if(k1==0)
{
k1num++;
}
if(k1num==3) k1num=1;
}
return k1num;
}
大体思路就是k1键的次数可以确定改变时 或分,k2 k3 为加减,需要完整程序的化可以留下邮箱,我发过去给你看下。 展开
展开全部
我觉得这种思想 适合写 汇编,写C语言的话,还是先练习下数学规律吧。
主函数中 肯定调用了 keyscan 函数,keyscan 函数里面对 K1按键进行了扫描,除去10ms去抖延时,对K1按键进行次数记录(有效值2个,分别是1 和2);
返回 keyscan 函数,如果按键没松开,那么不执行内容,则退出 keyscan 函数,返回主函数;
主函数肯定是 循环调用 keyscan 函数,重新对 K1按键进行扫描计数,
可是 ……可是……这段时间 对 人类来讲,太短了,最大不过ms级(除去消抖时间,都是us级),LZ的手甚至都来不及 松开,就 重复发生了;所以,按键又被 计算了 一次,紧接着 又被计算了一次,再接着又计算了一次………………也不知道计算了多少次,终于LZ的手松开了,可是K1的计算值,到底是 奇数次(1) 还是 偶数次(2) 呢???????没有人知道。
LZ:没有人,K1num 到底是 1 还是 2啊?
没有人:我不知道啊,谁跟你说我知道的?
我不 (和) 谁跟你说我 (一起说):我不知道啊!
主函数中 肯定调用了 keyscan 函数,keyscan 函数里面对 K1按键进行了扫描,除去10ms去抖延时,对K1按键进行次数记录(有效值2个,分别是1 和2);
返回 keyscan 函数,如果按键没松开,那么不执行内容,则退出 keyscan 函数,返回主函数;
主函数肯定是 循环调用 keyscan 函数,重新对 K1按键进行扫描计数,
可是 ……可是……这段时间 对 人类来讲,太短了,最大不过ms级(除去消抖时间,都是us级),LZ的手甚至都来不及 松开,就 重复发生了;所以,按键又被 计算了 一次,紧接着 又被计算了一次,再接着又计算了一次………………也不知道计算了多少次,终于LZ的手松开了,可是K1的计算值,到底是 奇数次(1) 还是 偶数次(2) 呢???????没有人知道。
LZ:没有人,K1num 到底是 1 还是 2啊?
没有人:我不知道啊,谁跟你说我知道的?
我不 (和) 谁跟你说我 (一起说):我不知道啊!
追问
我刚刚开始接触c51,感谢大神百忙之中来看我这个小白写的程序,你的话我理解了,可是我应该怎么修改程序啊,求指点下
追答
最操蛋的修改是:继续使用 汇编思想 编C语言程序,
K1按下,计数完成后,等待 按键 松开;这样会导致在按着不放的时候,系统是瘫痪的。
最合理的修改是:改用 C编程思想 编 C语言程序,
通过记录 按键的前、后状态,识别是否按下,是否松开,两个条件满足后才进行 计数,父函数通过识别计数结果 进行下一步程序处理;
例程:火柴天堂作品(即本人)
uchar KeyScan() //按键扫描函数
{
if(!K1) return 1; //返回对应键值
return 0; //非以上按键,返回0
}
void KeyResp() //按键响应函数
{
static uchar KeyValue; //定义静态变量 存储按键值
static bit KeyDownFlag,KeyReadyFlag; //定义静态变量 按键按下标志位,按键准备(响应)标志位
uchar key_value=KeyScan(); //调用 按键扫描函数,并将扫描结果放在 key_value中
if(key_value) //若扫描结果 有按键
{
//KeyValue=key_value; //存储按键值(多键用)
KeyDownFlag=TRUE; //按键按下标志位 置位
KeyReadyFlag=TRUE; //按键准备(响应)标志位 置位
}
else KeyDownFlag=FALSE; //若扫描结果 无按键,则 清 按键按下标志位
if(KeyReadyFlag && !KeyDownFlag) //若按键准备就绪,且无按键按下,则表示已松手情况
{
K1num++; //按LZ要求修改的语句
if(K1num==3) K1num=1; //按LZ要求修改的语句
KeyValue=0; //清 按键值
KeyReadyFlag=FALSE; //清 按键准备标志位
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询