尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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反而熄灭灯光调试很久才修正逻辑。
RELATED

相关推荐

Signal Tap II 调试实战:从“invalid JTAG configuration”到“instance not found”的完整排错指南

Signal Tap II 调试实战:从“invalid JTAG configuration”到“instance not found”的完整排错指南

1. 当Signal Tap II罢工时:两个经典错误背后的真相刚接触FPGA调试的新手,十有八九会在Signal Tap II逻辑分析仪上栽跟头。最常见的就是程序明明能正常下载到板子,一运行分析就弹出"invalid JTAG configuration"和"instance no…

📅 2026/9/9 21:13:56
HarmonyOS7 ArkUI 实战:Tabs 可滚动标签栏与 TabContent 内容联动

HarmonyOS7 ArkUI 实战:Tabs 可滚动标签栏与 TabContent 内容联动

文章目录前言代码讲解页面入口怎么安排数据模型先稳住状态变量控制页面反馈布局代码不要从样式开始读Builder 和方法承担复用使用方式完整代码关键代码解析interface 不是摆设State 是交互的开关列表和卡片要靠数据驱动事件回调要短一点样式参数别急着抽常量总结前言 新闻封面最…

📅 2026/8/21 7:37:39
Java Web开发实战:从基础到进阶的典型问题解析

Java Web开发实战:从基础到进阶的典型问题解析

1. Java Web开发基础概念解析Java Web开发是构建动态网站的核心技术栈,它基于Java EE规范,通过Servlet、JSP等技术实现服务器端逻辑处理。很多初学者容易混淆一些基本概念,这里我用实际项目中的经验帮你理清思路。首先明确一点:动…

📅 2026/8/21 7:37:51
MORE NEWS

更多资讯

📰

reinstall 一键重装别名配置指南

reinstall 一键重装别名配置指南 【免费下载链接】reinstall 一键DD/重装脚本 (One-click reinstall OS on VPS) 项目地址: https://gitcode.com/GitHub_Trending/re/reinstall reinstall 是一键 VPS 系统重装脚本。本篇解决一个具体问题:把常用的重装命令写…

📰

AI改写工具与五大核心降重策略详解

1. 论文查重现状与AI改写工具的兴起学术论文的重复率问题一直是困扰研究人员的痛点。国内高校普遍采用知网、万方等查重系统,要求硕士论文重复率不超过10%-15%,博士论文则需控制在5%以下。传统降重方法如近义词替换、语序调整等耗时费力,且容…

📰

提示词工程10个实战技巧:从碰运气到稳定产出高质量结果

做提示词工程这两年,我最大的感受是:大多数人在写提示词的时候,不是在"工程",而是在碰运气。同一个模型,换一种问法,输出质量可以天差地别。有人把这归结为模型随机性,但我见过太多人…

📰

MBD在BMS开发中的应用与优化实践

1. MBD与BMS的跨界融合:一场技术革命的开端在汽车电子领域摸爬滚打十几年,我见证了电池管理系统(BMS)从简单的电压监测到如今复杂的状态估算、均衡控制、热管理的演进过程。而Model-Based Development(MBD)…

📰

大衍数构造LDPC码的Matlab实现与性能分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

基于LSTM神经网络的教育数据分析系统设计与实践

1. 项目背景与核心价值教育领域正经历从经验驱动到数据驱动的转型。传统教学评估主要依赖考试成绩和教师主观判断,难以全面反映学生的学习状态和发展潜力。我们设计的这套系统,通过神经网络技术对学生的多维学习数据进行建模分析,能够实现&am…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬