找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1247|回复: 2
收起左侧

关于led点阵文字移动问题

[复制链接]
ID:837401 发表于 2022-12-17 19:09 | 显示全部楼层 |阅读模式
本人做了一款led点阵32x32的,扫描方式是逐行扫描,那么在代码实现静态文字或者文字上下移没什么难点,静态显示无非就是开一个显存把文字数据写进显存然后扫描就完了,上下移也就多了一步字节推挤写一个用定时器数据推挤,推挤显存中的数据一个字节一个字节跟可以完美实现上下移,到了左右移那么问题来了由于pcb设计扫描结构为逐行扫描,上下移可以推入整个字节达到目的,左右移总不能直接移一个字节吧8个点显然不行,所以怎么将字节左移到高位通过算法接入下一个字节的低位呢,办法我是有的但是有点太笨了所以来请教大神们,如下代码。typedef unsigned char u8;
typedef unsigned int u16;

sbit SDI =  P6^0;
sbit CLK =  P6^1;
sbit LE  =  P6^2;
u8 xdata Byte[4];
u8 xdata Byte_cache[4];

void Delay_ms(u16 l)                //@30.000MHz 1ms
{
        unsigned char i, j;
        u16 h;
        for(h=0;h<l;h++)
        {
                _nop_();
                i = 32;
                j = 40;
                do
                {
                        while (--j);
                } while (--i);
        }

}
void HC595_Init()
{
        SDI =  0;
        CLK =  0;
        LE  =  0;
}

void HC595_Write_Data(u16 op)
{
        u16 i,k;
        for(i=0;i<8;i++)
        {
                CLK=0;
                SDI=op&0x80;
                CLK=1;
                op<<=1;
        }
       
}
/*0000 0000 0001 */
void main()
{
        u8 ii;
       
        HC595_Init();

        while(1)
        {
               
                Byte[1]=0x00;Byte[2]=0x00;Byte[3]=0x00,Byte[4]=0x01;
                for(ii=0;ii<32;ii++)
                {       

                       
                        if((Byte[1]&0x80)==128){Byte_cache[1]=0x01;} else{Byte_cache[1]=0x00;} //如果字节高位等于1那么字节缓存等于1
                        Byte[1]=Byte[1]+Byte_cache[2];                                                                //下一个字节加上上一个字节的缓存
                       
                        if((Byte[2]&0x80)==128){Byte_cache[2]=0x01;} else{Byte_cache[2]=0x00;}
                        Byte[2]=Byte[2]+Byte_cache[3];
                       
                        if((Byte[3]&0x80)==128){Byte_cache[3]=0x01;} else{Byte_cache[3]=0x00;}
                        Byte[3]=Byte[3]+Byte_cache[4];
                       
                       
                       
                        HC595_Write_Data(Byte[1]);       
                        HC595_Write_Data(Byte[2]);
                        HC595_Write_Data(Byte[3]);
                        HC595_Write_Data(Byte[4]);

                        LE =1;
                        _nop_();
                        LE =0;

                        Delay_ms(100);

                        Byte[1]<<=1;
                        Byte[2]<<=1;
                        Byte[3]<<=1;
                        Byte[4]<<=1;
                }       
        }       
}

这组代码可以实现字节的按位推挤这是组测试代码跑的流水灯刚好达到了的目的左移,稍加修改放进点阵移屏代码也就实现了左移了,但是代码中可以看到我给了每一个字节都加了字节缓存位有没有什么办法去掉这些缓存位,毕竟32x32的点阵后续还要级联那么xdata属实有点太大了一块屏加上字节缓存就是256字节每加一块就会翻倍,虽然主控是stc8h8k容量完全够了,或者有大佬知道其他逐行扫描左移代码执行效率高的方法。谢谢各位了
回复

使用道具 举报

ID:161164 发表于 2022-12-18 13:41 | 显示全部楼层
不用缓存
Byte[1]=ZiMo[0+i*128+j*4]<<x | ZiMo[1+i*128+j*4]>>(7-x);
Byte[2]=ZiMo[1+i*128+j*4]<<x | ZiMo[2+i*128+j*4]>>(7-x);
Byte[3]=ZiMo[2+i*128+j*4]<<x | ZiMo[3+i*128+j*4]>>(7-x);
Byte[4]=ZiMo[3+i*128+j*4]<<x | ZiMo[4+i*128+j*4]>>(7-x);
ZiMo是字模数组
i是第几个字(一个字是4char x 32 =128)
j是第几行
x是位移
回复

使用道具 举报

ID:824490 发表于 2022-12-18 16:13 | 显示全部楼层
同样的道理,把你之前的“字节”顶改为“位”顶就可以了。
以下是6个点阵块(48*8)的移列操作,你参考 一下。
u8 i;
     for(i=0;i<8;i++) //8行,6个点阵块
     {
          dis_buf[i+40]<<=1; if(dis_buf[i+32]&0x80) dis_buf[i+40]|=0x01;//         第六个点阵块
          dis_buf[i+32]<<=1; if(dis_buf[i+24]&0x80) dis_buf[i+32]|=0x01;//         第五个点阵块
          dis_buf[i+24]<<=1; if(dis_buf[i+16]&0x80) dis_buf[i+24]|=0x01;//         第四个点阵块
          dis_buf[i+16]<<=1; if(dis_buf[i+8]&0x80) dis_buf[i+16]|=0x01;//         第三个点阵块
          dis_buf[i+8]<<=1;  if(dis_buf[i]&0x80) dis_buf[i+8]|=0x01;//         第二个点阵块
          dis_buf[i]<<=1; //         第一个点阵块
    }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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