[应用方案]基于DP5020点阵屏的显示驱动

在以往的点阵屏中,多使用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所示,说明显示效果正确。

图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;

     }

}

 
其显示的效果如图12所示,当然通过修改变量n的表达式也能指定其它数量的显示字数。

图12  单字显示效果
 
这样就解决了基于DP5020点阵屏的显示驱动问题,并得到了良好的显示效果。感兴趣的话,还可参考前面介绍74HC595的驱动方法来实现数值的显示及电子时钟功能。
---------------------
作者:jinglixixi
链接:https://bbs.21ic.com/icview-3291270-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

 

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现点阵的滚动屏数字显示,可以采用以下步骤: 1. 定义一个变量来存储要显示的数字,将其初始化为一个较大的值,以保证点阵显示屏上的数字足够长。 2. 将点阵的各个LED灯与控制它们的GPIO口相连,将这些GPIO口设置为输出模式,并根据需要将它们的输出电平设置为高电平或低电平,从而控制点阵的显示效果。 3. 在程序中循环执行以下操作,以实现数字的滚动屏显示: a. 将要显示的数字通过一定的算法转换为对应的数码管亮灭状态。 b. 将转换后的数码管亮灭状态存储在一个数组中,数组的长度应该等于点阵显示屏的长度。 c. 将数组中的元素依次移位,并通过控制GPIO口的电平来实现数字的滚动屏显示。 d. 延时一段时间,用于控制滚动屏的速度。 下面是一个示例代码,用于实现一个滚动屏数字显示: ```c #include "stm32f4xx.h" // 数码管亮灭状态定义 #define NUM_0 0x3F #define NUM_1 0x06 #define NUM_2 0x5B #define NUM_3 0x4F #define NUM_4 0x66 #define NUM_5 0x6D #define NUM_6 0x7D #define NUM_7 0x07 #define NUM_8 0x7F #define NUM_9 0x6F // 数码管GPIO口定义 #define LED_A GPIO_Pin_0 #define LED_B GPIO_Pin_1 #define LED_C GPIO_Pin_2 #define LED_D GPIO_Pin_3 #define LED_E GPIO_Pin_4 #define LED_F GPIO_Pin_5 #define LED_G GPIO_Pin_6 #define LED_DP GPIO_Pin_7 #define LED_COM1 GPIO_Pin_8 #define LED_COM2 GPIO_Pin_9 // 数字定义 uint16_t num = 1234; // 数码管亮灭状态数组 uint8_t led[10] = {NUM_0, NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9}; // 数码管GPIO口数组 GPIO_TypeDef* LED_PORT[10] = { GPIOE, GPIOE, GPIOE, GPIOE, GPIOE, GPIOE, GPIOE, GPIOE, GPIOE, GPIOE }; uint16_t LED_PIN[10] = { LED_A, LED_B, LED_C, LED_D, LED_E, LED_F, LED_G, LED_DP, LED_COM1, LED_COM2 }; // 数码管亮灭状态数组 uint8_t led_num[4]; // 数码管显示函数 void LED_Display(uint8_t* led_num) { uint8_t i, j; for(i = 0; i < 4; i++) { uint8_t led_val = led[led_num[i]]; for(j = 0; j < 8; j++) { if(led_val & (0x01 << j)) GPIO_SetBits(LED_PORT[j], LED_PIN[i * 8 + j]); else GPIO_ResetBits(LED_PORT[j], LED_PIN[i * 8 + j]); } } } int main(void) { // 初始化GPIO口 GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); GPIO_InitStruct.GPIO_Pin = LED_A | LED_B | LED_C | LED_D | LED_E | LED_F | LED_G | LED_DP | LED_COM1 | LED_COM2; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOE, &GPIO_InitStruct); // 循环显示数字 while(1) { // 将数字转换为数码管亮灭状态 led_num[0] = num / 1000; led_num[1] = (num % 1000) / 100; led_num[2] = (num % 100) / 10; led_num[3] = num % 10; // 数码管滚动显示 uint8_t i, j; for(i = 0; i < 4 * 8; i++) { for(j = 0; j < 4; j++) { if(i >= j * 8 && i < (j + 1) * 8) continue; GPIO_ResetBits(GPIOE, LED_PIN[j * 8 + i % 8]); } LED_Display(&led_num[i / 8]); for(j = 0; j < 4; j++) { if(i >= j * 8 && i < (j + 1) * 8) continue; GPIO_SetBits(GPIOE, LED_PIN[j * 8 + i % 8]); } for(j = 0; j < 500; j++); } } } ``` 这个示例程序使用了共阴数码管,将数码管的各个LED灯分别与控制它们的GPIO口相连,并通过控制GPIO口的电平来实现数字的滚动屏显示。程序每次循环都会将数字转换为对应的数码管亮灭状态,并通过控制GPIO口的电平来实现数字的滚动屏显示。在滚动屏显示过程中,程序将数码管亮灭状态存储在一个数组中,并通过移位的方式实现滚动屏效果。为了控制滚动屏速度,程序在移位之后进行了一定的延时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值