完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
老套路;引言,追源,再讲实际
在产品设计的时候,总是会因为需要控制的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,或者想与我沟通一下算法的实现情况,和问题的处理,都可以与我联系。 |
|
|
|
只有小组成员才能发言,加入小组>>
3280 浏览 9 评论
2958 浏览 16 评论
3460 浏览 1 评论
9004 浏览 16 评论
4052 浏览 18 评论
1115浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 15:34 , Processed in 1.358103 second(s), Total 81, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号