OpenEdv-开源电子网

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

KEY_Scan 增加按键防抖

[复制链接]

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
发表于 2014-9-17 11:39:30 | 显示全部楼层 |阅读模式
在原来程序基础上,增加了按键防抖功能,可行否?请大家指正。
u8 KEY_Scan(u8 mode)
{  
    static u8 key_up=1;//按键按松开标志
    static u8 oldkey=1;//老按键:松开
    static u8 newkey=1;//新按键:松开
    static u8 fangdou; //防抖
if(KEY1==0||KEY2==0||KEY3==0)  //有键按下
{
   newkey=0; //新按键:按下
}
else
{
   newkey=1;  //新按键:松开
}
if(newkey==oldkey) //新按键=老按键?
{
   fangdou=1; //防抖成功
}
else
{
   fangdou=0; //防抖失败
}
oldkey=newkey; //更新老按键
if(mode)key_up=1;  //支持连按  
if(key_up&&fangdou&&(KEY1==0||KEY2==0||KEY3==0))  //加入了防抖成功判断
{
delay_ms(10);//去抖动 
key_up=0;
if(KEY1==0)return K1;
else if(KEY2==0)return K2;
else if(KEY3==0)return K3;
}else if(fangdou&&(KEY1==1&&KEY2==1&&KEY3==1)) //加入了防抖成功判断
   key_up=1;    
  return 0;// 无按键按下
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-9-17 12:43:15 | 显示全部楼层
原文不就是有这个delay_ms(10);消抖了么,你还加啊
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13138
金钱
13138
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-9-17 13:30:55 | 显示全部楼层
不明白楼主想干啥。。。
学无止境
回复 支持 反对

使用道具 举报

12

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2014-8-6
在线时间
8 小时
 楼主| 发表于 2014-9-18 12:18:54 | 显示全部楼层
按键防抖的思路是:
一,若判断有按键按下,延迟10ms,延迟过后若按键还是按下,则判定为“按下”;[/mw_shl_code]


一,若判断有按键松开,延迟10ms,延迟过后若按键还是松开,则判定为“松开”。[/mw_shl_code]
原程序只判断了一次。
详见见流程图。[/mw_shl_code]
u8 KEY_Scan(u8 mode)
{  
static u8 key_up=1;//按键按松开标志
 static u8 oldkey=1;//老按键:松开
 u8 newkey;//新按键
 u8 fangdou; //防抖
if(KEY1==0||KEY2==0||KEY3==0)  //有键按下
    newkey=0; //新按键:按下
else newkey=1;  //新按键:松开
if(newkey==oldkey) //新按键=老按键?
    fangdou=1; //防抖成功
else fangdou=0; //防抖失败
oldkey=newkey; //更新老按键   
if(mode)key_up=1;  //支持连按  
if(key_up&&fangdou&&(KEY1==0||KEY2==0||KEY3==0))  //加入了fangdou防抖成功
{
delay_ms(10);//去抖动 
key_up=0;
if(KEY1==0)return K1;
else if(KEY2==0)return K2;
else if(KEY3==0)return K3;
}else if(fangdou&&(KEY1==1&&KEY2==1&&KEY3==1)) //加入了fangdou防抖成功
    key_up=1;    
return 0;// 无按键按下[/mw_shl_code]
}
[/mw_shl_code]

按键防抖流程图.doc

64.5 KB, 下载次数: 542

回复 支持 反对

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-9-18 13:49:38 | 显示全部楼层
回复【4楼】jnfxt95:
---------------------------------

你应该这样,判断有按键按下了,就是说电平有变化了,10MS或者5MS或者其他时间判断一次,判断多少次还是按下的,比如10次电平没有变化,如果是5ms判断一次,就是去抖50MS了。至于时间怎么给,你自己想想了。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 03:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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