32单片机 小项目1-跑马灯

📅2026/7/15 5:44:30 👁️次浏览
32单片机 小项目1-跑马灯
一、前言前两篇分别记录了无封装单灯、无封装多路流水灯今天我尝试做了简单工程分层新建Hardware文件夹存放LED驱动文件把引脚初始化、点灯控制逻辑封装成独立函数代码整洁很多。依旧是初学阶段封装思路比较基础有写得不合理、不规范的地方欢迎各位大佬指点。二、实验目标学会简单工程分层区分驱动文件与主程序​掌握GPIO初始化封装、独立引脚控制函数编写​实现5路LED依次点亮流动的跑马灯效果。三、本地工程真实结构工程新增Hardware文件夹整体目录Start启动文件底层初始化​LibrarySTM32标准外设库​System系统延时、时钟工具​Hardware本次新建存放LED.c、LED.h驱动文件​User仅存放main.c主逻辑不再堆砌初始化代码。四、硬件说明五路LED分别对应PA0、PA1、PA2、PA3、PA4传入参数1代表点亮LED0代表熄灭每路LED串联220Ω限流电阻保护。五、完整代码1.main.c主函数#includestm32f10x.h// Device header#includedelay.h#includeLED.h//Îå¸öµÆÅÝ·Ö±ðÁ¬A0,A1,A2,A3,A4intmain(){led_init();while(1){led2(1);Delay_ms(500);led2(0);led1(1);led3(1);Delay_ms(500);led1(0);led3(0);led0(1);led4(1);Delay_ms(500);led0(0);led4(0);}}2.Hardware/LED.c#includestm32f10x.h// Device headervoidled_init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_PinGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);}//µÆÅݲÙ×÷º¯Êý£¬0ÊDz»ÁÁ£¬1ÊÇÁÁvoidled0(uint16_tx){if(x0)GPIO_SetBits(GPIOA,GPIO_Pin_0);if(x1)GPIO_ResetBits(GPIOA,GPIO_Pin_0);}voidled1(uint16_tx){if(x0)GPIO_SetBits(GPIOA,GPIO_Pin_1);if(x1)GPIO_ResetBits(GPIOA,GPIO_Pin_1);}voidled2(uint16_tx){if(x0)GPIO_SetBits(GPIOA,GPIO_Pin_2);if(x1)GPIO_ResetBits(GPIOA,GPIO_Pin_2);}voidled3(uint16_tx){if(x0)GPIO_SetBits(GPIOA,GPIO_Pin_3);if(x1)GPIO_ResetBits(GPIOA,GPIO_Pin_3);}voidled4(uint16_tx){if(x0)GPIO_SetBits(GPIOA,GPIO_Pin_4);if(x1)GPIO_ResetBits(GPIOA,GPIO_Pin_4);}3.Hardware/LED.h#ifndef__LED_H#define__LED_Hvoidled_init(void);voidled0(uint16_tx);voidled1(uint16_tx);voidled2(uint16_tx);voidled3(uint16_tx);voidled4(uint16_tx);#endif六、粗浅学习感悟第一次尝试分层封装把硬件驱动放到单独Hardware文件夹主函数变得特别简洁可读性提升很多​把每个LED控制写成独立函数主程序只需要调用不用重复写GPIO操作代码​本次跑马灯不是逐个单灯流动而是中间1个亮→中间2个亮→两边一起亮自己设计的灯光流动逻辑熟悉多灯同时点亮控制​目前封装方式还比较冗余五个led函数逻辑高度重复之后学习数组、循环后可以简化代码。七、本次踩坑记录新建Hardware分组后没添加路径编译提示找不到LED.h头文件​头文件忘记加#ifndef防重复包含出现重复定义报错​延时函数大小写写错Delay_ms写成delay_ms直接编译报错​高低电平搞反传入1反而熄灭灯光调试很久才修正逻辑。