按键控制LED-STM32电控学习笔记12

本文介绍了如何使用STM32的PA0和PC13按键控制LED灯,通过宏定义和函数实现不同按键触发LED的闪烁、颜色切换,并运用去抖技术处理按键干扰。学习者将学会如何配置IO口,编写宏和函数来简化代码,以及处理按键状态的不稳定问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按键控制LED-STM32电控学习笔记12

野火的霸道V2开发板自带有2个可编辑按键,分辨是Key1和Key2。而我们知道,按键无非就两种模式,要么1要么0,所以本篇大致介绍一下通过两个按键控制LED的颜色和状态。
在这里插入图片描述

查阅原理图我们发现,两个按键对应的IO口是PA0和PC13,既然芯片要从按键读取状态,我们在cubex中将这两个引脚配置成INPUT模式,然后将其设置成下拉模式(在原理图中看到,按键的默认电位是0,因此需要将其设置成下拉模式将其下拉成低电平,如果设置成上拉模式那么按键无论按下与否都输入高电平,那么按键就没意义了

接下来生成代码,这一次我们搞点新操作:函数

分享一个热知识,ST公司在开发CUBEMX的时候开发了一个对用户十分友好的功能,在配置完成的代码中我们可以看到很多这样的注释:
在这里插入图片描述

在这些注释直接填写的代码,在重新配置生成后,将自动保留,不会被覆盖,所以一些常用的函数和初始化可以写在这些地方。

接下来我们实现如下功能
1、按下KEY1,抬起后LED灯三原色按1000ms周期闪烁一遍
2、按下KEY2,抬起后亮起红色,熄灭,再按下亮起绿色,三种颜色顺次切换。

首先我们在
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
之间书写相关宏定义和函数(合理利用宏定义可以省去很多不必要的臃肿代码

/*使用Key1和Key2宏定义代替状态读取函数HAL_GPIO_ReadPin()*/
#define Key1 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
#define Key2 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)

/*使用XXX_on代替LED的引脚输出函数*/
#define Red_on HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)
#define Green_on HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET)
#define Blue_on HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET)

/*用XXX_off代替LED熄灭相关函数*/
#define Red_off HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)
#define Green_off HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET)
#define Blue_off HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET)

/*三色灯交替亮*/
void LED_Dance(void)
	{
/*打开某色灯,持续500ms,熄灭,打开下一颜色*/
		Red_on;
		HAL_Delay(500);
		Red_off;
		Green_on;
		HAL_Delay(500);
		Green_off;
		Blue_on;
		HAL_Delay(500);
		Blue_off;
	}
void LED_Shut(void)
{
/*关闭LED灯*/
	Red_off;
	Green_off;
	Blue_off;
}

/*定义一个变量cnt用来计数,即当出现过一个颜色后cnt++,到cnt=3时自动归为1*/
int cnt = 1;
void LED_R(void)
{
	Red_on;
	cnt ++;
}
void LED_G(void)
{
	Green_on;
	cnt ++;
}
void LED_B(void)
{
	Blue_on;
	cnt = 1;
}

接着在while函数内部写入我们的主函数,在书写前需要知道一个,在按键或板子内部可能有一些电流或电磁干扰,使得按键引脚的状态可能不稳定,例如在0.1ms内按键有一段短暂的高电平,这不是人为造成的,但是芯片会以为是触发了按键,所以我们需要对其进行去抖,其原理是:不断扫描按键状态,当第一次读取到高电平时,先延时一小段时间,再次读取整个引脚,如果仍然是高电平,那么说明是人为按下的,触发函数
明白这个后,我们开始写主函数:

 while (1)
  {
    /* USER CODE END WHILE */
		/*如果按下的是Key1按键*/
		if(Key1 == 1)
		{
			/*延迟去抖*/
			HAL_Delay(50);
			if(Key1 == 1){
    /*不断扫描按键状态,当松开后状态为低电平:0*/
				while(Key1 == 1);
    /*松开后执行函数*/
				LED_Dance();
			}
		}
		
		else if(Key2 == 1){
			HAL_Delay(50);
			
			if(Key2 == 1){
			  while(Key2 == 1);
				
				if(cnt == 1){
						LED_R();
						HAL_Delay(1000);
				}
			
				else if(cnt == 2){
						LED_G();
						HAL_Delay(1000);
				}
						
				else if(cnt == 3){
						LED_B();
						HAL_Delay(1000);
				}
				
		  }
		}	
			else{
				LED_Shut();
			}
		
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

实现功能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SZTU_ELIAS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值