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

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-06 10:52
Etual 发表于 2012-5-29 10:27
设置标志位,当第一次按下的时候标志位1,只有当按键弹起的时候标志才为0

那么判断这个标志,如果为0  表 ...

那么再请教一下,这个标志位该加在什么地方呢?
1 如果加在键盘驱动程序 case里面 那么刚在主函数里不能实现步进加1的原因就是在20ms扫描一次的情况下 在按下的时候有多次扫描到键盘按下
它也就会多次使标志位置1 这样还是没有起到效果。
Etual
2楼-- · 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();
}
tangaoo
3楼-- · 2020-02-06 19:31
startwar0418 发表于 2012-5-29 10:30
比如说按键值 是 1,没按下时是 0
每次都记录上一次判断的按键值
判断 上一次有按键值是 1 并且当前值是0  ...

您的意思就是说要有两个标志位?能稍微讲具体一点吗 谢谢了
startwar0418
4楼-- · 2020-02-06 22:16
9L的方法就很好啊
我说的方法可能有问题,就是长按时那个数字一直不会加,只能等到抬起按键时才加,而且我说的方法似乎要笨些。
我改成按键按下时+1
uchar key,lastkey;
fun()
{
    key=read_key();
    if((key!=0)&&(lastkey==0))
    {
        //根据按键key的值做你要做的事
    }
    lastkey=key;
}
BXAK
5楼-- · 2020-02-07 03:19
 精彩回答 2  元偷偷看……
tangaoo
6楼-- · 2020-02-07 08:51
Etual 发表于 2012-5-29 11:07  void key_scan(void)  {  uchar key;

这个方法相当不错,长见识了,谢谢您!能把return用的这么好!

一周热门 更多>