完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
常用单个数码管分共阴极和共阳极数码管,根据其7段(seg)需要接7个IO口。联排的数码管共用段码,分别再需要位(com)码选择亮哪个数码管。如5个联排的数码管就需要7个段选IO,5个位选IO,则需要接12个IO口。
在IO口不足的时候,又想显示多个数码管,这时候就可以使用7pin数码屏这种,通过7个引脚可以控制最多42个段码,就是42个led。节省了IO口,又能达到显示的效果。 通过万用表打到二极管选项,通过红黑探棒可以放在显示数码管的两引脚之间获得显示数码管每段灯亮的引脚电平情况,这就是我们点亮显示数码管的依据。实际编写的代码看所使用IO口的寄存器进行相关的输出(高和低)、输入(高阻态)的设置。大概示意图如下,实际段码以实际器件引脚测量为准。 查理复用(Charlieplex)是一种在驱动大量LED时有效地节约IO口的方法。利用单片机IO口的三个状态:高电平、低电平和高阻态。所谓“高阻态”,指的是引脚对外表现出极大的阻抗状态,对于后级电路的影响很小,在后级电路看来,就如同引脚悬空一样。而另一方面,发光二极管和普通的二极管一样拥有单向导通的特点,只有在电流以某种方式流动的时候,LED才能发光。利用以上两点,我们就能够设计出查理复用拓扑的基本电路了。 如上图显示的简单电路,该电路使用两个端口控制红灯和绿灯,当端口1高端口2低时绿灯亮,端口1低端口2高时红灯亮。根据如此就可以增加端口叠加电路,如在接一个端口3。 增加端口后电路如上图所示,可以发现有2个LED由端口1和2控制,另外两个LED由端口1和3控制,另外2个LED由端口2和3控制,总共6个LED。增加一个端口可控制的led灯的数量为n(n为端口数)*(n-1)。 为了在点亮我们想要点亮的灯的时候不会误点亮其他的灯,只有两个端口可以同时输出(一个为高一个为低),而其他所有端口都可以通过将它们定义为输入来处于高阻抗状态。需要注意驱动的电路完全由单片机取得电流,所以对于IO口的驱动能力有一定的要求。 typedef void (*pfunc) (bool); void Digital_screen_pin0(bool flag) { //定义一个函数,进行屏管脚的的输出高还是低,用if语句通过相应的寄存器进行设置 } //根据使用的几个管脚输出设置函数,定义一个函数指针数组进行存放 pfunc Digital_screen_pfunc[]={Digital_screen_pin0,...} //根据使用的管脚个数进行设置 void Digital_screen_clr(void) { //定义一个数码屏清理函数 //主要把屏脚所使用的GPIO设置为输入,屏就没有显示了 } void Digital_screen_set (u8 seg_bits,u8 com_pin) { //定义一个函数去进行点亮屏,u8为unsigned char void (*pfunc)(bool); u8 i; Digital_screen_clr(); pfunc=Digital_screen_pfunc[com_pin]; (*pfunc)(1); //调用最开始的管脚设置输出函数,把管脚输出高 for(i=0;i { pfunc=Digital_screen_pfunc; if(seg_bits&BIT(i)) //BIT(i)为1< { (*pfunc)(0); } } } //定义一个结构体存放需要的参数 typedef struct { u8 buf[]; u8 seg_bits; u8 com_pin; }Digital_srceen; Digital_srceen Digital_srceen_g; void Digital_srceen_scan(void) //进行屏脚的扫描,放到中断中去处理 { u8 seg_bits; u8 com_pin; Digital_srceen_g.com_pin++; if(Digital_srceen_g.com_pin>(N-1)) { Digital_srceen_g.com_pin=0; } seg_bits=Digital_srceen_g.buf[Digital_srceen_g.com_pin]; com_pin=Digital_srceen_g.com_pin; Digital_screen_set(seg_bits,com_pin); } //Digital_srceen_g.buf[]每个元素是记录每个屏脚为高,对应其他引脚设置低全部显示 //例以开头第一张图片的数码屏为例 //第7脚为高时,只有6,5,3脚为输出低可以分别亮K4,4G,4B.则Digital_srceen_g.buf[6]为0x34 通过编写函数传入置高的位com,和置低的位seg去显示段码。就是去控制IO相关的寄存器的输入/输出模式,和输出的值。这个和联排数码管的思路是差不多的,所使用的7个IO口,当IO1作为com输出高时,可以点亮其他IO口输出为低的6个段。同理其他IO同样也可以,这就是上面所说最多点亮42个led灯。 按com扫描,扫描间隔自己确定。com口共有7个。总共扫描7行。一面完整的图像就显示结束了,在每行扫描的时候,需要亮灯的高低电平点亮,不亮的灯的IO口都设为输入。然后通过编写显示函数就可以用这种数码显示屏去显示像音响等产品的显示UI。 |
|
|
|
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1180浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 18:45 , Processed in 1.249321 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号