求助!看了《从单片机初学者迈向单片机工程师》后遇到.....

2020-02-05 09:02发布

本帖最后由 tangaoo 于 2012-5-28 09:16 编辑

***********************************************************题目要求********************************************************************
用按键和数码管以及单片机定时器实现一
个简易的可以调整的时钟,要求如下:
8位数码管显示,显示格式如下
时-分-秒
XX-XX-XX
要求:系统有四个按键,功能分别是调整,加,减,确定。在按下调整键时候,显示时的
两位数码管以1 Hz 频率闪烁。如果再次按下调整键,则分开闪烁,依次循环,直到按下确
定键,恢复正常的显示。在数码管闪烁的时候,按下加或者减键可以调整相应的显示内容。
按键支持短按,和长按,即短按时,修改的内容每次增加一或者减小一,长按时候以一定速
率连续增加或者减少。

***********************************************************我遇到的问题******************************************************************
这是文档上提到的小题目,我的键盘驱动是按文档上上面的想法写着。但是遇到了问题。因为我要一个键位调整键(如KEY1),KEY1每按一下这计数器(Count++)一下。
那么我判断 if KEY1 = 1 是调整秒钟 时间停止走动
           if KEY1 = 2 是调整分钟
           if KEY1 = 3 是调整时钟
           if KEY1 = 4 时恢复
但是我遇到的问题就是按文档上的思路写的驱动无法保证每次键按下时,不能保证Count每次只加1,只能用while(!KEY);, 阻止程序才能保证每次只加1, 但这是这篇文章提到的禁忌。请问大家还有什么其他的办法,或者更好的键盘驱动程序的思路吗???
谢谢了!!!

*****************************************************************************************************************************************
把这个文档也上传了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
tangaoo
1楼-- · 2020-02-05 12:19
 精彩回答 2  元偷偷看……
startwar0418
2楼-- · 2020-02-05 14:47
不要在按下去时就+1,在确定按下又抬起时+1
tangaoo
3楼-- · 2020-02-05 16:07
startwar0418 发表于 2012-5-29 09:55
不要在按下去时就+1,在确定按下又抬起时+1

/* 按键返回值状态 */
#define    KEY_PRESS       0x80           //按下
#define    KEY_LONG        0x40           //长按
#define    KEY_CONTINUE    0x20           //连按
#define    KEY_RELEASE     0x10           //释放

键盘有这四个状态是吧? 我试过无论是在那个状态下,都不能保证每次count++只加一次???
Etual
4楼-- · 2020-02-05 21:01
设置标志位,当第一次按下的时候标志位1,只有当按键弹起的时候标志才为0

那么判断这个标志,如果为0  表示第一次按下,执行功能,如果为1 表示之前已经处理过了,不处理。
y574924080
5楼-- · 2020-02-06 02:14
按键是20毫秒查询一次
startwar0418
6楼-- · 2020-02-06 05:04
 精彩回答 2  元偷偷看……

一周热门 更多>