这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持示波器】用户按键管理-使用结构体

共2条 1/1 1 跳转至

【换取手持示波器】用户按键管理-使用结构体

助工
2025-04-07 23:16:05     打赏

1、简介

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

2、按键端口、引脚初始化

使用cubemx完成按键端口、引脚初始化

4A2UY~}I4PC[%YM2T(1R~HC.png

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、运行效果

_1ZEQ9UF4%@FY5~UOLGXNMG.png

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





关键词: 用户按键管理    

院士
2025-04-11 16:25:41     打赏
2楼

还是要升级到状态机的方式。

否则这20ms的等待很消耗MCU的性能的



共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]