ToB企服应用市场:ToB评测及商务社交产业平台

标题: 单片机:实现流水灯左移、右移程序(附带源码) [打印本页]

作者: 北冰洋以北    时间: 2024-12-20 09:42
标题: 单片机:实现流水灯左移、右移程序(附带源码)
1. 设计思路


2. 硬件毗连

假设毗连 8 个 LED 到 STM32 的 PA0 到 PA7 引脚,并且每个 LED 毗连到对应的 GPIO 引脚上,控制它们的电平实现亮灭。

3. 程序设计

程序的主要使命是通过 GPIO 控制 LED 的状态变化,实现流水灯结果。下面分别实现流水灯左移和右移的代码。
3.1. GPIO 初始化

首先须要初始化 STM32 的 GPIO 引脚,将 PA0 到 PA7 配置为输出模式。
  1. #include "stm32f10x.h"
  2. void GPIO_Init_LED(void) {
  3.     // 开启 GPIOA 时钟
  4.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  5.    
  6.     GPIO_InitTypeDef GPIO_InitStructure;
  7.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
  8.                                   GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽输出模式
  10.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  12. }
复制代码

3.2. 流水灯左移程序

左移的原理是将一个 "1" 从最低位逐步移到最高位,每次点亮一个 LED,其他 LED 熄灭。
  1. void LED_Left_Shift(void) {
  2.     uint8_t led_state = 0x01;  // 初始时点亮最左边的 LED (PA0)
  3.    
  4.     while (1) {
  5.         GPIOA->ODR = led_state;  // 设置 GPIOA 输出寄存器,控制 PA0 - PA7 的电平
  6.         for (int i = 0; i < 1000000; i++);  // 延时
  7.         
  8.         // 左移,直到最右边
  9.         led_state <<= 1;  // 将 1 左移
  10.         if (led_state == 0x00) {  // 如果已经移到最右边,则重新从最左边开始
  11.             led_state = 0x01;
  12.         }
  13.     }
  14. }
复制代码

3.3. 流水灯右移程序

右移的实现方式类似,不过是将一个 "1" 从最高位逐步移到最低位。
  1. void LED_Right_Shift(void) {
  2.     uint8_t led_state = 0x80;  // 初始时点亮最右边的 LED (PA7)
  3.    
  4.     while (1) {
  5.         GPIOA->ODR = led_state;  // 设置 GPIOA 输出寄存器,控制 PA0 - PA7 的电平
  6.         for (int i = 0; i < 1000000; i++);  // 延时
  7.         
  8.         // 右移,直到最左边
  9.         led_state >>= 1;  // 将 1 右移
  10.         if (led_state == 0x00) {  // 如果已经移到最左边,则重新从最右边开始
  11.             led_state = 0x80;
  12.         }
  13.     }
  14. }
复制代码

3.4. 主程序

主程序可以通过调用 LED_Left_Shift 或 LED_Right_Shift 来控制流水灯的方向。
  1. int main(void) {
  2.     // 初始化 GPIOA 引脚
  3.     GPIO_Init_LED();
  4.     // 流水灯左移
  5.     LED_Left_Shift();  // 或调用 LED_Right_Shift() 实现右移效果
  6.    
  7.     while (1) {
  8.         // 主循环可以执行其他任务
  9.     }
  10. }
复制代码
4. 总结


5. 扩展功能


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4