第十二届蓝桥杯嵌入式比赛准备(3)—按键

这次是关于板子上的按键部分。

按键1-4对应的是PB0-PB3以及PA0,按键按下对应的引脚置0,按键没按下对应的引脚置1。

配置四个引脚为GPIO_Input模式,如图。同时要将其他的必要的东西配置好,RCC和Debug,还有时钟树都要按要求配置。

我使用的是状态机消抖,如果看过电子设计工坊的蓝桥杯单片机的视频的话,对这个应该不陌生。

首先在gpio.h中对下列进行宏定义,便于理解与修改。

#define KB1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define KB2 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define KB3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define KB4 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
#define key_input ((KB1)|(KB2<<1)|(KB3<<2)|(KB4<<3)|0XF0)

#define KB1_PRESS 1
#define KB2_PRESS 2 
#define KB3_PRESS 3 
#define KB4_PRESS 4

#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
static char key_state = 0;

下面在gpio.c中进行按键状态读取函数编写。不要忘记在gpio.h中进行函数声明!

unsigned char key_read(void) //状态机消抖
{
	unsigned char key_return = 0;
	
	switch(key_state)
	{
		case key_state_0:
			if(key_input != 0xff) key_state = key_state_1; //判断按键按下,到状态1
		break;
		case key_state_1:
			if(key_input == 0xff) key_state = key_state_0; //按键没有按下,可能只是抖动,返回状态0
			else										   //判断是哪个按键按下
			{
				switch(key_input)
				{
					case 0xfe:key_return = KB1_PRESS;break;
					case 0xfd:key_return = KB2_PRESS;break;
					case 0xfb:key_return = KB3_PRESS;break;
					case 0xf7:key_return = KB4_PRESS;break;
				}
				key_state = key_state_2;
			}
		break;
		case key_state_2:
			if(key_input == 0xff) key_state = key_state_0; //松开按键回到状态0
		break;
	}
	return key_return;
}

按键处理部分先用延时函数顶着,到后面定时器部分再用定时器。

  /* USER CODE BEGIN WHILE */
  while (1)
  {
		key_val = key_read();
		if(key_val == KB1_PRESS)
		{
			LED2_TOGGLE();
		}
		if(key_val == KB2_PRESS)
		{
			LED2_TOGGLE();
		}
		if(key_val == KB3_PRESS)
		{
			LED2_TOGGLE();
		}
		if(key_val == KB4_PRESS)
		{
			LED2_TOGGLE();
		}
		HAL_Delay(10);
    /* USER CODE END WHILE */

 

### 第十二届蓝桥杯嵌入式比赛概述 第十二届蓝桥杯嵌入式国赛提供了完整的赛题设计源代码和题目[^1]。对于参赛者而言,在准备过程中可以利用往年的资源来熟悉竞赛形式和技术要点。 #### 比赛信息 在比赛中,每位选手将在离线环境中工作,这意味着所有的工具链、库文件以及必要的开发环境都必须提前准备好并能够独立运行而不依赖网络连接[^2]。官方会提供一个包含所需材料的数据包供现场使用。 #### 赛题概览 具体到第十二届比赛题目细节未在此提及,但是可以根据以往的经验推测,这些题目通常涉及以下几个方面: - **硬件控制**:如LED灯的闪烁模式设置、按键输入处理等基本外设操作。 - **通信协议**:UART/SPI/IIC等常见串行接口编程实践。 - **算法实现**:针对特定应用场景下的优化算法编写,比如传感器数据采集后的滤波处理。 - **实时操作系统(RTOS)应用**:多任务调度机制的理解与运用。 为了更好地应对这类挑战,建议深入研究之前几年发布的类似案例及其解决方案,尤其是第十届之后的内容更为贴近当前技术水平和发展趋势。 #### 解决方案思路 当面对实际问题时,可以从以下几个角度出发寻找解决办法: 1. 阅读理解给定的任务描述,明确目标功能需求; 2. 设计合理的软件架构,划分模块化程序结构; 3. 利用已有的开源项目或社区支持作为参考模板; 4. 编写测试用例验证各个子系统的正确性和稳定性; 5. 整合所有部分形成最终作品,并进行全面调试直至满足性能指标要求。 ```c // 示例C语言代码片段展示如何初始化GPIO端口配置 void GPIO_Init(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; /* Configure PA0 as output push-pull */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值