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

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, 但这是这篇文章提到的禁忌。请问大家还有什么其他的办法,或者更好的键盘驱动程序的思路吗???
谢谢了!!!

*****************************************************************************************************************************************
把这个文档也上传了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
Etual
2020-02-06 16:26
void key_scan(void)
{
        uchar key;
       
        key = read_key_port();
       
        if (key == 0) {
                // key up
                bit_key_on = 0;
                return;
        }

        if (bit_key_on) {
                return;
        }

        bit_key_on = 1;

        do_key_func();
}

一周热门 更多>