目錄
一、按鍵狀態機的作用
二、按鍵狀態機的實現
1、按鍵狀態機的巨集定義
2、按鍵狀態機的列舉與相關結構體
3、按鍵狀態機的函式實現
一般的按鍵狀態機一般都具有以下功能:
實現思想:
使用方法:
/* 按鍵key的編號 */
#define key_default_num 0x00
#define key_0_num 0x01
#define key_1_num 0x02
#define key_2_num 0x04
#define key_up_num 0x08
#define key_all_num 0xff
/* 按鍵時長狀態定義 */
#define key_press_short 10u
/* 按鍵狀態對比 */
typedef enum
exkeycomparestateenum;
/* 按鍵按下時間長短 */
typedef enum
exkeystateenum;
/* 按鍵結構體 */
typedef struct
exkeytypedef;
/**
* 按鍵狀態機
* @para uckeynum: 需要檢測的按鍵編號
* @retval 0: 狀態未改變 1: 狀態改變
*/uint8_t uckeymachine(uint8_t uckeynum)
/* 按鍵結束 */
if(ucendflag == 1)
/* 更新按鍵狀態時長 */
if(uckeypressedtime >= key_press_short)
ex_keyhandle.uckeystate = key_state_long;
else
ex_keyhandle.uckeystate = key_state_short;
/* 引數初始化 */
ucendflag = 0;
ucoldkeynum = 0;
uckeypressedtime = 0;
return 1;
} return 0;
}/**
* 按鍵掃瞄
* @para uckeynum: 按鍵編號
* @retval ucpressedkeynum: 返回對應按下按鍵的編號, 未按下則返回 0
*/uint8_t uckeyscan(uint8_t uckeynum)
if(uckeynum & key_1_num)
if(uckeynum & key_2_num)
if(uckeynum & key_up_num)
return ucpressedkeynum;
}/**
* 按鍵狀態前後對比函式
* @para ucnewkeynum: 新鍵值狀態
* @para ucoldkeynum: 舊鍵值狀態
* @retval 返回對應鍵值改變的狀態
*/uint8_t uckeystatecompare(uint8_t ucnewkeynum, uint8_t ucoldkeynum)
stm32 工業按鍵檢測 STM32按鍵的檢測
stm32的按鍵檢測相對比較簡單,首先按部就班的初始化連線的到的i o,然後寫乙個按鍵掃瞄函式,這個和51微控制器的差不多。以下是乙個比較典型的例子 利用按鍵控制led key.件 ifndef key h define key h include sys.h definekey0 gpio rea...
STM32按鍵實驗
用systick做時間20ms的判斷,用狀態機概念的按鍵掃瞄三狀態去除抖動,狀態0 有按鍵按下,狀態1 有按鍵按下,判斷具體按鍵,狀態3 判斷按鍵抬起,沒20ms進行狀態的判斷。流程圖 systick程式 不包括初始化程式,初始化程式在delay.c中 systick load 20 fac ms ...
stm32按鍵輸入
對於上乙個實驗流水燈來說,這一次的實驗是獲取輸入的乙個小demo。在課堂上,看老師除錯的時候,只要有輸入則輸入暫存器idr的值就會改變,所以想要獲得輸入只需要迴圈去獲取idr的值即可。在stm32的庫中有乙個讀取輸入資訊的函式 uint8 t gpio readinputdatabit gpio t...