按键控制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 */
}
实现功能。