按鍵抖動,在我們按下的時候按鍵可能會發生抖動,如圖
我們的中斷是雙邊沿觸發的,假如我們按鍵發生了抖動,那麼就觸發了五次中斷,這對我們來說實際應用上來看。是非常不穩定的,我們有兩種解決方法,一種是硬體消抖,雖然我懂一些硬體,但我不想拿自己的弱處來改進它。那麼另一種就是是軟體消抖,這一聽就在我的水平範疇內,我們可以使用定時器消抖
1.定時器
1.1 定義乙個定時器結構體
static
struct timer_list buttons_timer;
timer_list結構體如下:
struct timer_list
;
1.2 初始化定時器
init_timer
(&buttons_timer)
;
->1.2.1) 定義超時函式
buttons_timer. function= buttons_timer_ function;
這個超時函式等一下我們需要編寫1.3 向核心加入乙個定時器
add_timer
(&buttons_timer)
;
到這一步我們定時器的初始化基本完成了,就差乙個超時函式沒寫,寫之前我們來看一下按鍵的中斷處理函式:static irqreturn_t buttons_irq (
int irq,
void
*dev_id)
//中斷服務函式
mod_timer(&buttons_timer, jiffies+hz/100);實現超時函式當我們按鍵按下發生中斷的時候,會進入這個中斷函式,我們先不著急把電平值傳出去,因為可能按鍵還有抖動。我們在按鍵中斷服務函式裡面啟動定時器。怎麼啟用?
答:使用 mod_timer(&buttons_timer, jiffies+hz/100); 這個函式會更改我們定時器的超時時間。jiffies是啥?可以理解為電腦啟動到目前為止的時間,比如說我開機到現在是10秒,那麼這個jiffies就是10秒。hz是啥?乙個hz就是電腦的一秒。那麼這個函式就是把超時時間就是(當前時間 + 10ms)。
假設我們按下按鍵,這時進入中斷服務函式,把定時器超時時間變成(當前時間(假設是10s) + 10ms),
過了5ms,然後按鍵發生抖動了,我們又進入中斷處理函式,又把定時器超時時間變成(當前時間(10s+5ms) + 10ms)
static
void
buttons_timer_function
(unsigned
long data)
else
ev_press =1;
/* 表示中斷發生了 */
wake_up_interruptible
(&button_waitq)
;/* 喚醒休眠的程序 */
}
在超時函式裡,很簡單,把key值傳遞出來,並喚醒read()。這樣我們就實現了軟體消抖
使用定時器實現按鍵防抖動
button.c include include include include include include include include include include include include static struct class sixthdrv class static str...
Linux字元裝置驅動之定時器去抖動按鍵驅動
當按一次按健時,由於按健有反應時間 有抖動,可能按一次機器感應到幾次,防抖就是讓在按鍵正常反應時間內機器只感應一次按鍵效果,防止誤操作。當按鍵發生時產生中斷,在中斷服務程式中修改乙個定時器的定時時間為10ms,並從10ms開始重新計數。定時器時間到後產生定時器中斷,按鍵處理放在定時器中斷裡面。這樣當...
7 使用定時器去掉按鍵輸入中產生抖動
1.電路圖 2.linux核心中使用定時器的步驟static struct timer list timer 定義全域性的定時器 init timer timer 初始化定時器 buttons timer.function function 設定超時呼叫函式 buttons timer.expire...