KEY.H
#ifndef _KEY_H
#define _KEY_H
#include "main.h"
#define KEY0 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) //KEY0按键PE4
#define KEY1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) //KEY1按键PE3
#define KEY2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2) //KEY2按键PE2
#define WK_UP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) //WKUP按键PA0
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4
u8 KEY_Scan(u8 mode);
#endif
KEY.C
#include "key.h"
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,WKUP按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>WK_UP!!
uint8_t KEY_Scan(uint8_t mode)
{
static uint8_t key_up=1; //按键松开标志
if(mode==1)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
HAL_Delay(10);
key_up=0;
if(KEY0==0) return KEY0_PRES;
else if(KEY1==0) return KEY1_PRES;
else if(KEY2==0) return KEY2_PRES;
else if(WK_UP==1) return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0; //无按键按下
}
main.c
/* USER CODE BEGIN Includes */
uint8_t a=0;
/* USER CODE END Includes */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
a=KEY_Scan(1);
HAL_Delay(1000);
}
/* USER CODE END 3 */