STM32按鍵狀態機的實現

2021-10-10 12:52:29 字數 1733 閱讀 6379

目錄

一、按鍵狀態機的作用

二、按鍵狀態機的實現

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...