1、简介
当一个开发板存在过多的输入按键,而且按键对应的端口、引脚并不一致;并且按键按下还要对号入座判断是哪个按键按下,是一件比较麻烦的事情。于是这里使用结构体对按键组进行管理,每个按键有唯一的按键值对应,对按键组进行按键对象增减和按键值修改都将非常方便。
2、按键端口、引脚初始化
使用cubemx完成按键端口、引脚初始化

3、程序设计
按键结构体定义
typedef struct{
uint16_t KEY_Value;//按键值
GPIO_TypeDef* GPIOx;//按键Port
uint16_t GPIO_Pin_x;//按键Pin
}Struct_KEY_List;将所有按键添加到Key_List进行管理
Struct_KEY_List Key_List[]={
{0x01,GPIOI,GPIO_PIN_8},//按键值 按键Port 按键Pin
{0x02,GPIOI,GPIO_PIN_9},
{0x03,GPIOI,GPIO_PIN_10},
{0x04,GPIOF,GPIO_PIN_11},
{0x05,GPIOC,GPIO_PIN_13}
};读取按键组输入状态
int read_key(void)
{
uint16_t total_keys=sizeof(Key_List)/sizeof(Struct_KEY_List);//计算总的按键数量
for(uint16_t cmd_index=0;cmd_index<total_keys;cmd_index++){
if(HAL_GPIO_ReadPin(Key_List[cmd_index].GPIOx,Key_List[cmd_index].GPIO_Pin_x)==1){
HAL_Delay(20);//软件消抖
while(HAL_GPIO_ReadPin(Key_List[cmd_index].GPIOx,Key_List[cmd_index].GPIO_Pin_x)==1);
return Key_List[cmd_index].KEY_Value;//返回当前按键值
}
}
return -1;
}轮询按键输入
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int16_t kv=read_key();
if(kv>0){
printf("The Keycode=0x%02x\n",kv);
}
}
/* USER CODE END 3 */
}4、运行效果

可以验证按键按下后与其输出值是对应的,根据按键值可以判断出是哪个按键被按下
我要赚赏金
