微控制器按鍵長短按得識別原理

2022-02-10 03:44:03 字數 1841 閱讀 1120

stm32f103

按鍵長短按得識別原理

需要乙個定時器,用來計算按鍵按下的時間,可以一秒鐘檢測100次, 設定初始化為10ms的中斷,比如使用定時4作為按鍵時間計算的定時器

比如我們需要4種模式,輕觸,短按,長按,超級長按 

#define clicktypetouch 1  //

輕觸#define clicktypeshort 2 //

短按#define clicktypelong 3 //

長按#define clicktypeverylong 4 //

非常長的長按

#define timecntclicktouch 500 //

ms內為短按

#define timecntclickshort 1000 //

ms內為短按

#define timecntclicklong 2000//

ms內,且大於短按時間為長按

#define timecntclickverylong 5000//

ms的按鍵時間為非常長,用於進入高階模式

//

這裡時鐘選擇為apb1的2倍,而apb1為36m

//arr:自動重灌值。

//psc:時鐘預分頻數

//這裡使用的是定時器7

void

tim4_init(u16 arr,u16 psc)

定時器的初始化

然後設定乙個變數用來累計按鍵按下的時間,沒按鍵按下的時候, 一直迴圈累計時間,從0到溢位,有按鍵按下的時候,立即清空,重新開始累計

首先初始化按鍵埠

void keyioinit(void

)

u16 timekeypressed; //

按鍵按下的時間 10ms 步進

設定兩個常量,用來區別按鍵的狀態,是按下還是釋放

#define keystatuspressed 0

#define keystatusreleased 1

定時器的中斷,累計時間

void tim4_irqhandler(void)   //

中斷}

這個鍵,我叫做設定鍵,什麼時候開始給設定鍵開始計算按下時間呢?

設定鍵被按下 而且 按鍵狀態還是釋放

需要幾個常量標誌和幾個變數

u8 statuscntingkeytime; //

是否開始計算按鍵時間

#define statuscnting 1

#define statusnotcnting 0

//設定鍵按下,且之前沒開始計時的時候,開始計算按下時間

if(keyset==keystatuspressed && statuscntingkeytime==statusnotcnting )

當按鍵鬆開後,統計一下,按下的時間為多長

//

鬆手後統計按下時間

if(keyset==keystatusreleased && statuscntingkeytime==statuscnting)

//短按

else

if(timekeypressed>=timecntclickshort &&timekeypressed

//長按

else

if(timekeypressed>=timecntclicklong &&timekeypressed

//超級長按

else

if(timekeypressed>=timecntclickverylong)

}

10 5 微控制器長短按鍵的應用

在微控制器系統中應用按鍵的時候,如果只需要按下一次按鍵加 1 或減 1,那用第 8 章學到的知識就可以完成了,但如果想連續加很多數字的時候,要一次次按下這個按鍵確實有點不方便,這時我們會希望一直按住按鍵,數字就自動持續增加或減小,這就是所謂的長短按鍵應用。當檢測到乙個按鍵產生按下動作後,馬上執行一次...

10 5 微控制器長短按鍵的應用

在微控制器系統中應用按鍵的時候,如果只需要按下一次按鍵加 1 或減 1,那用第 8 章學到的知識就可以完成了,但如果想連續加很多數字的時候,要一次次按下這個按鍵確實有點不方便,這時我們會希望一直按住按鍵,數字就自動持續增加或減小,這就是所謂的長短按鍵應用。當檢測到乙個按鍵產生按下動作後,馬上執行一次...

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

通過使用定時器計數的方法來分辨按鍵的 短按 長按 檢測到引腳被拉低 按鍵按下為低電平,沒有按下為高電平 延時10毫秒 濾波 引腳還是被拉低 確定按鍵被按下 設定按鍵按下標誌 開啟定時器,開始計數 定時器中有乙個全域性變數用於記錄計數值 直到引腳被拉高 按鍵被釋放將為高電平 關閉定時器 檢測按鍵按下標...