[STM32H5] 【NUCLEO- H563ZI 测评】+彩色点阵屏显示驱动

[复制链接]
1082|3
 楼主| jinglixixi 发表于 2023-7-20 18:41 | 显示全部楼层 |阅读模式
#申请原创#
在彩色点阵屏中,分插灯式和非插灯式2种,相对来讲插灯式的色彩显示效果会弱一些,故本没有选用插灯式点阵屏,该点阵屏的显示分辨率为16*32点,其外观如图1和图2所示。
1.jpg
图1 点阵屏正面

2.jpg
图2点阵屏背面


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

图3 HUB75接口

点阵屏与开发板的连接关系为:
A---PA5
B---PG9
C---PB5
SCL---PD14
STB---PD15
EN---PF3
R1---PB13
R2---PB12
G1---PA15
G2---PC7
B1---PB3
B2---PG10

4.jpg
图4 所用引脚

点阵屏所用引脚的配置函数为:
  1. void DZP_gpio(void)
  2. {
  3.   __HAL_RCC_GPIOA_CLK_ENABLE();
  4.   __HAL_RCC_GPIOB_CLK_ENABLE();
  5.   __HAL_RCC_GPIOC_CLK_ENABLE();
  6.   __HAL_RCC_GPIOD_CLK_ENABLE();
  7.   __HAL_RCC_GPIOF_CLK_ENABLE();
  8.   __HAL_RCC_GPIOG_CLK_ENABLE();
  9.   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  10.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  11.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  12.   GPIO_InitStruct.Pin = GPIO_PIN_5| GPIO_PIN_15;
  13.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  14.   GPIO_InitStruct.Pin = GPIO_PIN_3 | GPIO_PIN_5 |GPIO_PIN_12| GPIO_PIN_13;
  15.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  16.   GPIO_InitStruct.Pin = GPIO_PIN_7;
  17.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  18.   GPIO_InitStruct.Pin = GPIO_PIN_14| GPIO_PIN_15;
  19.   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  20.   GPIO_InitStruct.Pin = GPIO_PIN_3;
  21.   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
  22.   GPIO_InitStruct.Pin = GPIO_PIN_9| GPIO_PIN_10;
  23.   HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
  24. }

串行输出字节数据的函数为:
  1. void OutByte(u8 dat, u8 datp)
  2. {
  3.     u8 i=0 ;
  4.     for(i=0;i<8;i++)
  5.     {
  6.         LSCL_Low();
  7.         if(dat&0x80)
  8.         {
  9.                          LR1_High();
  10.              LB1_High();
  11.                          LG1_High();
  12.         }
  13.         else
  14.         {
  15.                      LR1_Low();
  16.              LB1_Low();
  17.                      LG1_Low();
  18.         }
  19.         if(datp&0x80)
  20.         {
  21.                          LR2_High();
  22.              LB2_High();
  23.                          LG2_High();
  24.         }
  25.         else
  26.         {
  27.                           LR2_Low();
  28.               LB2_Low();
  29.               LG2_Low();
  30.         }
  31.         dat=dat<<1;
  32.                 datp=datp<<1;
  33.         LSCL_High();
  34.     }
  35. }

实现地址输出的函数为:
  1. void SeleRow(u8 Nd)
  2. {
  3.       u8 N=Nd;
  4.           if(Nd==0)  N=7;
  5.           if(Nd==1)  N=0;
  6.           if(Nd==2)  N=1;
  7.           if(Nd==3)  N=2;
  8.           if(Nd==4)  N=3;
  9.           if(Nd==5)  N=4;
  10.           if(Nd==6)  N=5;
  11.           if(Nd==7)  N=6;
  12.       N=N%8;
  13.       if((N&0x01)>0)
  14.           {
  15.                     LA_High();
  16.           }
  17.           else
  18.           {
  19.                     LA_Low();
  20.           }
  21.           if((N&0x02)>0)
  22.           {
  23.                     LB_High();
  24.           }
  25.           else
  26.           {
  27.                     LB_Low();
  28.           }
  29.       if((N&0x04)>0)
  30.           {
  31.                     LC_High();
  32.           }
  33.           else
  34.           {
  35.                     LC_Low();
  36.           }
  37. }

用于显示的字模被放置在数组中,其结构如下:
  1. u8 t[]={
  2. 0x20,0x00,0x23,0xF8,0x22,0x08,0x22,0x08,0xFB,0x28,0x22,0xA8,0x22,0xA8,0x72,0x48,
  3. 0x6A,0x48,0xA2,0xA8,0xA2,0xA8,0x23,0x2A,0x24,0x0A,0x24,0x0A,0x28,0x06,0x30,0x02,
  4. 0x00,0x20,0x00,0x20,0x78,0x20,0x48,0x20,0x48,0x20,0x48,0x20,0x4B,0xFE,0x48,0x20,
  5. 0x48,0x20,0x48,0x20,0x78,0x20,0x48,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,
  6. ...   
  7. };

读取字模实现显示的函数为:
  1. void Display(void)
  2. {
  3.           u16  d;
  4.           LEN_High();
  5.           LSTB_High();
  6.           LSTB_Low();
  7.       d=ScanRow*2;
  8.           OutByte(t[d],t[d+16]);
  9.           OutByte(t[d+1],t[d+17]);
  10.           OutByte(t[32+d],t[d+48]);
  11.           OutByte(t[32+d+1],t[d+49]);
  12.       SeleRow(ScanRow);
  13.       LEN_Low();
  14.       ScanRow++;
  15.           if(ScanRow>7)  ScanRow=0;
  16. }

实现显示效果的主程序为:
  1. int main(void)
  2. {
  3.   HAL_Init();
  4.   SystemClock_Config();
  5.   MX_GPIO_Init();
  6.   MX_ICACHE_Init();
  7.   LED1_GPIO_CLK_ENABLE();
  8.   LED2_GPIO_CLK_ENABLE();
  9.   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  10.   GPIO_InitStruct.Pull  = GPIO_NOPULL;
  11.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  12.   GPIO_InitStruct.Pin = LED1_PIN;
  13.   HAL_GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStruct);
  14.   GPIO_InitStruct.Pin = LED2_PIN;
  15.   HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);
  16.   DZP_gpio();
  17.   DZP_gpio();
  18.   ScanRow=0;
  19.   while (1)
  20.   {
  21.            Display();
  22.   }
  23. }

稍感不足的是,使用NUCLEO- H563ZI开发板的驱动效果似乎不如其它开发板的效果好,亮度偏弱,且有一些杂点的出现,见图5和图6所示。
5.jpg
图5 显示效果

6.jpg
图6 对比效果



数据采集存储 发表于 2023-8-17 17:04 | 显示全部楼层
彩色点阵屏幕,还是很漂亮的,不错,期待楼主有更精彩的作品。
 楼主| jinglixixi 发表于 2023-8-18 08:25 | 显示全部楼层
数据采集存储 发表于 2023-8-17 17:04
彩色点阵屏幕,还是很漂亮的,不错,期待楼主有更精彩的作品。

感谢支持!!!
明天真的好 发表于 2023-8-18 17:00 | 显示全部楼层
没想到点阵屏幕,也能够显示的这样漂亮。楼主可以分享一下工程文件吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

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