搜索
bottom↓
回复: 12

按键扫描程序,消抖处理

[复制链接]

出0入0汤圆

发表于 2012-4-30 19:44:47 | 显示全部楼层 |阅读模式
下面的按键检测程序有问题吗?还可不可以优化???
unsigned char Key_Value=0xFF,tmp;

Key_Value=KEY_PIN & ((1<<S1)|(1<<S2)|(1<<S3)|(1<<S4));//取得当前按键值,0,1,4,5位的值
if( Key_Value != ((1<<S1)|(1<<S2)|(1<<S3)|(1<<S4)) )//若是某一位为0,则表示有键按下
         {
        delay_nms(2);//先延时两ms,          
                if( (KEY_PIN & ((1<<S1)|(1<<S2)|(1<<S3)|(1<<S4))) == Key_Value )//再次检测,如果还是为0,表示键确实已经按下,而不是抖动
                 {
                  Key_Value=KEY_PIN & ((1<<S1)|(1<<S2)|(1<<S3)|(1<<S4));//获取按键值
                  //NOP();
                    while(( KEY_PIN & ((1<<S1)|(1<<S2)|(1<<S3)|(1<<S4)) )!= ((1<<S1)|(1<<S2)|(1<<S3)|(1<<S4)));//等待按键松开               
                     delay_nms(1);                  
                             while(( KEY_PIN & ((1<<S1)|(1<<S2)|(1<<S3)|(1<<S4)) )!= ((1<<S1)|(1<<S2)|(1<<S3)|(1<<S4)));//等待按键松开               
                     }
         }
         
return Key_Value;
     红色部分,为什么等待按键放开,还要判断两次,难道也类似于消除抖动?
   蓝色部分,延时2ms够不够?
  

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-4-30 21:27:21 | 显示全部楼层
我讨厌按键扫描中用到延时

出0入0汤圆

发表于 2012-4-30 21:30:59 | 显示全部楼层
1、根据你的实际电路尽量减少延时的时间
2、这个扫描可以用定时中断做,就不需要空跑了

出0入0汤圆

 楼主| 发表于 2012-5-1 12:41:14 | 显示全部楼层
lxk52000 发表于 2012-4-30 21:27
我讨厌按键扫描中用到延时

可是为了消抖,不得不这样做呢。

出0入0汤圆

 楼主| 发表于 2012-5-1 12:42:25 | 显示全部楼层
exilefox 发表于 2012-4-30 21:30
1、根据你的实际电路尽量减少延时的时间
2、这个扫描可以用定时中断做,就不需要空跑了 ...

用定时中断做按键扫描?怎么做?你是说延时用定时中断实现,这样比较准确吗?好像软件延时没有定时那么准确...

出0入0汤圆

发表于 2012-5-1 13:36:28 | 显示全部楼层
http://www.ourdev.cn/forum.php?m ... B%E4%B8%89%E8%A1%8C
的确是。。程序里尽量少用延时函数,楼主看看上面的帖子,这种方法个人觉得不错。

放到中断处理也可以,不过我现在的情况一般不这么做。

出0入0汤圆

 楼主| 发表于 2012-5-1 13:57:01 | 显示全部楼层
hotfleet 发表于 2012-5-1 13:36
http://www.ourdev.cn/forum.php?mod=viewthread&tid=4308630&highlight=%E6%8C%89%E9%94%AE%2B%E4%B8%89%E ...

好的,谢谢~~

出0入0汤圆

发表于 2013-1-30 11:10:05 | 显示全部楼层
按键扫描最好放到中断里吧

出0入0汤圆

发表于 2013-1-30 18:46:24 | 显示全部楼层
lxk52000 发表于 2012-4-30 21:27
我讨厌按键扫描中用到延时

可以用计数的方式,扫描一次就计一次,看同样的按键计了多少次,超过一定的次数就认为是按键按下,这样就不用延时了

出50入0汤圆

发表于 2013-1-30 20:25:15 | 显示全部楼层
红色部分应该是对用户按下了按键后不放进行的处理。

出0入0汤圆

发表于 2013-1-30 23:46:23 | 显示全部楼层
红色部分也是为了去抖吧

出0入0汤圆

发表于 2013-1-31 00:41:50 | 显示全部楼层
我讨厌按键扫描中用到延时+1

出0入0汤圆

发表于 2013-1-31 21:05:45 | 显示全部楼层
方中断更好
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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