RISC-V技术论坛
直播中

jinglixixi

9年用户 1739经验值
擅长:嵌入式技术 光电显示 接口/总线/驱动 控制/MCU
私信 关注
[经验]

【沁恒CH585开发板免费试用体验】+点阵板的显示驱动

在开发板的LED例程中介绍说是一个LED屏的控制卡示例,由于缺少详细的使用,故而无法弄清其具体的用法。

为此,自己动手制作了一个16*64点阵板的驱动程序,并以此来实现滚动字幕的显示效果。

该点阵板是一款P3.75的红色点阵板,其外观如图1所示。

image.png

图1 点阵屏外观

该点阵板所采用的接口方式为HUB08,各引脚的排列如图2所示。

image.png

图2 HUB08接口

点阵板与开发板的引脚连接关系为:
A ---- PA0
B ---- PA1
C ---- PA2
D ----PA3
R1 ---- PA5
CLK----PA6
OE ---- PA7
LAT---- PA8

所用引脚的工作模式配置函数为:

void dzb_Init(void)
{
    GPIOA_ModeCfg( GPIO_Pin_4, GPIO_ModeOut_PP_5mA );
    GPIOA_ModeCfg( GPIO_Pin_0, GPIO_ModeOut_PP_5mA );
    GPIOA_ModeCfg( GPIO_Pin_1, GPIO_ModeOut_PP_5mA );
    GPIOA_ModeCfg( GPIO_Pin_2, GPIO_ModeOut_PP_5mA );
    GPIOA_ModeCfg( GPIO_Pin_3, GPIO_ModeOut_PP_5mA );
    GPIOA_ModeCfg( GPIO_Pin_5 , GPIO_ModeOut_PP_5mA );
    GPIOA_ModeCfg( GPIO_Pin_6 , GPIO_ModeOut_PP_5mA );
    GPIOA_ModeCfg( GPIO_Pin_7 , GPIO_ModeOut_PP_5mA );
    GPIOA_ModeCfg( GPIO_Pin_8 , GPIO_ModeOut_PP_5mA );
}

所用引脚输出高低电平的语句定义为:
#define LR1_high GPIOA_SetBits(GPIO_Pin_5) // R1
#define LR1_low GPIOA_ResetBits(GPIO_Pin_5)

#define CLK_high GPIOA_SetBits(GPIO_Pin_6) // CLK
#define CLK_low GPIOA_ResetBits(GPIO_Pin_6)

#define LSTB_high GPIOA_SetBits(GPIO_Pin_7) // OE
#define LSTB_low GPIOA_ResetBits(GPIO_Pin_7)

#define LEN_high GPIOA_SetBits(GPIO_Pin_8) // LAT
#define LEN_low GPIOA_ResetBits(GPIO_Pin_8)

#define LA_high GPIOA_SetBits(GPIO_Pin_0) // LA
#define LA_low GPIOA_ResetBits(GPIO_Pin_0)

#define LB_high GPIOA_SetBits(GPIO_Pin_1) // LB
#define LB_low GPIOA_ResetBits(GPIO_Pin_1)

#define LC_high GPIOA_SetBits(GPIO_Pin_2) // LC
#define LC_low GPIOA_ResetBits(GPIO_Pin_2)

#define LD_high GPIOA_SetBits(GPIO_Pin_3) // LD
#define LD_low GPIOA_ResetBits(GPIO_Pin_3)

点阵板发送数据的函数为:

void OutByte(uint16_t dat)
{
    uint8_t i=0 ;
    for(i=0;i<16;i++)
    {
        CLK_low;
        if(dat&0x8000) 
        {
            LR1_high;
        }
        else
        {
            LR1_low;
        }
        dat=dat<<1; 
        CLK_high;
    }
}

发送多列数据的函数为:

void DisCol(int16_t lengh)
{     
      // 动态显示
      int16_t dat;
      int8_t m=0,s;
      int32_t v=0;
      m=cl;
      while(lengh--)
      {
           v=(tab[m*32+ScanRow*2+1]<<8)+tab[m*32+ScanRow*2];
           v=v<<16;
           v=(v+(tab[(m+1)*32+ScanRow*2+1]<<8)+tab[(m+1)*32+ScanRow*2])<< w;
           m=m+1;
           dat=v>>16;
           OutByte(dat);
      }
}

输出行地址的函数为:

void SeleRow(uint8_t Nd)
{
    uint8_t N;
    N=Nd;
    N=N%16;
    if(N&0x01) LA_high;
    else LA_low;
    if (N&0x02) LB_high;
    else LB_low;
    if (N&0x04) LC_high;
    else LC_low;
    if (N&0x08) LD_high;
    else LD_low;
}

实现显示输出的函数为:

void Display(void)
{
     DisCol(4);
     LEN_high;
     LSTB_high;
     LSTB_low;
     SeleRow(ScanRow);
     LEN_low;
     ScanRow++;
     if(ScanRow>15)  ScanRow=0;
}

为进行显示,所配置的字模由数组来存储,其内容为:

uint8_t tab[]={

// 金(0) 蛇(1) 迎(2) 春(3) 蛇(4) 年(5) 大(6) 吉(7) 灵(4) 蛇(5) 献(6) 瑞(7)

0x00,0x01,0x00,0x01,0x80,0x02,0x40,0x04,0x20,0x08,0x10,0x10,0xE8,0x2F,0x06,0xC1,

0x00,0x01,0xF8,0x3F,0x00,0x01,0x10,0x11,0x10,0x09,0x20,0x09,0xFE,0xFF,0x00,0x00,/"金",0/

0x20,0x10,0x10,0x10,0x10,0x10,0xFE,0x7D,0x02,0x55,0x04,0x56,0x80,0x54,0x88,0x54,

0x90,0x7C,0xA0,0x50,0xC0,0x10,0x82,0x14,0x82,0x1E,0x82,0xE2,0x7E,0x40,0x00,0x00,/"蛇",1/

... ...

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

实现显示输出的主程序为:

int main()
{
    int k=0,y=0;
    HSECFG_Capacitance(HSECap_18p);
    SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);
    dzb_Init();
    ScanRow=0;
    while(1)
    {
        for(k=0;k<40;k++)
        {
            Display();
            DelayMs(1);
        } 
        if(y>15)
        {
            y=0;
            cl=(cl+1)%8;
        }
        else
        {
            y=y+1;
        }
        w=y;
    }
}

经程序的编译与运行,其执行效果如图3和图4所示。
image.png

图3 显示效果1

image.png

图4 显示效果2

演示视频:

滚动字幕

更多回帖

发帖
×
20
完善资料,
赚取积分