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

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

[复制链接]
6410|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 | 只看该作者

哦,写错了,谢谢提醒……

使用特权

评论回复
5
圣骑士by| | 2015-12-15 09:44 | 只看该作者
我现在已经不用这种读键方案了。

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

使用特权

评论回复
评论
yu515301489 2015-12-18 09:23 回复TA
赞一个,不过可以不用那么快检测,10ms足够了 
huzi741 2015-12-15 19:07 回复TA
很好的想法。 
评分
参与人数 2威望 +2 收起 理由
Cary_Liu + 1 赞一个!
cov0xt + 1 受教了
6
liuxing4585| | 2015-12-15 09:46 | 只看该作者
这种死等白白浪费时间,还不如用定时中断来累加判断。

使用特权

评论回复
7
qhdjxy| | 2015-12-15 10:32 | 只看该作者
这个我还真测过,人手速最快可以到50ms左右。你可以自己试试。。。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
dirtwillfly + 1 赞一个!竟然真试过
8
undersky| | 2015-12-15 10:39 | 只看该作者
讨论一下:
检测按键松开的作用是为了按一次按键,只检测到一次动作。如果不判断松开,按照楼主死等500s的话,就会产生多次按键动作。
楼主可以设想下,如果你的手一直按着按键时,两种按键检测方式有什么区别。

使用特权

评论回复
9
gmm2015| | 2015-12-15 10:58 | 只看该作者
1、是500毫秒,不是50
2、如果没有抬起操作,则按键功能可能多次触发

使用特权

评论回复
10
datouyuan| | 2015-12-15 11:05 | 只看该作者
我觉得人类不可能在500毫秒内,完成松手动作


楼主这感觉是有问题的,反应再迟钝的人也能每秒完成2次按键操作,而松手动作只是按键操作的一个步骤.

使用特权

评论回复
11
dirtwillfly| | 2015-12-15 11:16 | 只看该作者
undersky 发表于 2015-12-15 10:39
讨论一下:
检测按键松开的作用是为了按一次按键,只检测到一次动作。如果不判断松开,按照楼主死等500s的 ...

对的。

使用特权

评论回复
12
丁弋宇| | 2015-12-15 19:46 | 只看该作者
按键我是用定时采点(5或者10ms周期)+状态机写的
就说这么多
lz自己领会

使用特权

评论回复
13
我是祝大叔| | 2015-12-15 22:45 | 只看该作者
我曾经实验说,从按下到释放,最快速度大约50毫秒,正常速度为100-200毫秒。

使用特权

评论回复
14
cedar_renjun| | 2015-12-16 20:05 | 只看该作者
LZ搜一下 按键状态机

使用特权

评论回复
15
chengg9999| | 2015-12-17 09:08 | 只看该作者
继续加油,加油

使用特权

评论回复
16
1021352522| | 2015-12-17 22:46 | 只看该作者
这种程序,不适合工程需要啊

使用特权

评论回复
17
yu515301489| | 2015-12-18 09:24 | 只看该作者
gmm2015 发表于 2015-12-15 10:58
1、是500毫秒,不是50
2、如果没有抬起操作,则按键功能可能多次触发

他这样延时了,如果按着不动和你那样是一样的效果。

使用特权

评论回复
18
zhixiaoyuhong| | 2015-12-19 10:10 | 只看该作者
这东西还是要看需求和应用吧。有的需要,有的不需要。。。

使用特权

评论回复
19
dirtwillfly| | 2015-12-19 10:57 | 只看该作者
zhixiaoyuhong 发表于 2015-12-19 10:10
这东西还是要看需求和应用吧。有的需要,有的不需要。。。

是的。大家讨论的是思路

使用特权

评论回复
20
emyhello| | 2015-12-19 22:34 | 只看该作者
delay ms,死等???教科书害人不浅啊!
工程上还是用软定时器+状态机的。。。

使用特权

评论回复
发新帖 本帖赏金 3.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

200

帖子

3

粉丝