一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2780|回复: 6
收起左侧

显示内容移动的问题

[复制链接]
发表于 2010-4-15 20:26 | 显示全部楼层 |阅读模式
刚把固定显示的程序写好,也做了闪烁的。但是移动的原理,还没搞明白,希望大家帮我指点一二,谢谢!
 楼主| 发表于 2010-4-18 19:47 | 显示全部楼层
沈兄,给个提示呗!!!
发表于 2010-4-18 20:39 | 显示全部楼层
读取每行的数据后左移
 楼主| 发表于 2010-4-19 19:55 | 显示全部楼层
能否给个实例?
发表于 2010-5-5 22:57 | 显示全部楼层
我实现比较简单,搞一个大一点的buffer,就是数组,赋值以后循环就行了。
发表于 2010-5-7 01:26 | 显示全部楼层
本帖最后由 狗狗百里游 于 2010-5-7 01:27 编辑

有个巧妙的办法的,比如下面的函数是,发送一个汉字,其实就是移动一个16列的字符的笔画,到坐标X16这样
void hc595_send(char data1)   
{
.....
...
..


hc595_send_YD(char data1)   
}


然后你在做一个函数,继续运行
void hc595_send_YD(char data1)   
{

}

hc595_send_YD是把字符data1的笔画依顺序移动并显示出来一共15次,到X17,X18,X19......X32这样,很方便的

也就是运行一次,hc595_send,字符出现,再运行hc595_send_YD,原来的字符就以一定的速度前进了15格,再运行hc595_send(下一个字符),就是16格,以此类推,这样就不需要先生成大数组来缓存
发表于 2010-5-7 01:43 | 显示全部楼层
void sendbyte(unsigned char num) {
     unsigned char c;
     unsigned char f;
     for (c=8;c>0;c--) {
          LED_TPIC6B595_SRCK=0;
          f=num&0x80;
          LED_TPIC6B595_SER_IN_G0=(G0 && f);
          LED_TPIC6B595_SER_IN_R0=(R0 && f);
          LED_TPIC6B595_SER_IN_G1=(G1 && f);
          LED_TPIC6B595_SER_IN_R1=(R1 && f);
          LED_TPIC6B595_SRCK=1;
          num=num<<1;    //左移1位
     }
}

void sendbyte_3_yd(unsigned char num,unsigned char bit_num) {
     for (;bit_num>0;bit_num--) {   
        LED_nnn=(1 && (num&0x80));
          num=num<<1;
          LED_TPIC6B595_SRCK=0;
          LED_TPIC6B595_SRCK=1;
     }
}


//x轴向左移动内容[数组][开始位置][显示字符数][周期]
void str_x1(unsigned char *str, unsigned int s,unsigned int strlen,unsigned int f) {
     unsigned int x,j;
     unsigned int mm;
     unsigned int hz=strlen; // 屏幕字数
     unsigned int m=s;//m是从字模数组里向后取数据时的计数器,用以改变显示文字的内容,及滚动显示效果
     unsigned char y,n;
   
       for (x=0;x<16;x++)
          {
     LED_CS_00; //模拟74hc164,先关显示,以免164内数据移动过程中在屏上产生不良影响,
            
      for (j=0;j<f;j++) //显示内容的周期
               for (y=0;y<16;y++) {
         
          {   
       for (n=0;n<hz;n++) { //有hz个16*16点阵
                         mm=(m+n )*32 ;    //这个循环会大大拖慢显示速度,造成黑屏时间长,会闪烁。
                         //   sendbyte(hzdot[y+y+mm]);
                         //   sendbyte(hzdot[y+y+mm+1]);
                         //  sendbyte( *( str + y+y+mm ) );
                         //  sendbyte( *( str + y+y+mm+1 ) );
         spi_send( *( str + y+y+mm ) );
            spi_send( *( str + y+y+mm+1 ) );
                       //  sendbyte_2( *(  str + y+y+mm),8);   //  可以用sendbyte_2替换sendbyte
                    //     sendbyte_2( *(  str + y+y+mm+1),8);   //
                    }
                    /*x轴向左移动一步*/
                    mm+=32 ;
                    if (x<9)  sendbyte_3_yd( *(  str + y+y+mm),x);
                    if (x>=9) {
                        spi_send( *(  str + y+y+mm));
                         sendbyte_3_yd( *( str + y+y+mm+1),x-8);
                    }
                    /*x轴向左移动一步*/
                    set_74HC138(y);//关闭显示,并换行
               }
          }
     }
}

大概实现方法
sendbyte 跟sendbyte_3_yd有什么不同,自己参考

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-4-28 21:45 , Processed in 0.050117 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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