通过一个按键控制三个灯(3种模式,第一种全亮,第二种全灭,第三种流水灯)。stm32不使用HAL
时间: 2024-12-10 16:50:15 浏览: 44
在STM32单片机上实现这个功能,我们可以利用GPIO端口和位操作来控制三个LED灯,并通过一个按键切换三种模式。首先,你需要配置三个GPIO引脚分别连接到三个LED灯,以及一个GPIO引脚作为按键输入。
1. **全亮模式**:当按键未按下时,将所有三个LED的GPIO设置为高电平,这样它们就会发光。
2. **全灭模式**:按键按下时,将所有三个GPIO都设置为低电平,LED关闭。
3. **流水灯模式**:可以采用轮询的方式,每次按键保持,依次点亮每个LED,然后跳到下一个LED,形成流水效果。可以通过改变GPIO的状态并延时来实现这个动态变化。
以下是简单的步骤和伪代码:
- 初始化GPIO和定时器(如果需要用于延时)
- 定义函数处理按键输入(检查按键是否按下)
- 主循环中:
- 检查按键状态
- 如果按键释放,所有LED全亮
- 如果按键按下,所有LED全灭
- 如果按键按下并且保持,进入流水灯模式:从第一个LED开始,依次点亮并延时,到第三个LED后再回到第一个LED,如此往复
```c
// 初始化GPIO和延时定时器
void init_GPIO(void) {
// 设置GPIO模式、推挽输出等
}
void init_Delay(void) {
// 初始化定时器用于延时
}
// 按键回调函数
void button_callback(uint16_t state) {
if (state == GPIO_PIN_SET) { // 按键按下
for (int i = 0; i < NUM_LEDS; i++) {
led[i] = LOW;
}
} else { // 按键松开
for (int i = 0; i < NUM_LEDS; i++) {
led[i] = HIGH;
}
}
}
// 流水灯模式处理
void water_fall_mode(void) {
static int current_led = 0;
if (current_led >= NUM_LEDS) {
current_led = 0;
}
led[current_led] = HIGH; // 点亮当前LED
// 使用定时器延迟一段时间
wait_for_delay();
current_led++; // 移动到下一个LED
}
int main(void) {
init_GPIO();
init_Delay();
while (1) {
button_state = read_button(); // 获取按键状态
button_callback(button_state);
if (button_pressed) {
water_fall_mode();
}
}
}
```
阅读全文