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 为加减,需要完整程序的化可以留下邮箱,我发过去给你看下。
展开
 我来答
烟火夜空
2014-04-20 · TA获得超过6623个赞
知道大有可为答主
回答量:1678
采纳率:93%
帮助的人:567万
展开全部
我觉得这种思想 适合写 汇编,写C语言的话,还是先练习下数学规律吧。

主函数中 肯定调用了 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; //清 按键准备标志位
}
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式