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

文章介绍了使用GD32F427开发板通过74HC595芯片驱动16x24点阵屏的硬件连接和软件实现,包括点阵屏的硬件原理、开发板的引脚连接、595芯片的字节发送函数以及点阵屏的刷新和汉字滚动显示的代码详细步骤。
摘要由CSDN通过智能技术生成

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:卢阿涛

一、硬件介绍

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

硬件原理图:

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

引脚连接如下:

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

三、软件实现

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];
             }
          }
     }
                                                                                     
 }

四、效果

直接看视频

【GD32F427开发板试用】点阵屏滚动显示 - 极术社区 - 连接开发者与智能计算生态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值