音乐频谱LED显示屏驱动控制程序案例解析

前些日子,购得一块08接口的双色led显示屏(打算做个音乐频谱显示器),捣鼓了好几天,终于搞清楚了其控制原理,在这里做个总结,算是备忘吧。
1.led显示屏的扫描方式
led显示屏的扫描方式有静态、1/2、1/4、1/8、1/16几种。
这些扫描方式具体是什么意思呢?我们以1/16扫描方式为例来说明。因为led显示屏是逐行刷新显示的,所以在任意时刻我们只能控制其任意一行的显示,每次刷新显示一行,16行为一个扫描周期,这就是1/16扫描方式。当然了,一个扫描周期的时间必须要小于人眼视觉暂留的时间(约0.05秒到0.2秒),否则,人眼会观察到led显示屏所呈现的画面出现闪烁。
2.led显示屏的接口形式
led显示屏的接口形式有04接口、08接口、12接口几种,这里只介绍08接口。
08接口的管脚定义如图1所示。
图108接口管脚定义
其中,管脚la、lb、lc、ld表示行信号;管脚r1、r2、g1、g2表示列信号;管脚en表示使能信号;管脚sck表示时钟信号;管脚stb表示锁存信号;管脚gnd表示接地。
那么,管脚la、lb、lc、ld是如何来控制行信号,从而实现1/16扫描方式的。其实很简单,这是通过两个3-8译码器74hc138芯片来实现,通过这两个芯片可以实现如下的功能:
当管脚ld、lc、lb、la的输出分别为0000时,led显示屏的第一行被选中;
当管脚ld、lc、lb、la的输出分别为0001时,led显示屏的第二行被选中;
当管脚ld、lc、lb、la的输出分别为0010时,led显示屏的第三行被选中;
......
当管脚ld、lc、lb、la的输出分别为1111时,led显示屏的第十六行被选中。
现在,我们已经知道如何通过08接口的四个行信号la、lb、lc、ld来控制led显示屏的每一行了。将08接口的四个列信号都接地,循环给四个行信号输入0000到1111,就可以点亮整个led显示屏了。
但是要在led显示屏上显示出汉字或是图形,仅仅对行信号进行控制是远远不够的,我们还需要对列信号进行控制。
3.led显示屏的列驱动
led显示屏的列驱动使用了74hc595芯片,该芯片具有8位串行输入、8位串行/并行输出,8位锁存功能。
对于64*32的led显示屏来说,因为其总共有64列,所以通过对8个74hc595芯片进行级联,即可将其扩展为64位串行输入,64位并行输出,从而实现对64列信号进行控制。
08接口中的管脚r1、r2、g1、g2就是用来输入64位串行数据的。其中,r1、g1分别用来控制上半屏(16行)的红、绿信号;r2、g2分别用来控制下半屏(16行)的红绿信号。因此,对于64*32的双色led显示屏来说,总共需要使用32个74hc595芯片。
显然,当红绿信号同时使能时(列信号低电平使能),就可以控制led显示屏显示出黄色来了。
现在,我们已经知道led显示屏的列驱动原理,下一步就可以编写程序,让led显示屏显示出任意我们想要的汉字或图形了。
4.示例程序
了解了led显示屏的驱动原理之后,编写单片机程序,利用08接口对其进行控制是很容易的。
程序的大致流程应该是这样的:
(1)初始化单片机的gpio引脚。
(2)设置08接口的使能信号en。
(3)利用行信号选中第1行,移位串行输入第1行的列信号数据,锁存列信号,并行输出显示。
(4)利用行信号选中第2行,移位串行输入第2行的列信号数据,锁存列信号,并行输出显示。
(5)依次遍历,直到第32行,并行输出显示为止。
(6)循环进行3-5的过程。
如下的代码示例了整个程序流程。
1 void main(void) 2 { 3 int rownumber = 0; //行序号 4 int columnnumber = 0; //列序号 5 6 initgpio(); //初始化单片机的gpio引脚 7 led_oe = 1; //使能信号 8 9 while(1) //循环刷新显示 10 { 11 for(rownumber=0; rownumber<16; rownumber++) //写入上半屏的显示内容 12 { 13 setrowlight(rownumber); //行信号选择 14 15 for(columnnumber=0; columnnumber<8; columnnumber++) //写入列信号数据 16 { 17 write1bytetofirsthalfscreen(firsthalfscreenarray[rownumber][columnnumber], 0xff); 18 } 19 20 led_stb = 0; //锁存列信号 21 led_stb = 1; 22 } 23 24 for(rownumber=0; rownumber<16; rownumber++) //写入下半屏的显示内容 25 { 26 setrowlight(rownumber); //行信号选择 27 28 for(columnnumber=0; columnnumber<8; columnnumber++) //写入列信号数据 29 { 30 write1bytetolowerhalfscreen(0xff, lowerhalfscreenarray[rownumber][columnnumber]); 31 } 32 33 led_stb = 0; //锁存列信号 34 led_stb = 1; 35 } 36 } 37 } 其中,函数setrowlight()用于控制行信号的选择;函数write1bytetofirsthalfscreen()用于向上半屏写入列信号数据;函数write1bytetolowerhalfscreen()用于向下半屏写入列信号数据,二维数组firsthalfscreenarray[16][8]和lowerhalfscreenarray[16][8]分别用于存储列信号数据,该数据可以通过汉字图形取模软件得到。


聚芯微电子完成数千万元A轮融资,打造行业领先的3D视觉解决方案
新的PMP技术让三星Galaxy S11的续航能力更为出色
无刷电机振动和噪声的分析
外骨骼机器人的概述与分类
10款常见的稳压电源器件解析
音乐频谱LED显示屏驱动控制程序案例解析
双调光蘑菇灯与维修
监控系统中经常被忽略的故障原因
250VAC离线LED驱动解决方案
救灾现场,应急通信车来干嘛?
实体清单对中芯国际的影响分析
板柱节点计算用等效集中反力设计值
差模信号和共模信号的区别 共模噪声影响电路工作的实质
提高直升机航空电子设备的态势感知能力
美科学家为机器人视觉开发4D相机_能生成4D图像及捕捉近140度的信息
网友票选魅族最强5功能 多任务处理排第一
三星Fold评测 不要再让惊艳变成惊吓
iphone8什么时候上市?iphone8最新消息:增强现实体验,可能是iphone8的最大卖点?
数据信息大时代下,分布式存储将成为变局的突破点
物联网应用怎样和工厂与医疗相联系