基于STM32利用第一个按键开关控制三个 LED 流水灯,第二个按键按下后用定时器中断为 反向流水灯。第三个按键控制全局速度。要求在中断时也可以调速。
时间: 2025-06-21 16:27:29 浏览: 14
### STM32按键控制LED流水灯
在STM32上实现通过按键控制LED流水灯的功能,可以采用定时器中断来管理灯光流动的速度以及方向的变化。具体来说,当按下某个按钮时,程序会检测到这一事件并相应地改变计数变量`i`的增减方式(即`i++`表示正向流动而`i--`则代表反向),从而达到变换流水灯显示顺序的效果[^2]。
对于全局速度调整功能,则可以通过修改定时器的时间间隔参数完成;而在中断服务例程内动态更改这些设定能够实现在运行过程中灵活调控流光速率的目的。下面给出一段简化版C语言代码用于展示如何构建这样一个系统:
```c
#include "stm32f1xx_hal.h"
TIM_HandleTypeDef htim2;
uint8_t led_state = 0; // 控制LED状态变化
volatile uint8_t direction_flag = 1; // 方向标志位,默认为正向(1),负向(-1)
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
/* 开启定时器 */
HAL_TIM_Base_Start_IT(&htim2);
while (1){
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){ // 检测PA0上的按键是否被按下
__HAL_TIM_SET_AUTORELOAD(&htim2, 999); // 减慢速度
HAL_Delay(500); // 去抖动延时
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET){ // 检查PB0上的按键以切换方向
direction_flag *= -1; // 改变方向
HAL_Delay(500); // 去抖动延时
}
HAL_Delay(100);
}
}
// 定义定时器回调函数处理LED逻辑
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
static uint8_t count = 0;
if(htim->Instance==TIM2){
if(direction_flag>0){
count++;
if(count>=8)count=0;
}else{
count--;
if(count<0)count=7;
}
switch(count){
case 0: HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); break;
case 1: HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET); break;
...
default: break;
}
led_state ^= 0xFF; // 切换所有LED的状态
// 清除其他LED端口...
}
}
```
此段代码展示了基本框架,实际应用中可能还需要考虑更多细节优化,比如更精确的去抖算法、更加复杂的LED组合模式等。
阅读全文
相关推荐


















