蓝桥杯比赛按键扫描是需要考生自己编写的,而按键也会考到长按和短按的功能,按键本身也需要消抖。那么接下来先定义按键的枚举变量。
typedef enum
{
keycheck, //按键检测
keycpress, //按键按下
keyrelease, //按键释放
}KEY_State;
KEY_State KeyState = keycheck ;
接着利用宏定义将按键的四个读入函数进行定义。
#define B1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define B2 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define B3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define B4 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
紧接着定义需要使用的按键变量。
uint8_t KEY_Value = 0 ; //获取按键值
uint8_t KEY_Flag = 0 ; //按键按下松开后的标记位
uint32_t KEY_Press_TIME = 0 ; //按键按下后多长时间有效,该变量需要放在嘀嗒定时器里
下面开始放按键扫描函数。
void Key_Scan(void)
{
switch(KeyState)
{
case KEY_Check:
{
if((B1==GPIO_PIN_RESET)||(B2==GPIO_PIN_RESET)||(B3==GPIO_PIN_RESET)||(B4==GPIO_PIN_RESET))KeyState=keypress;
}
break;
case keypress:
{
if(B1==GPIO_PIN_RESET)KEY_Value=1; //按键一
else if(B2==GPIO_PIN_RESET)KEY_Value=2; //按键二
else if(B3==GPIO_PIN_RESET)KEY_Value=3; //按键三
else if(B4==GPIO_PIN_RESET)KEY_Value=4; //按键四
KeyState=KEY_Release;
}
break;
case keyrelease:
{
if((B1==GPIO_PIN_RESET)||(B2==GPIO_PIN_RESET)||(B3==GPIO_PIN_RESET)||(B4==GPIO_PIN_RESET))
{
KEY_Press_TIME=KEY_Press_TIME+10; //按键按下后可以加时达到长按的效果
}
else
{
KeyState=keycheck;
KEY_Flag=1;
}
}
break;
default:break;
}
}