查理复用算法Charlieplexing下的led矩阵模拟数码管

       老套路;引言,追源,再讲实际

         在产品设计的时候,总是会因为需要控制的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,或者想与我沟通一下算法的实现情况,和问题的处理,都可以与我联系。

    

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值