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、运行效果
可以验证按键按下后与其输出值是对应的,根据按键值可以判断出是哪个按键被按下