卢阿涛 · 2022年12月01日 · 广东

【GD32F427开发板试用】点阵屏滚动显示

一、硬件介绍

如下图所示,此点阵屏为16x24分辨率,通过5个74HC595进行驱动,74HC595可以级联,控制引脚为3个,分别为SH、ST和DS,通过三个引脚即可驱动整个点阵屏。
 title=

 title=

硬件原理图:
 title=
 title=

二、开发板和点阵屏引脚连接

引脚连接如下:

ST----PD13
SH----PD14
DS----PD15

/* 锁存寄存器 */
#define _74HC595_SH_RCC     RCU_GPIOD
#define _74HC595_SH_PORT     GPIOD
#define _74HC595_SH_PIN     GPIO_PIN_14
/* 移位寄存器 */
#define _74HC595_ST_RCC     RCU_GPIOD
#define _74HC595_ST_PORT     GPIOD
#define _74HC595_ST_PIN     GPIO_PIN_13
/* 数据输入 */
#define _74HC595_DS_RCC     RCU_GPIOD
#define _74HC595_DS_PORT     GPIOD
#define _74HC595_DS_PIN     GPIO_PIN_15

 title=

三、软件实现

1. 595发送一个字节

通过这个函数可以给595发送一个字节的数据

/********************************************
@功能: 74HC595初始化
@日期:2022-11-25 20:51
@作者:lengyuefeng
@说明: 
@参数: byte:要发送的字节 
@返回值: 无
*********************************************/
static void _74HC595_sendByte(uint8_t mode,uint8_t byte)
{
    uint8_t  i;
    for(i = 0; i < 8; i++)
    {
        _74HC595_SH_WRITE(0); // 移位

        if(mode == 1)
        {
            /* 先发高位 */
            if(byte & 0x80)  
            _74HC595_DS_WRITE(1);
            else
                _74HC595_DS_WRITE(0);
            byte <<= 1;
        }else 
        {
            // 1111 1101 
        /* 先发高位 */
            if(byte & 0x01)  
            _74HC595_DS_WRITE(1);
            else
                _74HC595_DS_WRITE(0);
            byte >>= 1;
        }
    

        _74HC595_DELAY_US(2);
        _74HC595_SH_WRITE(1);   //移位  时钟上升沿拷贝
        _74HC595_DELAY_US(2);
    }
}

2. 刷新点阵

通过这个函数去刷新点阵,每当需要改变点阵屏内容时,需要调用一下。

/********************************************
@功能: 刷新点阵
@日期:2022-11-25 22:02
@作者:lengyuefeng
@说明: 
@参数: 无
@返回值: 无
*********************************************/
void _74HC595_refresh(void)
{
    static uint8_t step = 0;    
    
    _74HC595_sendByte(0,0xff);    // 第三列 
    _74HC595_sendByte(0,0xff);      
    
    /* 列 */
    _74HC595_sendByte(0,latticeBuf[step][2]);    // 第三列 
    _74HC595_sendByte(0,latticeBuf[step][1]);      
    _74HC595_sendByte(0,latticeBuf[step][0]);   
    // _74HC595_sendByte(0xff);    // 第三列 
    // _74HC595_sendByte(codebuf[0][step][1]);      
    // _74HC595_sendByte(codebuf[0][step][0]);   
    /* 行 */
    _74HC595_sendByte(1,rowSelectBuf[step] & 0xff);    // 第二行 
    _74HC595_sendByte(1,((rowSelectBuf[step]&0xff00) >> 8)); 

    _74HC595_ST_WRITE(1);  // 锁存数据
    _74HC595_DELAY_US(2);
    _74HC595_ST_WRITE(0);    
        
    step ++;
    if(step == 16)  // 边界 
    {
        step = 0;
//        delay_ms(5);
    }
}

3. 滚动显示汉字

通过这个函数可以实现滚动显示汉字,滚动显示字数可控制。

 void _74HC595_draw16X16Chinese(void)
 {
     /* 最左边是低位 
     向左移动就是把最低位移掉 
     */
     static uint8_t flag = 0;
     static uint8_t step = 0;
     static uint8_t aaa = 0;
     static uint8_t bbb  =0 ;
     static uint8_t temp[16][2] = {0};

     static uint8_t num = 1;
     if(flag == 0)
     {
         flag = 1;
         for(uint8_t i = 0; i < 16; i++)
         {

             latticeBuf[i][0] = 0xff;   // 初始化不显示 
             latticeBuf[i][1] = codebuf[0][i][0];    
             latticeBuf[i][2] = codebuf[0][i][1];    

            temp[i][0] = codebuf[1][i][0];
            temp[i][1] = codebuf[1][i][1];
         }  
     }else
     {
             if(bbb < 8)
             {
                  aaa = (temp[step][0] >> 7);     // 0x01          0x01    
                  temp[step][0]  <<= 1;           // 1111 1100    1111 1000 
             }
             else
             {
                 aaa = temp[step][1] >> 7;
                 temp[step][1]  <<= 1;
             }
                
             if(step >= 16)
             {

             }else
             {
                             /* 右移 左边补0 */
                 latticeBuf[step][0] = (latticeBuf[step][0] << 1) | ((latticeBuf[step][1] >> 7));        // 右边 
                 latticeBuf[step][1] = (latticeBuf[step][1] << 1) | ((latticeBuf[step][2] >> 7));  // 左边
                 latticeBuf[step][2] = (latticeBuf[step][2] << 1) | aaa;        // 右边 
                

             }
     } 

     if(++step >= 16)
     {
         delay_ms(1);
          step = 0;
          bbb++;   // 移动多少次 
          if(bbb >= 16)
          {
             bbb = 0;
             num ++;
             if(num == 9)
                num = 0;
             for(uint8_t i = 0; i < 16; i++)
             {
                 temp[i][0] = codebuf[num][i][0];
                 temp[i][1] = codebuf[num][i][1];
             }
          }
     }
                                                                                     
 }

四、效果

直接看视频

https://www.youku.com/video/XNTkyNDg2ODUwNA==

推荐阅读
关注数
10693
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息