完整代码一个按键控制三个灯亮灭
时间: 2024-10-27 12:10:26 浏览: 152
通过一个按键控制三种工作方式.rar
下面是一个简单的完整代码示例,演示了如何使用一个按键控制三个LED灯的亮灭。这里假设你已经按照之前提到的方式完成了GPIO配置和中断设置,并且使用了Keil uVision或其他类似IDE进行编程。代码结构如下:
```c
#include "stm32f1xx_hal.h" // 引入头文件
// LED和按键的GPIO定义
#define KEY_BUTTON_GPIO_PORT GPIOA
#define KEY_BUTTON_PIN GPIO_Pin_0
#define LED_1_GPIO_PORT GPIOB
#define LED_1_PIN GPIO_Pin_0
#define LED_2_GPIO_PORT GPIOB
#define LED_2_PIN GPIO_Pin_1
#define LED_3_GPIO_PORT GPIOB
#define LED_3_PIN GPIO_Pin_2
// LED闪烁状态
enum LedState { LED_OFF, LED_ON };
// 结构体用于保存每个LED的状态
typedef struct {
enum LedState state;
bool is_button_pressed;
} LedCtrl;
LedCtrl ledCtrls[3] = {
{LED_OFF, false}, // LED 1
{LED_OFF, false}, // LED 2
{LED_OFF, false} // LED 3
};
void EXTI0_IRQHandler(void) {
// 检查按键是否按下
if (GPIO_ReadInputDataBit(KEY_BUTTON_GPIO_PORT, KEY_BUTTON_PIN)) {
// 按键未松开,保持LED状态不变
return;
} else {
ledCtrls[0].is_button_pressed = true; // 按键释放,记录当前状态
}
// 触发LED切换
for (int i = 0; i < 3; i++) {
if (ledCtrls[i].is_button_pressed && !ledCtrls[(i + 1) % 3].state) {
// 按键松开且相邻LED未亮,点亮当前LED
GPIO_SetBits(ledCtrls[i].state == LED_ON ? LED_1_GPIO_PORT : LED_2_GPIO_PORT, ledCtrls[i].state == LED_ON ? LED_1_PIN : LED_2_PIN);
ledCtrls[i].state = ledCtrls[i].state == LED_ON ? LED_OFF : LED_ON;
} else if (!ledCtrls[i].is_button_pressed) {
// LED还在闪烁,继续保持状态
GPIO_ResetBits(ledCtrls[i].state == LED_ON ? LED_1_GPIO_PORT : LED_2_GPIO_PORT, ledCtrls[i].state == LED_ON ? LED_1_PIN : LED_2_PIN);
}
}
}
int main(void) {
// ... 其他GPIO初始化和中断配置 ...
// 进入无限循环,等待中断触发
while (1) {}
return 0;
}
阅读全文