12下一页
返回列表 发新帖我要提问本帖赏金: 3.00元(功能说明)

【新手觉得】按键消抖,没有必要松手检测

[复制链接]
7131|26
 楼主| cov0xt 发表于 2015-12-15 09:21 | 显示全部楼层 |阅读模式
本帖最后由 cov0xt 于 2015-12-15 09:44 编辑

单片机的反应速度比人类快得多,所以要2次检测按键是否按下,并延迟一段时间,才算确定按键按下,教程里给了如下代码:

unsigned char Key_Scan()
{
        unsigned char keyValue = 0 , i; //保存键值

        //--检测按键1--//
        if (GPIO_KEY != 0xFF)                //检测按键K1是否按下
        {
                Delay10ms(1);        //消除抖动

                if (GPIO_KEY != 0xFF)        //再次检测按键是否按下
                {
                        keyValue = GPIO_KEY;
                        i = 0;
                        while ((i<50) && (GPIO_KEY != 0xFF))         //检测按键是否松开
                        {
                                Delay10ms(1);
                                i++;
                        }
                }
        }

        return keyValue;   //将读取到键值的值返回
}

问题来了,我认为该代码的松手检测,是没有必要的。

该代码表示,在500毫秒内,如果松手了,则不用等完所有的500毫秒。

我觉得人类不可能在500毫秒内,完成松手动作,还不如不检测松手,直接等上500毫秒呢,松手代码直接改为:Delay10ms(50);

unsigned char Key_Scan()
{
        unsigned char keyValue = 0i; //保存键值

        //--检测按键1--//
        if (GPIO_KEY != 0xFF)                //检测按键K1是否按下
        {
                Delay10ms(1);        //消除抖动

                if (GPIO_KEY != 0xFF)        //再次检测按键是否按下
                {
                        keyValue = GPIO_KEY;
                        Delay10ms(50);
                }
        }

        return keyValue;   //将读取到键值的值返回
}

打赏榜单

21ic小喇叭 打赏了 3.00 元 2015-12-16

dirtwillfly 发表于 2015-12-15 09:30 | 显示全部楼层
不错不错,楼主有想法,很赞加油
大头BB 发表于 2015-12-15 09:34 | 显示全部楼层
10*50=500
 楼主| cov0xt 发表于 2015-12-15 09:43 | 显示全部楼层

哦,写错了,谢谢提醒……
圣骑士by 发表于 2015-12-15 09:44 | 显示全部楼层
我现在已经不用这种读键方案了。

用1ms定时,判断IO状态,如果是按下就用一个变量累加,当变量大于10的时候认为是按键按下,当500ms内抬起,认为是一次短按,当按住2000ms以上认为是长按
以上参考电脑键盘的模式 提供按键按下、短按、长按、抬起 事件。

评论

赞一个,不过可以不用那么快检测,10ms足够了  发表于 2015-12-18 09:23
很好的想法。  发表于 2015-12-15 19:07

评分

参与人数 2威望 +2 收起 理由
Cary_Liu + 1 赞一个!
cov0xt + 1 受教了

查看全部评分

liuxing4585 发表于 2015-12-15 09:46 | 显示全部楼层
这种死等白白浪费时间,还不如用定时中断来累加判断。
qhdjxy 发表于 2015-12-15 10:32 | 显示全部楼层
这个我还真测过,人手速最快可以到50ms左右。你可以自己试试。。。

评分

参与人数 1威望 +1 收起 理由
dirtwillfly + 1 赞一个!竟然真试过

查看全部评分

undersky 发表于 2015-12-15 10:39 | 显示全部楼层
讨论一下:
检测按键松开的作用是为了按一次按键,只检测到一次动作。如果不判断松开,按照楼主死等500s的话,就会产生多次按键动作。
楼主可以设想下,如果你的手一直按着按键时,两种按键检测方式有什么区别。
gmm2015 发表于 2015-12-15 10:58 | 显示全部楼层
1、是500毫秒,不是50
2、如果没有抬起操作,则按键功能可能多次触发
datouyuan 发表于 2015-12-15 11:05 | 显示全部楼层
我觉得人类不可能在500毫秒内,完成松手动作


楼主这感觉是有问题的,反应再迟钝的人也能每秒完成2次按键操作,而松手动作只是按键操作的一个步骤.
dirtwillfly 发表于 2015-12-15 11:16 | 显示全部楼层
undersky 发表于 2015-12-15 10:39
讨论一下:
检测按键松开的作用是为了按一次按键,只检测到一次动作。如果不判断松开,按照楼主死等500s的 ...

对的。
丁弋宇 发表于 2015-12-15 19:46 | 显示全部楼层
按键我是用定时采点(5或者10ms周期)+状态机写的
就说这么多
lz自己领会
我是祝大叔 发表于 2015-12-15 22:45 | 显示全部楼层
我曾经实验说,从按下到释放,最快速度大约50毫秒,正常速度为100-200毫秒。
cedar_renjun 发表于 2015-12-16 20:05 | 显示全部楼层
LZ搜一下 按键状态机
chengg9999 发表于 2015-12-17 09:08 | 显示全部楼层
继续加油,加油
1021352522 发表于 2015-12-17 22:46 | 显示全部楼层
这种程序,不适合工程需要啊
yu515301489 发表于 2015-12-18 09:24 | 显示全部楼层
gmm2015 发表于 2015-12-15 10:58
1、是500毫秒,不是50
2、如果没有抬起操作,则按键功能可能多次触发

他这样延时了,如果按着不动和你那样是一样的效果。
zhixiaoyuhong 发表于 2015-12-19 10:10 | 显示全部楼层
这东西还是要看需求和应用吧。有的需要,有的不需要。。。
dirtwillfly 发表于 2015-12-19 10:57 | 显示全部楼层
zhixiaoyuhong 发表于 2015-12-19 10:10
这东西还是要看需求和应用吧。有的需要,有的不需要。。。

是的。大家讨论的是思路
emyhello 发表于 2015-12-19 22:34 | 显示全部楼层
delay ms,死等???教科书害人不浅啊!
工程上还是用软定时器+状态机的。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

200

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部