基于ARMS3C44B0X的LED显示屏设计
陈 科,孟 文,肖世德,袁 军
(西南交通大学智能机电技术研究所,四川成都 610031,E2mail:allberchen@163.com)
摘 要:为了简化LED显示屏的驱动电路,节约单片机的端口资源,对常见的LED显示屏驱动电路进行了改进,全部采用通用的串入并出移位寄存器作为选通驱动,系统全部采用串行数据控制,形成了一种只需4根信号线的LED显示屏驱动电路解决方案,仅需占用单片机的4个I/O端口发送串行数据就可以实现正常的显示功能,文中给出相应的程序代码。]
关键词:LED显示屏;单片机;串入并出移位寄存器;串行数据;I/O端口
1 引 言
LED显示屏应用十分广泛,是信息传播的有效工具。在某井下矿采设备监测系统中选用了ARMS3C44B0X32位单片机作为CPU,根据应用要求,监测系统的显示部分使用16行的单色LED显示屏实时显示监测数据。由于系统外设较多,端口资源十分紧张,针对这种情况开发了一种四线驱动的显示屏电路设计方案,很好地解决了这个问题。
2 常见的驱动电路设计及改进
在常见的显示驱动电路设计中,列控制一般采用串入并带锁存的移位寄存器如74HC595,将数据打入锁存器中,使寄存器各引脚呈现与锁存器相同的状态来选中需要点亮的列。行控制一般采用译码器电路如4/16译码器74HC154,控制信号经译码后选中需要点亮的行。这种硬件结构设计需要较多的控制信号线,占用单片机较多端口从而造成端口资源的浪费。
在改进的LED显示屏驱动电路设计方案中,行、列控制均采用串入并出带锁存的移位寄存器,控制信号的产生均由S3C44B0X的I/O口发送串行数据来实现,这样仅需要4根信号线LED显示屏就能正常工作。
3 显示驱动电路设计
3.1 电路结构
LED显示屏由多个LED点阵模块构成。显示电路采用1/16扫描方式,显示点阵的一行对应一路行选通信号,各行的同一列共用一个列选通信号。当需要在LED显示屏上显示图文内容时,只要在行、列显示数据控制下让显示屏上相应的发光器件点亮就可以了,一次点亮一行,依次点亮各行,只要速度足够快就会产生连续的视觉感受[1]。
行驱动电路采用HEF4094带锁存功能的串入并出移位寄存器。如图1,引脚D为串行数据输入端,引脚CP为移位时钟脉冲输入端,STR为输出锁存器打入信号输入端,OE为输出使能信号输入端,当其为高时锁存器的输出才开放,芯片输出端为00~07,OS、OS′作为级联输出,见参考文献[2]。
列驱动电路采用74HC595带锁存功能的串入并出移位寄存器。如图1,引脚SER为串行数据输入端,引脚SRCLK为移位时钟脉冲输入端,引脚RCLK为输出锁存器打入信号输入端,EO为输出使能信号输入端,只有当其为低时锁存器的输出才开放,引脚SRCLR为移位寄存器的清零输入端,当其为低时移位寄存器的输出全部为零,芯片输出端为QA~QH,QH′作为级联输出,见参考文献[3]。
由I/O口送出的控制信号经总线驱动器74HC245分别接到行、列驱动电路上。显示电路结构如图2所示/
该LED显示屏为16行×64列点阵,共需两片HEF4094级联以及8片74HC595级联。
由HEF4094组成的行驱动器如图1所示。由两片HEF4094组成16行的驱动,图中只画出第一片。第一片HEF4094的D端连接I/O口输出的串行行显示数据,OS端连接下一片的D端。两片相应的CP并联,作为统一的串行数据移位信号。在各控制信号输入端中,STR端(高电平有效)、EO(高电平有效)锁存输出使能端接直流电源正极。
由74HC595组成的列驱动器如图1所示。由8片74HC595组成64列的驱动,图中只画出第一片。第一片595的SER端连接I/O口输出的串行列显示数据,Q’H端连接下一片的SER端,各片均采用相同的方法组成8片的级联,各片相应的SRCLK,SRCLR,RCLK分别并联,作为统一的串行数据移位信号和输出锁存打入信号。在各控制信号输入端中,SRCLR(低电平有效)移位寄存器清零输入端接电源正极、OE(低电平有效)锁存输出使能端直接接地。
图1中黑箭头所指即为下一片74HC595或HEF4904的信号输入端。
由于行驱动电路同时驱动64列的LED发光器件,按每一LED器件电流20mA计算,64个LED同时发光时就需要64×20=1280mA的驱动电流。因此需要用功率管驱动,如TP122等[4]。
3.2 基本显示原理
采用这种显示驱动电路设计,只需4个I/O口分别发送SRCLK、RCLK&CP、SER、D信号就能实现正常的显示功能,其中74HC595的RCLK和HEF4094的CP共用一根信号线,由同一I/O口发出控制信号。74HC595的SRCLR信号输入端接直流电源正极避免进行清零操作,OE信号输入端接地使得一旦列显示数据出现在锁存器的同时各输出引脚即呈现出相应的高低电平状态。HEF4094的STR信号输入端接直流电源正极使得行显示数据出现在片内移位寄存器的同时即被打入锁存器从而避免锁存打入操作,OE信号输入端接直流电源正极使得一旦行显示数据出现在锁存器的同时各输出引脚即呈现出相应的高低电平状态。因此,需要点亮某一行时,需要执行以下几个步骤:
(1)将15位行显示数据通过D、CP信号依次送入到两片级联的HEF4094中,最后一次移位在第三步完成。
(2)将64位列显示数据通过SER、SRCLK信号依次送入到8片级联的74HC595中。
(3)发出列显示的锁存打入信号RCLK,把列显数据打到各595的输出引脚上,完成列显示的准备工作,同时由于行移位信号CP与RCLK共用一根信号线,行显示数据完成最后一次移位,完成行显示准备工作。
(4)行列数据都准备完毕,显示屏中被选中的那一行被点亮。
(5)延时几毫秒保证每一行有充分的点亮时间然后进行下一行的显示。
按照以上步骤依次点亮16行,即可让LED屏显示需要的图文内容。
4 LED显示屏的软件设计
HEF4094和74HC595都是串入并出移位寄存器,显然应用串行口驱动,但是S3C44B0X的串口资源有限,还要用来与上位机进行通信;因此采用将并行的I/O口模拟成串行口的方法来解决。这样仅需要4个并行I/O口就可以完成显示任务,在程序中使用PORTD0到PORTD3这4个I/O口,PORTD由8个I/O端口组成,见参考文献[5]。
下面是已经在HitoolForARM编译环境中通过的在16行×64列点阵LED显示屏上显示4个汉字的程序,该程序用C语言编写,稍做修改就可以用于各种单片机系统。
首先将要显示的4个16×16点阵的汉字字模存储在数组zimo[128]中。主程序代码如下:
voidSend-Char(void)
{ unsignedshortRow-Data=0×8000;
intk;
for(k=0;k<128;k+=8)
{ ∥调用发送行显示数据子函数
Send-Row-Data(Row-Data);
intj; ∥依次取0~7,8~16等数组元素 for(j=0;j<8;j++) ∥调用发送列显示数据子函数 Send-Line-Data(zimo[j+k]); ∥对PORTD3清零置位发送列显示的锁存打 入信号 rPDATD=rPDATD&0×fb; rPDATD=rPDATD|0×04; ∥延时几毫秒保证该行的点亮时间 Delay(6);∥行选数据移位准备发送下一行数 Send-Dataμ=1; }}
行显示数据发送子程序代码如下: voidSend-Row-Data(unsignedshorty){ intm=0; ∥发送行显示数据 for(m=0;m<16;m++)
{ if(y&1)
∥如果显示该行则对PORTD0置 1否则置0
rPDATD=rPDATD|0×01; else
rPDATD=rPDATD&0×fe; ∥行显示数据移位准备发送下一位 yμ=1; ∥只移位15次 if(m<15) { ∥对PORTD3清零置位发送行显 示数据移位时钟脉冲 rPDATD=rPDATD&0×f7; rPDATD=rPDATD|0×08; } }
}
列显示数据发送子程序代码如下:
voidSend-Line-Data(unsignedcharx)
{ inti; ∥发送列显示数据 for(i=0;i<8;i++)
{ if(x&1)
∥如果该列需点亮则PORTD1 置0否则置1 rPDATD=rPDATD&0×fd; else rPDATD=rPDATD|0×02; ∥列显示数据移位准备发送下一位 xμ=1;
∥对PORTD2清零置位发送列显 示数据移位时钟脉冲 rPDATD=rPDATD&0×fb; rPDATD=rPDATD|0×04;
}
}
延时子程序代码如下,LoopCount的数值可根据所选用的单片机时钟频率来设定。 voidDelay(inttime)
{ intLoopCount=300;
for(;time>0;time22)
for(i=0;i<LoopCount;i++);}
5 结束语
这种设计方案大大节省了单片机的端口资源,有效简化了显示屏的电路结构,提高了整个显示系统的可靠性,根据这个设计原理可设计出各种规模的LED显示屏。