星星点灯(二)-LED点灯中阶

2024-03-15 19:59
文章标签 led 星星 点灯 中阶

本文主要是介绍星星点灯(二)-LED点灯中阶,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

经过千辛万苦,在上一章《星星点灯(一)-LED点灯初阶》我们终于把LED点亮了,丑是丑了点,但是总是有进步嘛!万丈高楼平地起,有了这个基础,只要我们本着不抛弃,不放弃的精神,来个打破砂锅问到底,我想就会百尺竿头更进一步的。
本章,我们把丑小鸭打扮一下,看看能不能离白天鹅更像一点。
第一步:代码模块化
我们把I/O初始化的代码独立出去,为以后驱动更多的LED做准备,而且由于各种硬件限制原因,可能驱动LED的端口并没有集中到一个顺序的端口,PA有几个,PB有几个等等。那就需要分别的初始化它。
这样我们把实现代码分离出来后,上层调用就不需要做任何的修改,只需要完成底层函数的修改就可以达到这个目的。
把调用和实现分离,这是实现模块化编写代码的第一步。

void LedInit(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);	
}

同样的,我们把延时函数写成一个通用的函数,就像这样:

void DelayMS(UINT32 ms)
{volatile UINT32 i,j; //注意这个变量一定要用volatile 声明,否则编译器会给你优化掉的。for(i = 0;i < ms;i++){for(j = 0;j < 10 * 800;j++);}
}

第二步 把宏定义修理一下

还记得那个奇丑无比的LEDON吗?如果非得定义宏(比如一个系统只有一颗LED)的方式来操作LED的功能,那至少我们可以这样来定义它,使他看起来更加绅士一些:

//定义宏
#define LedOn()		(GPIOB->BRR = GPIO_Pin_14)
#define LedOff()	(GPIOB->BSRR= GPIO_Pin_14)//调用宏
LedOn();
LedOff();

这有什么好处呢?
第一.它至少看起来像一个正常的语句了。
第二.为什么我们不用全部大写的方式来定义宏呢?这样的好处就是当有一天我后悔了,我要用函数的方式来实现这个LedOn()的功能,我只需要去掉宏的定义,用如下的函数去实现就可以了,但是调用的地方却不需要做任何修改。
是不是很有智慧的方式啊,你学会了吗?

void LedOn(void)
{GPIOB->BRR = GPIO_Pin_14;
}

好了,现在我们的点灯程序,有这些模块的支持,我们就比较简洁清爽了,如下:

void main(void)
{LedInit();while(1){LedOn();DelayMS(500);LedOff();DelayMS(500);}
}

现在是不是看起来比较心情愉悦了很多啊?
我们把实现细节对调用者隐藏起来,比如LedInit()函数,把需要变化的参数,用函数传递参数的方式传入来实现调用和实现的分离,这就是函数的模块化最简单的实现。
函数模块化的好处是便于以后上层代码的移植,我们需要更换到其他芯片去实现的时候,上层逻辑就不用再去实现,只要把对应的底层驱动重新编写,就能达到移植的目的。

上面的代码现在还有没有什么缺陷呢?
那就是DelayMS(500)这个函数,我们总不能让CPU就在这里干等,啥事情都不干吧?要干其他事情吧,又怎么去保证LED点亮的延迟时间呢?这真是一个头疼的地方。
中断,对,你第一印象想到的就是中断,在中断里面计数,然后计数到了再点亮或者熄灭LED。大概就是下面这样子:

//1ms的中断程序
static int LedCnt = 0;
static int LedStatus = 0;
void TimerInt(void)
{if(++LedCnt > 500){if(LedStatus == 0)LedOn();elseLedOff();LedStatus  = ~LedStatus;}
}

没毛病,点亮一个LED也对了,在加上一些使能的条件也就差不多了。但是,也就是但是,现在要点亮更多的灯呢?还要玩几个花式呢?又傻眼了吧!系统里面还有按键,还有好多其他的事情,难道都在中断里面去扔一大堆变量?
显然,这是一个不可能完成的任务,如何来解决?请听下回分解。
大致思路提示:
1.消息队列
2.软定时器
3.LED操作函数的修改
在这里插入图片描述

这篇关于星星点灯(二)-LED点灯中阶的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813103

相关文章

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

什么是LED智能会议一体机?COB超微小间距LED会议一体机大势所趋

LED智能会议一体机,作为现代会议室革新的核心装备,正逐步颠覆传统会议模式的界限。它不仅仅是一台集成了高清显示、触控互动、音视频处理及远程协作等功能于一体的智能设备,更是推动会议效率与体验双重飞跃的关键力量。随着技术的不断进步,特别是COB(Chip On Board)超微小间距LED技术的引入,LED智能会议一体机正迎来前所未有的发展机遇,成为大势所趋。 COB技术通过将LED芯片直接封装在基

全倒装COB超微小间距LED显示屏的工艺技术,相比SMD小间距有何优势

全倒装COB(Chip On Board)超微小间距LED显示屏,在工艺技术上的革新,相较于传统的SMD(Surface Mount Device)小间距LED显示屏,展现出了多方面的显著优势。 首先,全倒装技术极大地提升了LED芯片的散热性能。通过将芯片直接焊接在基板上,减少了热阻,使得热量能够更快速地传导至基板并散发出去,有效避免了因高温导致的光衰和色彩偏移问题,从而保证了显示屏的长期稳定性

STM32CubeMX 1 创建一个新工程 利用时钟点亮LED KEIL5 Jlink配置

直接上ST的官网下载STM32CubeMX安装 地址: 单片机:STM32F103C8T6 带外部8MHz晶振 目的:利用Timer和使LED按照1Hz的频率闪烁。 在此方面学霸级人物的指引下学习了,并写此文章记录,以防忘记。 新建工程 出现如下界面,中央就是这个封装的引脚图: 接下来开始配置 1. 设置外部晶振接口在PD0和PD1 单机想要配置的引脚,出现选择菜单。

LED显示屏维修技巧与常见问题

LED显示屏作为现代显示技术的重要组成部分,广泛应用于广告、信息发布、公共显示等多个领域。然而,随着使用时间的增长,LED显示屏难免会出现各种问题。本文将探讨LED显示屏维修的一些小技巧以及常见的问题,帮助用户更好地维护和延长显示屏的使用寿命。 LED显示屏维修小技巧 1. 快速定位问题 当LED显示屏出现问题时,首先需要快速定位故障部位。这通常涉及到对显示屏的初步检查,包括电源

基于 AC 驱动的电容结构 GaN LED 模型开发和应用

随着芯片尺寸减小,微小尺寸GaN 基 Micro LED 显示面临着显示与驱动高密度集成的难题,传统直流(DC)驱动技术会导致结温上升,降低器件寿命。南京大学团队创新提出交流(AC)驱动的单电极 LED(SC-LED)结构【见图1】,利用隧穿结(TJ)降低器件的交流工作电压。为了深入理解该器件的工作原理,我司技术团队开发了基于 AC 驱动的物理解析模型,揭示了隧穿结降低器件工作电压的

全倒装COBP1.5超微小间距LED显示屏快速抢占市场

随着全倒装COBP1.5超微小间距LED显示屏技术的日益成熟与成本的逐步降低,其市场渗透力愈发强劲,迅速在多个领域绽放出耀眼的光芒。不仅在传统的广告传媒、会议展览中成为不可或缺的视觉盛宴制造者,更在高端监控、虚拟现实体验、乃至医疗影像展示等前沿科技领域崭露头角。 随着市场需求的多样化,各大厂商纷纷加大研发投入,不断推出定制化解决方案,以满足不同场景下的特殊需求。这种灵活性与创新性,进一步推动了全

P0.7全倒装COB超微小间距LED显示屏厂家已量产,加速高清显示的发展

随着P0.7全倒装COB超微小间距LED显示屏技术的成功量产,这一里程碑式的成就不仅标志着高清显示技术迈入了全新纪元,更预示着未来视觉体验将迎来前所未有的变革。各大应用场景,如指挥中心、会议中心、大型活动直播、高端影院乃至家庭娱乐,都将因这项技术而焕发新生。 市场上,消费者对于视觉质量的追求日益高涨,P0.7全倒装COB显示屏以其极致细腻的画质、超高的色彩还原度以及卓越的稳定性,迅速成为行业新宠

【蓝桥杯嵌入式(二)Led、Key、Lcd】

蓝桥杯嵌入式(二)Led、Key、Lcd 五、Led模块1.原理图配置2. 知识点3.底层代码 六、Key模块1.原理图配置2.知识点3.底层代码底层代码(四⾏代码版本)底层代码(状态机版本) 七、LCD模块1.原理图配置2.知识点底层代码 五、Led模块 1.原理图配置 2. 知识点 链接: 上拉电阻的通俗解释 链接: 单⽚机怎么输出⾼电平!推挽输出和开

Class4——Esp32|Thonny两种方式同过电脑控制LED灯,路由器与电脑自带热点连接ESP32

上一节我们通过路由器和设备创建了连接,不懂可按上节配置 Class3——Esp32|Thonny——网络连接主机-wifi连接(源代码带教程)-CSDN博客文章浏览阅读57次。Esp32|Thonny网络连接主机-wifi连接(源代码带教程)https://blog.csdn.net/m0_66701835/article/details/141960572?spm=1001.2014.3001