按键控制灯 STM32单片机外接扩展板D2、D3接开关S2和S3,D9、D10、D11接RGB三色LED灯,要求每次按下S2开关一次,三色灯按红、绿、蓝颜色变化,每次按下S3开关一次,三色灯按蓝、绿、红颜色变化,每次颜色变化时,通过串行口向计算机发送“按下按钮:SX,当前颜色是:X色!”
时间: 2023-06-24 14:09:05 浏览: 48
好的,这个功能可以通过 STM32 单片机的 GPIO 口和 USART 口来实现。
首先,我们需要在代码中定义每个引脚的对应关系和初始状态。这里使用宏定义来简化代码:
```c
#define S2_PIN GPIO_PIN_0
#define S2_PORT GPIOA
#define S3_PIN GPIO_PIN_1
#define S3_PORT GPIOA
#define LED_R_PIN GPIO_PIN_9
#define LED_R_PORT GPIOB
#define LED_G_PIN GPIO_PIN_10
#define LED_G_PORT GPIOB
#define LED_B_PIN GPIO_PIN_11
#define LED_B_PORT GPIOB
#define LED_OFF 0
#define LED_ON 1
uint8_t led_r_state = LED_OFF;
uint8_t led_g_state = LED_OFF;
uint8_t led_b_state = LED_OFF;
```
然后,我们需要在主函数中初始化相关引脚的输入输出模式:
```c
// 初始化 S2 和 S3 引脚为输入模式
HAL_GPIO_Init(S2_PORT, &(GPIO_InitTypeDef){S2_PIN, GPIO_MODE_INPUT, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW});
HAL_GPIO_Init(S3_PORT, &(GPIO_InitTypeDef){S3_PIN, GPIO_MODE_INPUT, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW});
// 初始化 RGB 三色 LED 引脚为输出模式
HAL_GPIO_Init(LED_R_PORT, &(GPIO_InitTypeDef){LED_R_PIN, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW});
HAL_GPIO_Init(LED_G_PORT, &(GPIO_InitTypeDef){LED_G_PIN, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW});
HAL_GPIO_Init(LED_B_PORT, &(GPIO_InitTypeDef){LED_B_PIN, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW});
// 初始状态关闭 RGB 三色 LED 灯
HAL_GPIO_WritePin(LED_R_PORT, LED_R_PIN, LED_OFF);
HAL_GPIO_WritePin(LED_G_PORT, LED_G_PIN, LED_OFF);
HAL_GPIO_WritePin(LED_B_PORT, LED_B_PIN, LED_OFF);
```
接着,我们需要在主函数中通过轮询的方式检测按键状态,来实现按键控制 LED 灯的功能:
```c
while (1) {
// 检测 S2 按键状态
if (HAL_GPIO_ReadPin(S2_PORT, S2_PIN) == GPIO_PIN_RESET) {
// 按下 S2 按键,切换 RGB 三色 LED 灯颜色
led_r_state = !led_r_state;
led_g_state = !led_g_state;
led_b_state = !led_b_state;
HAL_GPIO_WritePin(LED_R_PORT, LED_R_PIN, led_r_state);
HAL_GPIO_WritePin(LED_G_PORT, LED_G_PIN, led_g_state);
HAL_GPIO_WritePin(LED_B_PORT, LED_B_PIN, led_b_state);
// 向计算机发送串口数据
char msg[50];
sprintf(msg, "按下按钮:S2,当前颜色是:%s色!\n", led_r_state ? "红" : (led_g_state ? "绿" : "蓝"));
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 1000);
}
// 检测 S3 按键状态
if (HAL_GPIO_ReadPin(S3_PORT, S3_PIN) == GPIO_PIN_RESET) {
// 按下 S3 按键,切换 RGB 三色 LED 灯颜色
led_r_state = !led_b_state;
led_g_state = !led_g_state;
led_b_state = !led_r_state;
HAL_GPIO_WritePin(LED_R_PORT, LED_R_PIN, led_r_state);
HAL_GPIO_WritePin(LED_G_PORT, LED_G_PIN, led_g_state);
HAL_GPIO_WritePin(LED_B_PORT, LED_B_PIN, led_b_state);
// 向计算机发送串口数据
char msg[50];
sprintf(msg, "按下按钮:S3,当前颜色是:%s色!\n", led_r_state ? "蓝" : (led_g_state ? "绿" : "红"));
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 1000);
}
// 延时一段时间,避免过快检测按键导致误触发
HAL_Delay(100);
}
```
最后,我们需要在主函数中初始化 USART 串口,以便向计算机发送数据:
```c
// 初始化 USART 串口
HAL_UART_Init(&huart1);
```
完整代码如下: