本帖最后由 jinglixixi 于 2023-3-21 00:39 编辑
#申请原创# @21小跑堂
LED点阵屏在生活中的使用已十分普遍,如在各大赛场及商场等。此外,小型的电子胸牌也会用到它。 尽管我们在学习这方面的知识时是使用一些8*8之类的点阵模块,而在实际的应用中则是选取更易于组装的模块(也称为半板),见图1所示。
图1单色屏外观
此外,点阵模块也分为多种类型,如按色彩分有单红、单绿、单白、红绿双色及全彩等,按尺寸规格分有F3.75、P4.75、P10等类型,也有按点阵规格分的,如16*16、16*64等规格。 当然,各点阵模块的最大区别还是所采用的硬件设计方案不同,所用的芯片不同。 因此,在购置点阵模块要十分注意。否则,你的硬件驱动程序不一定与购置的点阵模块向匹配,也就无法获得正常的效果! 图2全彩屏
另外,点阵模块的接口也是存在差异的,例如有HUB08接口的,也有HUB75接口的,见图3所示。 图3 接口方式
以HUB08接口为例,各引脚的作用如图4所示。 图4 引脚用途
下面就以图1所示的点阵模块为例来介绍它的驱动方法。该点阵模块为红色点阵屏,显示分辨率为16*64,接口为HUB08,所使用的芯片主要有74HC245、74HC138及74HC595。 其中,74HC245用于数据缓存处理,74HC138用于扫描行的控制,74HC595用于数据的串并转换。
该点阵模块采用5V工作电压,用于功耗较大因此要使用独立的电源模块供电,见图5所示。
图5 供电方式
在显示驱动方面,所使用的芯片为N76E003,其最小系统功能板见图6所示。 图6 开发板
该芯片的引脚用途及排列,见图7所示。 图7 引脚排列及用途
为驱动点阵模块,两者的连接关系为: 点阵屏与开发板的连接关系为: A --- P1.1 B --- P1.2 C --- P1.3 D --- P1.4 EN--- P1.0 R1 --- P1.5 STB--- P1.6 CLK--- P1.7
为此在程序中所作的相关定义如下: sbit R1=P1^5; //数据线R1 sbit STCP=P1^6; // 锁存信号STB sbit SHCP=P1^7; // 时钟信号CLK sbit SHOW_OE=P1^0; //输出运行EN
#define RED1_HIGH R1=1; #define RED1_LOW R1=0;
#define SHCP_HIGH SHCP=1 #define SHCP_LOW SHCP=0 #define STCP_HIGH STCP=1 #define STCP_LOW STCP=0 #define ADDR P1
为了显示汉字,所用的字模提取软件PCtoLCD2002,其操作界面如图8所示,所采用的提取格式则按图9所示来设置。 图8 操作界面
图9 提取格式
存储字模的数组格式为: unsigned char code table1[]={ /*好*/ 0x10,0x00,0x10,0xFC,0x10,0x04,0x10,0x08,0xFC,0x10,0x24,0x20,0x24,0x20,0x25,0xFE, 0x24,0x20,0x48,0x20,0x28,0x20,0x10,0x20,0x28,0x20,0x44,0x20,0x84,0xA0,0x00,0x40, ... ... }
以串行方式发送字节数据的函数为: void HC595_write(uchar dat1)
{
uchar i;
for(i=0;i<8;i++)
{
if((dat1<<i)&0x80) RED1_LOW;
else RED1_HIGH;
SHCP_LOW;
SHCP_HIGH;
}
}
为配合时序控制的需要,所配置的延时函数为: void delay(uint z)
{
while(z--);
}
实现静态内容显示的函数为: void SCREEN_SHOW()
{
uchar i,j,t=0,temp;
SHOW_OE=0;
for(i=0;i<16;i++) // ((8*8)*4)*4
{
STCP_HIGH;
for(j=0;j<8;j++)
{
HC595_write(table1[(j%2)+(j/2)*32+i*2]);
}
// #define ADDR P1
temp=ADDR;
ADDR=(temp&0xe1|(t<<1)); //ABCD P1.1-P1.4
STCP_LOW;
STCP_HIGH;
t++;
delay(100);
}
}
其中:外层循环是为了完成16行内容的输出,而内层的8次循环是为了满足将4个汉字所占8字节位宽的需要(2个字节16位,8个字节的64位正是点阵屏的列数)。 此外,变量t是用来形成行地址的,通过ADDR=(temp&0xe1|(t<<1))的处理,正好将4位的行地址发送到P1.1至P1.4,而对其它位却不产生影响。 至于HC595_write(table1[(j%2)+(j/2)*32+i*2])的作用,则是通过8次内循环,按相邻汉字的固定间隔来读取字模,从而保证每个汉字都准确地显示在自己的位置上。 了解了各行程序的作用,在需要扩展点阵屏的宽度时,就可以通过修改相应的参数来得到预期的目标。
为实现图10所示的显示效果,需单独提取显示字模,其规格为8*16点阵。 图10 时钟显示效果
相应的字模存储结构为: unsignedchar code table2[]={ 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,//"0",0 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,//"1",1 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,//"2",2 ... }
实现图示效果的显示函数为: void SCREEN_SHOW()
{
UINT8 i,j,t=0,temp,p=0,u;
UINT8 ch[8]={0x1,0x2,0xb,0x3, 0x0,0xb,0x0,0x1}; // 数字的显示值是按顺序编码值
SHOW_OE=0;
for(i=0;i<16;i++)
{
STCP_HIGH;
for(j=0;j<8;j++)
{
HC595_write(table2[ch[j]*16+i]);
}
temp=ADDR;
ADDR=(temp&0xe1|(t<<1));
STCP_LOW;
STCP_HIGH;
t++;
delay(100);
}
}
由于N76E003没有RTC之类的计时,为此可通过延时函数来模拟一个RTC计时功能其函数为: void SCREEN_SHOW()
{
UINT8 i,j,t=0,temp;
UINT8 ch[8]={0x0,0x0,0xb,0x0,0x0,0xb,0x0,0x0};
UINT8 h,m,s;
UINT16 c;
SHOW_OE=0;
h=12;
m=30;
s=0;
c=0;
while(1)
{
for(i=0;i<16;i++)
{
STCP_HIGH;
ch[0]=h/10;
ch[1]=h%10;
ch[3]=m/10;
ch[4]=m%10;
ch[6]=s/10;
ch[7]=s%10;
for(j=0;j<8;j++)
{
HC595_write(table2[ch[j]*16+i]);
}
temp=ADDR;
ADDR=(temp&0xe1|(t<<1));
STCP_LOW;
STCP_HIGH;
t++;
Timer2_Delay1ms(1);
c=c+1;
if(c==750)
{
c=0;
s=s+1;
}
if(s==60)
{
s=0;
m=m+1;
}
if(m==60)
{
m=0;
h=(h+1)%24;
}
}
}
}
相应的主程序为: void main (void)
{
unsigned char i;
Set_All_GPIO_Quasi_Mode;
set_CLOEN;
SHOW_OE=0;
SCREEN_SHOW();
}
别看N76E003这款单片机芯片不起眼,它同样能驱动和控制比它体量大相对倍的显示模块。
以此为基础,通过与相应传感器的配合还可完成环境状态的检测及广告牌式的显示。
演示视频:
|
LED点阵显示屏是由许多均匀排列的发光二极管组成的显示模块,因其亮度高、寿命长、视角大、易于与计算机接口等优点,而被广泛应用在文字、图像信息的播放中。其控制方式也较为简单,可移植性也较高,作者采用N76E003来控制点阵屏的显示,成本较低,显示效果也较好。