LINUX驱动开发学习笔记--按鍵驱动消抖原理

按键介绍: 按键通过连接一个 IO,将这个 IO配置为 输入功能,读取这个 IO的值即可获取按键的状态 (按下或松开 )

Q:按键为什么需要消抖?
A: 理想情况下,按键按下和松开只需要要判断高低电平即可,但是实际的按键是机械结构,加上刚按下去的一瞬间人手可能也有抖动,理想的按压情况和实际的按键电压变化如下图所示


理想情况下的电平变化
在这里插入图片描述
实际情况下的电平变化

t1 时刻按键被按下,但是由于抖动的原因,直到t2 时刻才稳定下来,t1 到t2 这段时间就是抖动。一般这段时间就是十几ms 左右,从图中可以看出在抖动期间会有多次触发,如果不消除这段抖动的话软件就会误判,本来按键就按下了一次,结果软件读取IO 值发现电平多次跳变以为按下了多次。

Q:如何消抖?
A:
方法一:检测到电平变化后 延时10ms左右,再读一次电平变化,如果还一样,那就说明按键稳定了

int key_getvalue(void) 
 { 
  int ret = 0;
  static unsigned char release = 1; /* 按键松开 */ 
 if((release==1)&&(gpio_pinread(GPIO1, 18) == 0)) /* KEY0按下 */ 
 {  
  delay(10); /* 延时消抖 */ 
 release = 0; /* 标记按键按下 */ 
 if(gpio_pinread(GPIO1, 18) == 0)
{
  ret = KEY0_VALUE; 
 }  else if(gpio_pinread(GPIO1, 18) == 1) /* KEY0未按下 */ 
{ 
 ret = 0; 
 release = 1; /* 标记按键释放 */
 }
 return ret;
 }

方法二:用延时消抖很简单,但是会浪费cpu性能,因为在延时函数里面 CPU什么都做不了。如果按键使用中断的话更不能在中断里面使用延时函数,因为中断服务函数要快进快出,我们可以使用定时器来实现按键消抖,不会浪费cpu性能,这个也是 Linux驱动里面按键消抖的做法。
按键采用中断驱动方式,当按键按下以后触发按键中断,在按键中断中开启一个定时器,定时周期为10ms,当定时时间到了以后就会触发定时器中断,最后在定时器中断处理函数中读取按键的值,如果按键值还是按下状态那就表示这是一次有效的按键。
在这里插入图片描述
t1~t3 这一段时间就是按键抖动,是需要消除的。设置按键为下降沿触发,因
此会在t1、t2 和t3 这三个时刻会触发按键中断,每次进入中断处理函数都会重新开器定时器中断,所以会在t1、t2 和t3 这三个时刻开器定时器中断。但是t1~t2 和t2~t3 这两个时间段是小于我们设置的定时器中断周期(也就是消抖时间,比如10ms),所以虽然t1 开启了定时器,但是定时器定时时间还没到呢t2 时刻就重置了定时器,最终只有t3 时刻开启的定时器能完整的完成整个定时周期并触发中断,我们就可以在中断处理函数里面做按键处理了。
此部分贴一下伪代码

void timer_restart(int value)
{
  close TIMER;//先关闭定时器()
  TIMER = VALUE;//定义计数值(多长时间进定时器中断)
  OPEN TIMER;//开启定时器
}
void timer_stop()
{
  close TIMER;//先关闭定时器()
}
void key_irqhander()
{
  timer_restart(10);//10ms定时器中断开启
  key_clear_flag();//清key中断标志位
}
void timer_irqhander()
{
  static unsigned char state = OFF;
  if(sr==10)//判断计数值到10ms了
  {
    timer_stop();
    if(gpio_pinread(GPIO1, 18) == 0)
    {
      //按键按下
      state = !state;      
    }
    timer_clear_flag;
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值