[STM32WB] 【STM32WB09KE测评】+点阵屏显示驱动

[复制链接]
1469|2
 楼主| jinglixixi 发表于 2024-11-17 18:47 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2024-11-17 18:53 编辑

#申请原创#

在通常的情况下,我们所用的显示器件多是数码管、液晶屏等。但在公共场合则需要使用较大尺寸规格的显示器件。
常规的广告牌就是由一种称为半板的器件拼接而成,这里是选用一款P4.75的红色半板作为显示器件,其显示分辨率为16*64像素点,外观如图1所示。
661856739c7d0b80cd.png
1 外观

显示采用的接口方式为HUB08,各引脚的名称如图2所示。
781736739c8014b94d.png
图2  HUB08接口

显示板与开发板的引脚连接关系为:
A---- PB3
B---- PA9
C---- PB4
D---- PB1
R1 ---- PB7  
CLK---- PB6
EN ---- PA11
STB---- PA8

对所用引脚的工作模式配置函数为:
  1. void dzp_CONFIG(void)
  2. {
  3.     __HAL_RCC_GPIOB_CLK_ENABLE();
  4.     GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  5.     GPIO_InitStruct.Pull  = GPIO_NOPULL;
  6.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  7.     GPIO_InitStruct.Pin = GPIO_PIN_1;
  8.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  9.     GPIO_InitStruct.Pin = GPIO_PIN_3;
  10.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  11.     GPIO_InitStruct.Pin = GPIO_PIN_4;
  12.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  13.     GPIO_InitStruct.Pin = GPIO_PIN_6;
  14.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  15.     GPIO_InitStruct.Pin = GPIO_PIN_7;
  16.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  17.         
  18.     __HAL_RCC_GPIOA_CLK_ENABLE();
  19.     GPIO_InitStruct.Pin = GPIO_PIN_8;
  20.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        
  21.     GPIO_InitStruct.Pin = GPIO_PIN_9;
  22.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  23.     GPIO_InitStruct.Pin = GPIO_PIN_11;
  24.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  25. }

所用引脚输出高低电平的语句定义为:
#define LR1_high   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)   //DIN  GPIO29
#define LR1_low    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)

#define LSTB_high  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET)   //LAT/STB GPIO33
#define LSTB_low   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET)

#define LEN_high   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET)  //OE/EN  GPIO34
#define LEN_low    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET)

#define LA_high    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET)    //LA  GPIO31
#define LA_low     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET)

#define LB_high    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET)   //LB  GPIO37
#define LB_low     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET)

#define LC_high    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET)   //LC  GPIO14   CN3-23
#define LC_low     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET)

#define LD_high    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET)   //LD  GPIO30   CN4-6
#define LD_low     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET)

显示板发送数据的函数为:
  1. void OutByte(uint16_t dat)
  2. {
  3.     uint8_t i=0 ;
  4.     for(i=0;i<16;i++)
  5.     {
  6.         CLK_low;
  7.         if(dat&0x0001)
  8.         {
  9.             LR1_high;
  10.         }
  11.         else
  12.         {
  13.             LR1_low;
  14.         }
  15.         dat=dat>>1;
  16.         CLK_high;
  17.     }
  18. }

发送多列数据的函数为:
  1. void DisCol(uint16_t lenght)
  2. {
  3.     uint16_t dat;
  4.     uint8_t m=0;
  5.     while(lenght--)
  6.     {
  7.          dat=(S[sj[m+1]*16+ScanRow]<<8)+S[sj[m]*16+ScanRow];
  8.          OutByte(dat);
  9.          m=m+2;
  10.     }
  11. }

输出行地址的函数为:
  1. void  SeleRow(uint8_t Nd)
  2. {
  3.     uint8_t N;
  4.     N=Nd;
  5.     N=N%16;
  6.     if(N&0x01)   LA_high;
  7.     else  LA_low;
  8.     if (N&0x02)  LB_high;
  9.     else  LB_low;
  10.     if (N&0x04)  LC_high;
  11.     else  LC_low;
  12.     if (N&0x08)  LD_high;
  13.     else  LD_low;
  14. }

实现显示输出的函数为:
  1. void  Display(void)
  2. {
  3.       DisCol(4);
  4.       LEN_high;
  5.       LSTB_high;
  6.       LSTB_low;
  7.       SeleRow(ScanRow);
  8.       LEN_low;
  9.       ScanRow++;
  10.       if(ScanRow>15)  ScanRow=0;
  11. }

模拟计时显示效果的函数为:
  1. void ShowTime(void)
  2. {
  3.     sj[0]= 1;
  4.     sj[1]= 2;
  5.     sj[2]= 10;
  6.     sj[3]= 3;
  7.     sj[4]= 0;
  8.     sj[5]= 10;
  9.     sj[6]= 0;
  10.     sj[7]= 8;
  11.     Display();
  12. }

为进行显示,所配置的字模是由数组来存储,其格式和内容为:
  1. uint8_t S[]={
  2. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"0",0*/
  3. 0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"1",1*/
  4. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00,/*"2",2*/
  5. 0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1C,0x00,0x00,/*"3",3*/
  6. 0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,0x20,0x78,0x00,0x00,/*"4",4*/
  7. 0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,0x22,0x1C,0x00,0x00,/*"5",5*/
  8. 0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"6",6*/
  9. 0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,/*"7",7*/
  10. 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,/*"8",8*/
  11. 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1C,0x00,0x00,/*"9",9*/
  12. 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,/*":",10*/
  13. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"-",11*/
  14. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  15. };

实现显示测试的主程序为:
  1. int main(void)
  2. {
  3.    HAL_Init();
  4.    SystemClock_Config();
  5.    PeriphCommonClock_Config();
  6.    MX_GPIO_Init();
  7.    dzp_CONFIG();
  8.    ScanRow=0;
  9.    while(1)
  10.    {
  11.       ShowTime();
  12.    }
  13. }

经程序的编译与下载,其显示效果如图3所示,说明其符合预期的设计目标。
若将它与蓝牙通讯功能相配合,则可实时地控制显示内容的切换。
537716739c98d323ca.png
图3 连接关系与显示效果


yangjiaxu 发表于 2024-11-29 14:12 | 显示全部楼层
这种屏幕的接口是不是都一样的啊?不过感觉点这种屏幕好像不简单的样子
 楼主| jinglixixi 发表于 2024-11-29 16:46 | 显示全部楼层
yangjiaxu 发表于 2024-11-29 14:12
这种屏幕的接口是不是都一样的啊?不过感觉点这种屏幕好像不简单的样子

这种屏幕的接口会有几种类型,自行编程设计的人比较少而已,也不太难。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

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