找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4796|回复: 1
收起左侧

stm32 驱动hub12接口16*64点阵屏

[复制链接]
ID:283304 发表于 2020-8-21 10:19 | 显示全部楼层 |阅读模式
利用stm32407单片机驱动两块16*32点阵屏,实现中英文显示及中心对齐、向左移动。led屏为4扫,亲测稳定可用。
void         hub12DataSerialInput(uint8_t        data){
                uint8_t         i;
                for( i = 0; i < 8; i++){
                                if(data & 0x80){
                                        HIGH_HUB12_DR;
                                        //HIGH_HUB12_DG;
                                       
                                }else{
                                        LOW_HUB12_DR;
                                        //LOW_HUB12_DG;
                                }
                                LOW_HUB12_CLK;
                                HIGH_HUB12_CLK;
                                data        = data << 1;
                }
}

void  hub12SelectRows(uint8_t rows){
                switch(rows){
                        case 0:
                                        LOW_HUB12_A;
                                        LOW_HUB12_B;
                                        break;
                        case 1:
                                        HIGH_HUB12_A;
                                        LOW_HUB12_B;
                                        break;                                               
                        case 2:
                                        LOW_HUB12_A;
                                        HIGH_HUB12_B;
                                        break;                                               
                        case 3:
                                        HIGH_HUB12_A;
                                        HIGH_HUB12_B;
                                        break;                       
                        default:
                                        break;
                }
}


//刷新点阵
uint8_t hub12Data[128] = {
                0x01,0x01,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,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,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,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
};


extern        uint8_t hub12TempData[512];
extern        uint8_t        hub12_dynamic_flag;

//led屏移位模块
void        hub12DataMove(void){
        uint16_t i,j;
        uint8_t flag_1,flag_2;       
        if(hub12_dynamic_flag == 1){
                        for(i = 0;i < 16; i++){
                                flag_1 = (hub12TempData[i*8] & 0x80);
                                hub12TempData[i*8 + 7 + 128] = (hub12TempData[i*8 + 7 + 128] << 1)|(flag_1 >>0x07);
                                for(j = 0; j < 8 - 1;j++){
                                        flag_2 = (hub12TempData[i*8+j + 1] & 0x80);
                                        hub12TempData[i*8+j]        = (hub12TempData[i*8+j] << 1) |(flag_2 >> 0x07);
                                }
                        }

                        for(i = 0;i < 16; i++){
                                flag_1 = (hub12TempData[i*8 + 128] & 0x80);
                                hub12TempData[i*8 + 7] = (hub12TempData[i*8 + 7] << 1)|(flag_1 >>0x07);
                                for(j = 0; j < 8 - 1;j++){
                                        flag_2 = (hub12TempData[i*8+j + 1 + 128] & 0x80);
                                        hub12TempData[i*8+j + 128]        = (hub12TempData[i*8+j + 128] << 1) |(flag_2 >> 0x07);
                                }
                        }       
        }
        else if(hub12_dynamic_flag == 2){
                for(i = 0;i < 16; i++){
                        flag_1 = (hub12TempData[i*8] & 0x80);
                        hub12TempData[i*8 + 7 + 256] = (hub12TempData[i*8 + 7 + 256] << 1)|(flag_1 >>0x07);
                        for(j = 0; j < 8 - 1;j++){
                                flag_2 = (hub12TempData[i*8+j + 1] & 0x80);
                                hub12TempData[i*8+j]        = (hub12TempData[i*8+j] << 1) |(flag_2 >> 0x07);
                        }
                }

                for(i = 0;i < 16; i++){
                        flag_1 = (hub12TempData[i*8 + 128] & 0x80);
                        hub12TempData[i*8 + 7] = (hub12TempData[i*8 + 7] << 1)|(flag_1 >>0x07);
                        for(j = 0; j < 8 - 1;j++){
                                flag_2 = (hub12TempData[i*8+j + 1 + 128] & 0x80);
                                hub12TempData[i*8+j + 128]        = (hub12TempData[i*8+j + 128] << 1) |(flag_2 >> 0x07);
                        }
                }       
               
                for(i = 0;i < 16; i++){
                        flag_1 = (hub12TempData[i*8 + 256] & 0x80);
                        hub12TempData[i*8 + 7 + 128] = (hub12TempData[i*8 + 7 + 128] << 1)|(flag_1 >>0x07);
                        for(j = 0; j < 8 - 1;j++){
                                flag_2 = (hub12TempData[i*8+j + 1 + 256] & 0x80);
                                hub12TempData[i*8+j + 256]        = (hub12TempData[i*8+j + 256] << 1) |(flag_2 >> 0x07);
                        }
                }               
        }
        else{
                for(i = 0;i < 16; i++){
                        flag_1 = (hub12TempData[i*8] & 0x80);
                        hub12TempData[i*8 + 7 + 384] = (hub12TempData[i*8 + 7 + 384] << 1)|(flag_1 >>0x07);
                        for(j = 0; j < 8 - 1;j++){
                                flag_2 = (hub12TempData[i*8+j + 1] & 0x80);
                                hub12TempData[i*8+j]        = (hub12TempData[i*8+j] << 1) |(flag_2 >> 0x07);
                        }
                }

                for(i = 0;i < 16; i++){
                        flag_1 = (hub12TempData[i*8 + 128] & 0x80);
                        hub12TempData[i*8 + 7] = (hub12TempData[i*8 + 7] << 1)|(flag_1 >>0x07);
                        for(j = 0; j < 8 - 1;j++){
                                flag_2 = (hub12TempData[i*8+j + 1 + 128] & 0x80);
                                hub12TempData[i*8+j + 128]        = (hub12TempData[i*8+j + 128] << 1) |(flag_2 >> 0x07);
                        }
                }       
               
                for(i = 0;i < 16; i++){
                        flag_1 = (hub12TempData[i*8 + 256] & 0x80);
                        hub12TempData[i*8 + 7 + 128] = (hub12TempData[i*8 + 7 + 128] << 1)|(flag_1 >>0x07);
                        for(j = 0; j < 8 - 1;j++){
                                flag_2 = (hub12TempData[i*8+j + 1 + 256] & 0x80);
                                hub12TempData[i*8+j + 256]        = (hub12TempData[i*8+j + 256] << 1) |(flag_2 >> 0x07);
                        }
                }       

                for(i = 0;i < 16; i++){
                        flag_1 = (hub12TempData[i*8 + 384] & 0x80);
                        hub12TempData[i*8 + 7 + 256] = (hub12TempData[i*8 + 7 + 256] << 1)|(flag_1 >>0x07);
                        for(j = 0; j < 8 - 1;j++){
                                flag_2 = (hub12TempData[i*8+j + 1 + 384] & 0x80);
                                hub12TempData[i*8+j + 384]        = (hub12TempData[i*8+j + 384] << 1) |(flag_2 >> 0x07);
                        }
                }       
        }       
        memcpy(hub12Data,hub12TempData,sizeof(hub12Data));
}

//led屏驱动显示模块
void hub12Display(uint16_t bright){
                uint8_t i,s;
                for( s = 0; s < 4; s++){        //显示4行
                                hub12SelectRows(s);
                                LOW_HUB12_LAT;
                                for( i = 0; i < 8; i++){
                                                hub12DataSerialInput(hub12Data[i +         32 * 3 + s * 8]);
                                                hub12DataSerialInput(hub12Data[i +         32 * 2 + s * 8]);
                                                hub12DataSerialInput(hub12Data[i +         32 * 1 + s * 8]);
                                                hub12DataSerialInput(hub12Data[i +         32 * 0 + s * 8]);
                                                if (ETH_CheckFrameReceived())
                                                {
                                                                LwIP_Pkt_Handle();
                                                }                                       
                                }       
                                HIGH_HUB12_LAT;
                                LOW_HUB12_OE;
                                Delay_nus(bright);
                                HIGH_HUB12_OE;                       
                }
}

//确定文字移动速度,防止cpu空转,采用滴答时钟延时判断


void hub12DataMovePrpcess(uint16_t running_period)
{
        static uint32_t runningLEDTick        = 0;
        if (timeout( runningLEDTick, running_period))
        {
                if(hub12_dynamic_flag != 0){
                        hub12DataMove();
                }
                runningLEDTick = local_ticktime();

        }
}


/***************主函数调用以下函数即可*****************/
        hub12Display(600);
        hub12DataMovePrpcess(65);



回复

使用道具 举报

ID:914689 发表于 2023-3-13 16:08 | 显示全部楼层
你好,12接口具体的使用不太懂,想要一份源码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表