微控制器 按鍵定時器檢測 短按 長按

2021-09-05 01:15:22 字數 2355 閱讀 7130

通過使用定時器計數的方法來分辨按鍵的:短按、長按

檢測到引腳被拉低:按鍵按下為低電平,沒有按下為高電平

延時10毫秒:濾波

引腳還是被拉低:確定按鍵被按下

設定按鍵按下標誌

開啟定時器,開始計數:定時器中有乙個全域性變數用於記錄計數值

直到引腳被拉高:按鍵被釋放將為高電平

關閉定時器

檢測按鍵按下標誌

檢測定時器按鍵檢測時間全域性變數是否大於某個值,一般為200ms

大於則為長按,否則為短按

typedef

enum

key_state_e;

uint8_t ylf_key_scan

(void)}

if(press_flag)

else

}return key_default_status;

}int

main

(void)}

}

條件:

思路:需要微控制器支援引腳上下沿觸發,通過使用兩個定時器,來達到目的,具體**如下:

(timer_long_press_id)

;// 建立定時器id

(timer_debounce_press_id)

;// 建立定時器id

// 長按處理函式

void

key_long_press_handler

(void

)else

if(key_pin ==1)

// 已經釋放掉意味著是短按

}// 按鍵消抖處理函式

void

key_debounce_handler

(void)}

// 按鍵觸發處理函式

void

key_toggle_handler

(void)}

void

key_init

(void

)思路解釋如下:按鍵狀態結構體有乙個用於識別的狀態位,預設處於release,也就是釋放的狀態。一旦按鍵被按下,中斷觸發,此時檢查是否是relase狀態,如果是就檢查按鍵是否被拉低,如果是,此時進入may_press狀態,也就是可能是按下的,並且記錄此時的時間戳,這一步是消抖的關鍵。當按鍵被釋放,由於是邊沿觸發,會再次進行處理,此時檢查和上一次觸發之間的時間戳之差,如果小於10ms我們就認為是抖動,此時不會對按鍵輸出狀態進行修改,而是直接將按鍵狀態置回relase狀態,反之檢查差值和長短按閾值之間的關係,將state置位為對應的狀態。消抖的核心在於記錄時間戳,而這只是乙個簡單的賦值操作,並不耗費時間。

效率上來說,延時消抖花費時間在無意義延時上,而相對較好的定時輪詢還是不可避免的在輪詢,而現在這種方式完全是中斷性質的。唯一多出的開銷(全域性時間戳)並不是只可以用於按鍵消抖,另外在hal庫中存在直接獲取tick的函式,這樣實現就更方便了。

第一步:初始化全域性時間戳的定時器,一般採用系統滴答定時器來產生,每1ms一次即可。

第二步:初始化按鍵對應的io,復用為邊沿觸發的外部中斷。

第三步:在外部中斷函式中新增按鍵事件處理函式。

typedef

struct _key_state_t

current_state;

enum

state;

} key_state_t;

#define shortpress_threshold 1500

key_state_t key_state =

;// 1ms 定時器中斷服務函式

void

timer0_irq_handler

(void)}

else

if(key_state.current_state == may_press)

else

if(key_state.key_time > shortpress_threshold)

else

// 按下時間小於10ms就釋放視為雜波}}

...}

if

(key_state.current_state == release)

}else

if(key_state.current_state == may_press)

elseif(

course_ms()

-key_state.key_time > shortpress_threshold)

else

}}

以上**需要新增到中斷處理函式的按鍵事件處理邏輯中,演算法的核心是乙個狀態機。按鍵被預設上拉,按下接地。course_ms()為獲取全域性時間戳的函式。

以上就是目前我用過的所有型別的按鍵檢測方法。

基於狀態機的微控制器按鍵短按長按功能的實現

發表於 2017 12 28 08 43 46 控制 mcu 關注在自己在科研實踐和對學生教學中發現,現在微控制器學習中對於按鍵處理的方法都是 檢測按鍵 延時消抖 按鍵執行 等待釋放,整個按鍵處理的程式中大量出現 delay 1ms 5 和 while key 這樣的語句,這明顯是在給自己找麻煩,延...

51微控制器 定時器

定時 計數器的結構和工作原理 定時 計數器的實質是加1計數器 16位 由高8位和低8位兩個暫存器組成。80c51 微控制器定時 計數器的工作是由兩個特殊功能暫存器控制的。tmod是定時 計數器的工 作方式暫存器,確定工作方式和功能,低四位用於t0,高四位用於t1。t con是控制寄 存器,控制t0和...

51微控制器 定時器

標準的51微控制器內部有t0和t1兩個定時器。定時器的計數值儲存在暫存器中。th0 tl0用於t0,th1 tl1用於t1.定時器儲存暫存器 名稱描述 sfr位址 復位值th0 t0高位元組 0x8c 0x00 tl0t0低位元組 0x8a 0x00 th1t1高位元組 0x8d 0x00 tl1t...