对于大多数单片机的学习者或者是从事单片机行业的工程师来说,单片机驱动LED闪烁起来的时候,基本都是我们入坑的开始,同时当时的那种兴奋与喜悦都是难以忘怀的,从LED灯亮起,到闪烁,再到各种流水灯,能开心好几个晚上。
一个LED灯的驱动程序可以说是最简单的,但是随着学习的深入,以及经验的积累,慢慢的会发现,想写一个高效的、普适的、可移植的驱动模块又不是那么容易,每次一般都是根据实际的情况现写一个,当然现写一个也不会花很多时间,但是我们却每次做项目都会要重复着造着这么一个最简单的轮子,因此在这里我想写一个从最原始的到目前我的能力所能达到的最好用的LED驱动模块,当然,我本身也是一个小白,希望能抛砖引玉,欢迎各路大神,提出宝贵意见。
基本实际的项目里面LED的数量不会很多,大多数情况不会超过3个(需要单片机控制的),一般只有两种接法(极个别的时候动态扫描的方式除外):一种是拉电流,一种是灌电流,说白了就是高电平亮还是低电平亮的问题,在这里我们主要以单个的LED驱动的方式来说明。
一般的实际项目当中,LED灯的模式主要是以下几种:
常亮/常灭:这个就没什么好说的了
快闪/慢闪:主要是用于不同的状态模块如:正在联网到网络连接成功
触发反转:主要是用于通信状态的指示,当收到数据的时候通过不停的亮灭来指示灯正在通信。
呼吸模式:主要是用于等待用户操作的一个状态
故障码输出:类似摩斯码的当时通过亮的长短来组成一组故障码
以上几种模式不是绝对的,只是相对的,具体怎么用户不同的工程师不同的产品,具体情况具体分析,只要合乎逻辑就可以了。
现在我想要做就是比较好用且相对来说高效的一个LED驱动模块,先定一个小目标,达到以下功能要求:
高电平低电平驱动都可使用(当然这一条算是废话)
非常容易移植,随便哪个工程只需要修改引脚即可,自己配置模式即可
几乎涵盖了所有项目对于一个指示灯功能的需求,什么模式都可以使用
理论上支持无限多个LED指示灯(局限于内存空间)
C语言编写(曾经使用C++写过,但是当LED比较多的时候,效率会比较低,当然也与自己的编程水平有关,所以在这里还是使用C语言来写),但是使用起来类似面向对象的使用方式。
当然在这里,我不是一上来直接就这个LED驱动程序写出来,既然标题是单片机驱动LED灯的进阶之路,其实我更想通过一个简单的LED的驱动程序的不断演变,来传递一点编程的理念与编程思想,以及我们在编程的过程中所不断摸索出的一些技巧,这些东西的价值可能远大于一个LED灯的驱动程序。
入门阶段:
LED_ON;
Delayms(500);
LED_OFF;
Delayms(500);
当我们在写这种驱动程序的时候,相信思想还是比较符合人类的思考,