在以往的点阵屏中,多使用74HC595作为串并转换的芯片,它所处理的数据宽度只有8位。而现在的显示面板设计多使用16位的驱动IC,例如DP5020就是其中的一种,这样就可以有效地缩减芯片的使用量并可以大幅地化简电路的设计复杂度。此外,该芯片还有一大特点就是其输出端口提供了2~60mA的恒定电流驱动,因而使得LED的发光亮度更均匀且能精确控制,该芯片的内部结构如图1所示。
图1 内部结构
该芯片的引脚排列如图2所示,各引脚的功能则如图3所示。
图2 引脚排列
图3 引脚功能
该芯片在显示面板的设计中,其典型的应用方式见图4所示。
图4 典型应用
DP5020的工作时序如图5 所示,这是后续对其进行驱动的主要基础。
图5时序关系
前面之所以对DP5020作这么详细的介绍,就在于所驱动红色P4.75点阵屏就是基于该芯片来设计的,这块点阵屏的规格为16*64,其外观如图6所示。
在线路构成上,除使用芯片DP5020(4片)之外,还用到的芯片有SM245(2片)和SM5166(2片)。
图6 点阵屏外观
该点阵屏所使用的接口为HUB08,各引脚的名称如图7所示。
图7 HUB08接口
为驱动该点阵屏,所使用的是N76E003最小系统开发板,调试下载工具为MU_LINK,连接方式如图8所示。
图8 开发板及下载工具
点阵屏与开发板的连接关系为:
A---P0.0
B---P0.1
C---P0.2
D---P0.3
R1 ---P1.4
OE ---P0.5
LAT ---P0.6
CLK ---P0.7
所做的相应定义为:
sbit LA=P0^0;
sbit LB=P0^1;
sbit LC=P0^2;
sbit LD=P0^3;
sbit LSCL=P0^7; // CLK
sbit LSTB=P0^6; // LAT
sbit LR1=P1^4; // R1
sbit LEN=P0^5; // OE
UINT8 ScanRow=0;
使用DP5020发送16位数据的函数为:
void DP5020_OutByte(UINT16 dat)
{
UINT8 i=0 ;
for(i=0;i<16;i++)
{
LSCL=0;
if(dat&0x8000)
{
LR1=1;
}
else
{
LR1=0;
}
dat=dat<<1;
LSCL=1;
}
}
void SeleRow(UINT8 Nd)
{
UINT8 N=Nd;
N=N%16;
if(N&0x01) LA=1;
else LA=0;
if (N&0x02) LB=1;
else LB=0;
if (N&0x04) LC=1;
else LC=0;
if (N&0x08) LD=1;
else LD=0;
}
void DisCol(UINT16 *dat,UINT16 len)
{
while(len--)
{
DP5020_OutByte(dat);
}
}
void Display(void)
{
DisCol(0x5555,4);
LEN=1;
LSTB=1;
LSTB=0;
SeleRow (ScanRow)
LEN=0;
ScanRow++;
if(ScanRow>15) ScanRow=0;
}
void main (void)
{
Set_All_GPIO_Quasi_Mode;
set_CLOEN;
ScanRow=0;
while(1)
{
Display();
}
}
经测试,其显示效果如图9所示,说明驱动正常。
图9 驱动测试
在以上驱动程序的基础上,将测试的固定数值改为读取字库中的字模即可实现字符或汉字的显示。
以工具软件PCtoLCD2002来提取字模的方式如图10所示,是垂直镜像字。
图10 字模提取方式
将字模存放到数组的格式为:
UINT8 code tab[]={
0x00,0x00,0xF8,0x23,0x00,0x10,0x00,0x10,0x00,0x00,0xFC,0x07,0x20,0xF1,0x20,0x11,
0x20,0x11,0x20,0x11,0x24,0x11,0x24,0x12,0x24,0x12,0x1C,0x14,0x00,0x28,0xFE,0x47,/*"远",0*/
...
};
实现满屏显示的函数为:
void DisCol(UINT16 lenght)
{
UINT16 dat,n;
UINT8 m=8;
n= lenght-2
while(lenght--)
{
dat=( tab [m*32+ScanRow*2+1]<<8)+ tab [m*32+ScanRow*2];
DP5020_OutByte(dat);
m=m+1;
}
}
图11 汉字显示效果
void DisCol(UINT16 lenght)
{
UINT16 dat,n;
UINT8 m=8;
n= lenght-2;
while(lenght--)
{
if(lenght>n) dat=( tab [m*32+ScanRow*2+1]<<8)+ tab [m*32+ScanRow*2];
else dat=0x0;
DP5020_OutByte(dat);
m=m+1;
}
}
---------------------
作者:jinglixixi
链接:https://bbs.21ic.com/icview-3291270-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。