单片机流水灯左右移动程序实现及源码详解
1. 设计思路
2. 硬件连接
假设连接 8 个 LED 到 STM32 的 PA0 到 PA7 引脚,并且每个 LED 连接到对应的 GPIO 引脚上,控制它们的电平实现亮灭。
3. 程序设计
程序的主要任务是通过 GPIO 控制 LED 的状态变化,实现流水灯效果。下面分别实现流水灯左移和右移的代码。
3.1. GPIO 初始化
首先需要初始化 STM32 的 GPIO 引脚,将 PA0 到 PA7 配置为输出模式。
#include "stm32f10x.h"
void GPIO_Init_LED(void) {
// 开启 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
3.2. 流水灯左移程序
左移的原理是将一个 "1" 从最低位逐步移到最高位,每次点亮一个 LED,其他 LED 熄灭。
void LED_Left_Shift(void) {
uint8_t led_state = 0x01; // 初始时点亮最左边的 LED (PA0)
while (1) {
GPIOA->ODR = led_state; // 设置 GPIOA 输出寄存器,控制 PA0 - PA7 的电平
for (int i = 0; i < 1000000; i++); // 延时
// 左移,直到最右边
led_state <<= 1; // 将 1 左移
if (led_state == 0x00) { // 如果已经移到最右边,则重新从最左边开始
led_state = 0x01;
}
}
}
led_state
左移一位,控制相应的 LED 灯亮灭。GPIOA->ODR = led_state;
用于设置 GPIOA 的输出数据寄存器,根据 led_state
中的值来点亮相应的 LED。led_state <<= 1;
完成的,当 led_state
为 0x00
时,表示已经将所有 LED 点亮过一次,此时将其重置为 0x01
,从左边第一个 LED 开始。3.3. 流水灯右移程序
右移的实现方式类似,不过是将一个 "1" 从最高位逐步移到最低位。
void LED_Right_Shift(void) {
uint8_t led_state = 0x80; // 初始时点亮最右边的 LED (PA7)
while (1) {
GPIOA->ODR = led_state; // 设置 GPIOA 输出寄存器,控制 PA0 - PA7 的电平
for (int i = 0; i < 1000000; i++); // 延时
// 右移,直到最左边
led_state >>= 1; // 将 1 右移
if (led_state == 0x00) { // 如果已经移到最左边,则重新从最右边开始
led_state = 0x80;
}
}
}
led_state
右移一位,控制相应的 LED 灯亮灭。GPIOA->ODR = led_state;
同样用于设置 GPIOA 的输出数据寄存器,控制 LED 状态。led_state >>= 1;
完成的,当 led_state
为 0x00
时,表示已经将所有 LED 点亮过一次,此时将其重置为 0x80
,从右边第一个 LED 开始。3.4. 主程序
主程序可以通过调用 LED_Left_Shift
或 LED_Right_Shift
来控制流水灯的方向。
int main(void) {
// 初始化 GPIOA 引脚
GPIO_Init_LED();
// 流水灯左移
LED_Left_Shift(); // 或调用 LED_Right_Shift() 实现右移效果
while (1) {
// 主循环可以执行其他任务
}
}
4. 总结
5. 扩展功能
- 双向流水灯:可以通过在左移和右移之间切换,实现双向流水灯的效果。
- 速度控制:通过调整延时函数的循环次数,改变流水灯的切换速度。
- 多种显示模式:可以加入更多的控制逻辑,例如不同的模式(如闪烁、闪烁模式、交替模式等)。
作者:Katie。