?????? 老套路;引言,追源,再讲实际
?????????在产品设计的时候,总是会因为需要控制的led数量过多而感到烦恼,点亮几个灯明明如此简单的功能却要占用非常多的IO,这对低成本的产品而言无疑是雪上加霜。
??????? 大学期间我们都学过矩阵式点多个灯或按键的设计,如果称其为进阶版,那查理复用就可以说是高级版的设计了,见下图,这里一共点了20个灯。实际操作方法最后与程序思想一起介绍。
???? 要实现该算法,所选MCU的GPIO功能必须拥有三态
该图为基础复用,每两个IO之间接正反两个发光二极管,发光二极管也是二极管,具有正向导通的功能,所以当pin1输出1,pin2输出0时,只有LED1会发光
?该图升级为3个IO控制6个led,此处就开始需要涉及到GPIO中高阻态的功能了,多数的MCU都具备高阻态输入功能,详细可以查看所使用的MCU规格书,回到上图,比如我只点亮LED1,则需要设置pin2为低电平,pin1为高电平,而此时,当pin2为低电平时,要使LED4不亮,pin3需设置为低电平,此时,pin1与pin3之间的LED5就被点亮了,故单纯使用高低电平的输出模式无法实现此算法,将pin3设置为高阻态,可以通俗的把高阻态理解为断路,也就是不具备电平,整个电路只剩下LED1一条回路了,从而只点亮了LED1,以此类推。
重点来了
?
?????????看完上面的两个图后,实际的操作其实已经知道了,本文章就是要讲解用此方法实现数码管,我实现该方法的思想如下;
????????构建一个三维数组,我将其暂时设为x,y,z轴,x轴为需要显示的数据,也就是0-99,y轴为所需要显示数字的五个状态,z为该状态需要轮询的五个IO配置,简易的说,当我使用5个IO的时候,其实已经决定了我需要轮询五轮配置,每轮点亮每一列下我需要的灯,经过五轮后,点亮所有我需要的灯从而达到最终我要显示的数字,弊端在于,该方法无法将两位数码管单独控制,当你需要单独控制时,就需要10轮的配置,也就是频率需要double,这对整个系统而言,压力是巨大的,可以大概想一下,我整个系统啥都不干,就500us轮询一次的在那里只干显示,那其他功能还干不干了,当然,如果可以将代码量精简或者不考虑功耗将MCU的时钟频率开到24M或者48M甚至72M再往上跑,那完全可以显示更多位。
??????? 该算法实际应用时,也遇到数码管余晖问题,解决办法同数码管消隐一致,每一个状态显示前先将所有IO设置为高阻态即可。
????????其实以理论来讲,只要频率够快,多少位的数码管都是可以实现的,但是不得不说该方法存在一些致命的弊端,也是矛盾的地方,会使用该方法的目的是为了节省IO,选用的mcu内存本身不大,但实现该方法却需要占用3k左右的内存,所以具体实例具体分析,如果大家有更好的方法实现该算法或纠正该文章的bug,或者想与我沟通一下算法的实现情况,和问题的处理,都可以与我联系。
????
|