驱动之按键防抖

1.按键抖动就是按键按下的这段时间里产生了多次按键按下和抬起信号,也就是会产生多次按键中断。
2.为了保证读取的值是准确的,则应该在最后一次中断里读取按键值,定时器的解决思想是,因为定时器也会在指定的时间产生中断,并且它的中断时间是可以修改的,所以把读取按键值的逻辑放在定时器的处理函数里。
3.在按键中断处理函数里每次修改定时中断的时间值,这样如果按键按下的周期里如果产生了多次按键中断,那么每次按键中断都会去修改定时器中断的时间。
4.例如,mod_timer(&buttons_timer, jiffies+HZ/100)就表示把定时器中断时间每次延迟10ms,直到定时器中断在最后一次按键中断,设置的时间产生中断时,才会去读取按键值,这就相当于把读取按键值延迟到最后一次按键中断里,这样就避免了按键抖动带来的读取值不准确的问题。

主要代码如下:

static struct timer_list buttons_timer;
static irqreturn_t key_handle(int irq, void *dev_id)
{
    /* 10ms后启动定时器 */
	irq_pd = (struct pin_desc *)dev_id;
  /*该函数可以修改定时器中断产生时间,jiffies是系统默认的一个值,它会自动增加。
  如果按键按下的这段时间里产生了抖动,也就是会产生多次按键中断,为了保证读取的值是准确的,
  则应该在最后一次中断里读取,定时器的解决思想是,因为定时器也会在指定的时间产生中断,并且它的中断
  时间是可以修改的,所以把读取按键值的逻辑放在定时器的处理函数里,在按键中断处理函数里每次修改定时中断
  的时间值,这样如果按键按下的周期里如果产生了多次按键中断,也就是产生了按键抖动,那么每次按键中断都会去修改
  定时器中断的时间,例如jiffies+HZ/100就表示把定时器中断时间每次延迟10ms,直到定时器中断在最后一次按键中断
  设置的时间产生中断时,才会去读取按键值,相当于把读取按键值延迟到最后一次按键中断里,这样就避免了按键抖动
  带来的读取值不准确的问题。
  */
	mod_timer(&buttons_timer, jiffies+HZ/100);
	return IRQ_RETVAL(IRQ_HANDLED);
}

static void buttons_timer_function(unsigned long data)
{
	struct pin_desc * pindesc = (struct pin_desc *)dev_id;
      int  pin_val;

      pin_val = s3c2410_gpio_getpin(pindesc->pin_code);

      if(pin_val){ //松开
         key_val = (pindesc->pin_val | 0x80);

      }else{
        key_val = pindesc->pin_val;

      }

       ev_press = 1;                  /* 表示中断发生了 */
       wake_up_interruptible(&button_waitq);   /* 唤醒休眠的进程 */
      
       return IRQ_RETVAL(IRQ_HANDLED);
}

static int __init s3c24xx_init(void)
{

     init_timer(&buttons_timer);
	buttons_timer.function = buttons_timer_function;
	//buttons_timer.expires  = 0;
	add_timer(&buttons_timer); 
  //其他代码省略
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值