OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8424|回复: 13

按键消抖总是消不干净,请问有没有好的方法?就用的最普通的按键

[复制链接]

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
发表于 2016-1-7 15:00:40 | 显示全部楼层 |阅读模式
3金钱
[mw_shl_code=c,true]void EXTI0_IRQHandler(void)
{
        delay_ms(10);//消抖
        if(WK_UP==0)                  //清零按键
        {               
                         count1=0;//所有数置零
                         count2=0;//所有数置零
                         bushuge=0;//所有数置零
                   bushushi=0;//所有数置零
                         mbushushi=0;//所有数置零
                         mbushuge=0;//所有数置零
                countz=count1*10+count2;//所有数置零
                bushu=bushushi*10+bushuge;//所有数置零
                mbushu=mbushushi*10+mbushuge;//所有数置零
                        printf("%d\n",countz);//打印到串口
        }
        EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

你写按键就专门考虑按键扫描,不要在按键扫描里面做其他事情。函数的内聚性一定要强,做成模块,除了按键这个事情,其他事情都无关,你调用只管返回一个键值调用就行,至于键值用来做什么,你得到键值再考虑,这样考虑就会想尽办法把按键扫描怎样做好了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1783
金钱
1783
注册时间
2014-6-27
在线时间
964 小时
发表于 2016-1-7 15:00:41 | 显示全部楼层
你写按键就专门考虑按键扫描,不要在按键扫描里面做其他事情。函数的内聚性一定要强,做成模块,除了按键这个事情,其他事情都无关,你调用只管返回一个键值调用就行,至于键值用来做什么,你得到键值再考虑,这样考虑就会想尽办法把按键扫描怎样做好了。
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-1-7 15:06:30 | 显示全部楼层
本帖最后由 BMN李 于 2016-1-7 15:09 编辑

[mw_shl_code=c,true]void EXTI0_IRQHandler(void)
{
    //增加判断
    if(WK_UP == 0)       //清零按键
    {
        //增加延时
        delay_ms(20);//消抖
        if(WK_UP == 0)       //清零按键
        {
            count1 = 0; //所有数置零
            count2 = 0; //所有数置零
            bushuge = 0; //所有数置零
            bushushi = 0; //所有数置零
            mbushushi = 0; //所有数置零
            mbushuge = 0; //所有数置零
            countz = count1 * 10 + count2; //所有数置零
            bushu = bushushi * 10 + bushuge; //所有数置零
            mbushu = mbushushi * 10 + mbushuge; //所有数置零
            printf("%d\n", countz); //打印到串口
        }
    }
    EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
}[/mw_shl_code]
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-2-25
在线时间
229 小时
发表于 2016-1-7 15:10:18 | 显示全部楼层
在IO引脚上面加一个电容试试看。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-2-25
在线时间
229 小时
发表于 2016-1-7 15:11:36 | 显示全部楼层
没有使用过外部中断作为按键检测的,你可以试试直接扫描的方式,或者在定时器中断中扫描按键也是不错的选择
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-7 15:26:50 | 显示全部楼层
1201yuge 发表于 2016-1-7 15:11
没有使用过外部中断作为按键检测的,你可以试试直接扫描的方式,或者在定时器中断中扫描按键也是不错的选择

那钱荣大小如何选择呢?能讲一下为什么加电容吗
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-7 15:27:08 | 显示全部楼层
BMN李 发表于 2016-1-7 15:06
[mw_shl_code=c,true]void EXTI0_IRQHandler(void)
{
    //增加判断

谢谢,我试一下
回复

使用道具 举报

2

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2016-1-2
在线时间
13 小时
发表于 2016-1-7 17:13:24 | 显示全部楼层
定时5MS打点扫描,连续5次按下,为真按下。
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2016-1-7 18:57:37 | 显示全部楼层
论坛有不少人写的基于状态机的按键检测挺好的啊,搜搜吧
我是菜鸟
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2016-1-7 20:01:33 | 显示全部楼层
本帖最后由 229382777@qq.com 于 2016-1-7 20:04 编辑

你的按键中断处理的东西真是多啊,不建议在中断里面处理那么多事,考虑实际项目不能在中断里面用delay那样消抖,最普通的按键实现可以有多种方式,如楼上所说的论坛很多人分享过他们的方法,下面的帖子就是一个,你可以参考,觉得不够你可以善用论坛的搜索功能
http://www.openedv.com/forum.php ... hlight=%B0%B4%BC%FC
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-11-24
在线时间
5 小时
发表于 2016-1-7 21:17:28 来自手机 | 显示全部楼层
中断中用delay延时,这很糟糕!!!普通按键就不建议开个中断了,多一级中断嵌套多个麻烦,推荐定时扫描计数变量达到时间确认按键有效
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-7 21:56:21 | 显示全部楼层
没有对象的程序员 发表于 2016-1-7 21:17
中断中用delay延时,这很糟糕!!!普通按键就不建议开个中断了,多一级中断嵌套多个麻烦,推荐定时扫描计 ...

谢谢,我会改进的
回复

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-12-28
在线时间
17 小时
 楼主| 发表于 2016-1-7 21:57:47 | 显示全部楼层
TinyBoy 发表于 2016-1-7 20:51
你写按键就专门考虑按键扫描,不要在按键扫描里面做其他事情。函数的内聚性一定要强,做成模块,除了按键这 ...

谢谢提醒,我记住了!
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-7 22:38:28 | 显示全部楼层
1、按键处理最好不要用中断(使用中断定时扫描也不推荐);
2、严禁使用跳变沿捕捉按键事件(除非在硬件上已经消抖了);
3、按键处理严禁用延时,否则Core-I7都不够你用的。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表