stm32按键按下一次开启流水灯再次按下关闭流水灯
时间: 2024-12-03 22:17:12 浏览: 13
在STM32中,你可以使用类似下面的流程设计一个简单的按键控制流水灯的程序。这里假设你有一个按键和一组连续的LED作为流水灯。
1. **初始化硬件**:
- 初始化GPIO,将按键的IO设置为输入模式,LED的IO设置为输出模式。
```c
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = KEY_PIN; // 按键引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN PullDown; // 设置为带拉低的输入
HAL_GPIO_Init(GPIOx, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LED_PORT; // 流水灯引脚数组
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP; // 输出推挽模式
for (int i = 0; i < NUM_LEDS; i++) {
HAL_GPIO_Init(LED_PORT + i * LED_PIN_NUM, &GPIO_InitStructure);
}
```
2. **设置中断回调函数**:
- 定义一个函数来响应按键按下,如`ButtonPressedCallback()`.
```c
void ButtonPressedCallback(void) {
static bool ledState = true; // 初始点亮
HAL_GPIO_TogglePin(LED_PORT, ledState ? LED_PIN : LED_PIN | (ledState << 1)); // 取反当前LED状态
ledState = !ledState;
}
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = KEY_PIN; // 按键引脚
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 开中断
void EXTI0_IRQHandler() {
if (HAL_GPIO_ReadPin(GPIOx, KEY_PIN) == GPIO_PIN_SET) { // 按键被按下
ButtonPressedCallback();
}
}
```
3. **开启中断**:
```c
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
```
4. **主循环**:
- 在主循环中保持中断服务运行。
```c
while (1) {
HAL_Delay(100); // 等待下一个事件
}
```
阅读全文