返回列表 发新帖我要提问本帖赏金: 30.00元(功能说明)

[应用方案] 以N76E003驱动P10插灯全彩点阵屏

[复制链接]
2216|5
 楼主| jinglixixi 发表于 2023-3-23 00:38 | 显示全部楼层 |阅读模式
#申请原创# @21小跑堂

除了各种单色的点阵屏之外,还有相应规格的全彩点阵屏,图1所示的就是一种P10规格的插灯式全彩点阵屏,其型号为P10(1R1G1B)16*16-D-SH,显示分辨率为16*16点。
1.jpg
图1 点阵屏外观

该点阵屏所采用的接口为HUB75接口,见图2所示。
2.jpg
2  HUB75接口

该点阵屏在电路设计上方面主要由芯片SM16126D12片)、74HC245D2片)和74HC138D1片)所构成。
该点阵屏所使用的串并转换芯片为SM16126D,其引脚的排列方式与DP5020相兼容,见图3所示。
3.jpg
3  引脚排列

该芯片的工作时序见图4所示:
4.jpg
4  工作时

在工作方式上,该点阵屏与常规点阵屏的最大区别在于,它不是采用1/16的扫描方式,而是采用1/4的扫描方式,并采用蛇形方式,共分为上下2路进行控制。
由图5可知,这里所说的2路含义在于其每路输入信号只负责上或下8行的显示输出。
5.jpg
5 工作时序

而1/4扫则是指它只有4个行扫描地址,也就是说1个行地址要控制2个显示行。
至于蛇形扫描方式就更奇特了,它在扫描输出时并非超着一个固定的方向,而是在不同的行沿着不同的方向,这就为编程设计增加了复杂的难道。
如果这样说你还不明白的话,可以参照图6所示来了解,该图案是向4个行地址都输出值同一个值0xF0CC00FF来实现。
6.jpg
6 输出内容

那为什么会形成这样的结果呢?
由表1的数据排列方式即可看出其扫描输出的轨迹。

表1 数据排列及扫描方向
q.jpg

为驱动该点阵屏,所使用的是N76E003最小系统开发板,它与开发板的连接关系为:
A  --- P0.0
B  --- P0.1
G1 --- P1. 4
G2 --- P1. 5
EN --- P0.5
STB--- P0. 6
CLK--- P0. 7
所作的相应定义如下:
sbit LA=P0^0;
sbit LB=P0^1;
sbitLSCL=P0^7;
sbitLSTB=P0^6;
sbit LG1=P1^4;
sbit LG2=P1^5;
sbit LEN=P0^5;

实现图6所示效果的主程序为:
  1. void main (void)
  2. {
  3.          Set_All_GPIO_Quasi_Mode;
  4.          set_CLOEN;
  5.          ScanRow=0;
  6.      while(1)
  7.      {
  8.                   Display();
  9.                   delay_us(100);
  10.      }
  11. }

所涉及的相关函数有:SeleRow()、SM16126OutByte()及Display()
扫描点阵输出函数:
  1. void  SeleRow(UINT8 d)
  2. {
  3.     UINT8 n=d;
  4.     n=d%4;
  5.     LA=(n&0x01)>0 ?1:0;
  6.     LB=(n&0x02)>0 ?1:0;
  7. }

串行数据发送函数:
  1. void  SM16126 OutByte(void)
  2. {
  3.     UINT32  dat=0xF0CC00FF ;
  4.     UINT8   i=0 ;
  5.     for(i=0;i<32;i++)
  6.     {
  7.         LSCL=0;
  8.         if(dat&0x80000000)
  9.         {
  10.               LG1=1;
  11.         }
  12.         else
  13.         {
  14.                          LG1=0;
  15.         }
  16.             dat=dat<<1;
  17.         LSCL=1;
  18.     }
  19. }

输出显示函数
  1. void Display(void)
  2. {
  3.           LEN=1;
  4.           LSTB=1;
  5.           LSTB=0;
  6.           SM16126 OutByte ();
  7.       SeleRow(ScanRow);
  8.       LEN=0;
  9.       ScanRow++;
  10.           if(ScanRow>3) ScanRow=0;
  11. }

有了前面显示的基础,就可以着手解决汉字的显示问题了。

当依序输出数据0xF0CC00FF0x0FCCFF000xFC0C00FF0xFCC00F0F时,其输出效果如图7所示。
7.jpg
7 显示效果

经分析可以发现,数据0xF0CC00FF被显示在第2行和第6行,数据0x0FCCFF00被显示在第3行和第7行,其它以此类推,也就是说向地址0发送的数据并没有显示在第1行。此外,向地址3所发送的数据0xFCC00F0F则被显示在第1行和第5行。

以显示“枫”字为例,可通过工具软件以图9的格式来提取字模。
8.jpg
8 显示效果

9.jpg
9 字模提取格式
所提取的字模则存放在数组中,其存储形式为:
UINT8 code t[]={
0x20,0x00,0x23,0xF8,0x22,0x08,0x22,0x08,0xFB,0x28,0x22,0xA8,0x22,0xA8,0x72,0x48,
0x6A,0x48,0xA2,0xA8,0xA2,0xA8,0x23,0x2A,0x24,0x0A,0x24,0x0A,0x28,0x06,0x30,0x02,/*"",0*/
};
接下来需要解决的问题有:
1)方向问题
2)位置问题
3)间隔问题
4)调序问题
5)多彩处理
1. 方向问题
由于字模的提取是按固定模式来处理,因此蛇形的扫描方式是很难用一种定向的方式来读取字模的,需要利用正反2个读取函数来处理蛇形扫描。

正向扫描函数:
  1. void Z_OutByte(UINT8 dat1, UINT8 dat2)
  2. {
  3.     UINT8 i=0 ;
  4.     for(i=0;i<8;i++)
  5.     {
  6.         LSCL=0;
  7.         if(dat1&0x80)
  8.         {
  9.                             LG1=1;
  10.         }
  11.         else
  12.         {
  13.                             LG1=0;
  14.         }
  15.         if(dat2&0x80)
  16.         {
  17.                             LG2=1;
  18.         }
  19.         else
  20.         {
  21.                             LG2=0;
  22.         }
  23.         dat1=dat1<<1;
  24.                 dat2=da2<<1;
  25.         LSCL=1;
  26.     }
  27. }

反向扫描函数:
  1. void F_OutByte (UINT8 dat1, UINT8 dat2)
  2. {
  3.     UINT8 i=0 ;
  4.     for(i=0;i<8;i++)
  5.     {
  6.         LSCL=0;
  7.         if(dat1&0x01)
  8.         {
  9.                                 LG1=1;
  10.         }
  11.         else
  12.         {
  13.                                   LG1=0;
  14.         }
  15.                 if(dat2&0x01)
  16.         {
  17.                             LG2=1;
  18.         }
  19.         else
  20.         {
  21.                             LG2=0;
  22.         }
  23.         dat1=dat1>>1;
  24.                 dat2=dat2>>1;
  25.         LSCL=1;
  26.     }
  27. }

2.位置调整

由于蛇形扫描的原因,本应在同一行的数据被放置在了不同的行,因此在输出数据时需对输出数据的实现加以调整,具体的变化见图10所示
10.jpg
10 交换数据顺序

3.间隔问题
由于一个地址的数据会被输送到2行来显示,且间隔了3行。因此在显示时,需要按显示要求来调整输出数据的位置。

例如地址0的数据被显示在第2行和第6行,地址1的数据被显示在第3行和第7行,因此要正确地显示地址0的内容就需把第6行的数据放到第3行的地址上,具体的交换关系如图11所示。
11.jpg
11交换数据位置

4.调序问题
若按0~3的顺序来输出数据,则显示的数据分别位于26374815行,其显示效果如图12所示。

为完成显示要求的,需通过相应的函数来解决调序问题。
12.jpg
12  显示效果


解决调序的函数为:
  1. void SeleRow(UINT8 d)
  2. {
  3.     UINT8 n=d;
  4.         if(d==0)  n=3;
  5.         if(d==1)  n=0;
  6.         if(d==2)  n=1;
  7.         if(d==3)  n=2;
  8.         n=n%4;
  9.         LA=(n&0x01)>0 ?1:0;
  10.     LB=(n&0x02)>0 ?1:0;
  11. }

修改后的汉字显示函数为:
  1. void Display(void)
  2. {
  3.           UINT16 d,n;
  4.           UINT8  p;
  5.           LEN=1;
  6.           LSTB=1;
  7.           LSTB=0;
  8.           n=ScanRow/2;
  9.           d=ScanRow*2;
  10.           p=d;
  11.           F_OutByte(t[p],t[p+16]);
  12.           p=8+d;
  13.           Z_OutByte(t[p],t[p+16]);
  14.           p=1+d;
  15.           F_OutByte(t[p],t[p+16]);
  16.       p=8+1+d;
  17.           Z_OutByte(t[p],t[p+16]);
  18.           SeleRow(ScanRow);
  19.       LEN=0;
  20.       ScanRow++;
  21.           if(ScanRow>3)  ScanRow=0;
  22. }

在解决以上问题后,通过使用函数Display() 即可达到图8所示的显示效果。
5.多彩处理
若将G1G2的输出信号连接到B1B2或是连接到R1R2则可得到图13所示的效果。

若感兴趣的话,还可以增添色彩控制函数以实现多种色彩的显示。
13.jpg
13 显示效果


至此就完成了该点阵屏的显示驱动,当然在扩充字库的情况下,就可实现更多内容的显示。此外,还可为其添加滚动显示效果等。




打赏榜单

21小跑堂 打赏了 30.00 元 2023-03-24
理由:恭喜通过原创审核!期待您更多的原创作品~

七毛钱 发表于 2023-3-23 15:16 来自手机 | 显示全部楼层
点阵屏真的字如其名
小明的同学 发表于 2023-3-23 18:39 | 显示全部楼层
原理图呢,这也看不出门道啊,看看图。
chenjun89 发表于 2023-3-23 20:36 来自手机 | 显示全部楼层
这个屏有点闪眼睛
 楼主| jinglixixi 发表于 2023-3-23 22:35 | 显示全部楼层
小明的同学 发表于 2023-3-23 18:39
原理图呢,这也看不出门道啊,看看图。

哈哈,厂家是不提供相关资料的,因此才有这篇原创,完全是以黑盒测试的方法来实现其驱动显示的。
 楼主| jinglixixi 发表于 2023-3-23 22:38 | 显示全部楼层
chenjun89 发表于 2023-3-23 20:36
这个屏有点闪眼睛

这种插灯屏没有遮光处理,绝对的高亮度闪眼睛!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

525

主题

2965

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部