hepday 发表于 2010-9-2 17:31:38

16*64点阵该如何实现左移,

两个138做的行选,595做的列线,现在我只能向上滚动,请问一下该如何实现左移,麻烦高手赐教一下思路或者程序,谢谢。

Ian11122840 发表于 2010-9-2 17:37:45

施加一个向左的力...~

hepday 发表于 2010-9-2 17:40:16

回复【1楼】Ian11122840 船儿
-----------------------------------------------------------------------

麻烦你来帮我推一下哦~

fzkqi 发表于 2010-9-2 19:41:47

你向上怎么移的,向左移也是一个思想

cxlspp 发表于 2010-9-3 12:53:34

你把整片板子左转90度,不久向左了么???


楼主!~~~

哈哈哈哈

elecfun 发表于 2010-9-3 12:57:43

如果138刷屏,595送数据,那就每次处理字节数据。

改成595刷列,138送数据的话,左移就很简单了

hepday 发表于 2010-9-3 14:18:17

回复【5楼】elecfun 熊
---------------------------------------------------------------------
我也这样想过。那请教一下,2个138是组成的4-16姨妈器,那么显示的数据跟这个有什么关系可寻吗?假设我现在是第3行的灯亮,那么下一次第5行的灯亮,那么在138的输入端就应该是2个不同的状态,请问有规则吗?

qilujie 发表于 2010-9-5 23:26:19

1楼4楼人才

xxqxiao 发表于 2011-4-16 20:11:47

给你个8*8的这是左移的思路!定义一个要显示的数组:例如a[]={};将a的元素赋值给a;a的赋值给a;a的赋值给a;a的赋值给a;一次类推!反过来右移动的是将a的赋值给a;a的赋值给a;a的赋值给a给你个程序看看!
#include <reg52.H>
unsigned char dis[]={                                //注:不同的硬件电路,字模也不一样                               
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//黑屏
{0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x3C},//0
{0x18,0x1C,0x18,0x18,0x18,0x18,0x18,0x3C},//1
{0x1C,0x3E,0x36,0x30,0x18,0x0C,0x3E,0x3E},//2
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//黑屏
};

unsigned char ROW[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};        //选通行

void delay(unsigned int time)
{
while(time>0)
        time--;
}

main()
{       
        unsigned char x=0,speed,j,k,n=0;
        speed=5;//修改这里可以改变移动速度;值越大越慢
        while(1){
                for(k=0;k<speed;k++){
                        for(j=0;j<8;j++){
                                P2=~((dis>>x)|(dis<<(8-x)));//实现移动主要是这句话
                                P0=ROW;
                                delay(300);
                        }
                }
                x++;
                if(x==8){
                        x=0;       
                        n++;
                        if(n>3)
                                n=0;
                }       
        }
}

hepday 发表于 2011-5-14 17:54:52

回复【8楼】xxqxiao
给你个8*8的这是左移的思路!定义一个要显示的数组:例如a[]={};将a的元素赋值给a;a的赋值给a;a的赋值给a;a的赋值给a;一次类推!反过来右移动的是将a的赋值给a;a的赋值给a;a的赋值给a给你个程序看看!
#include &lt;reg52.h&gt;
unsigned char dis[]={ //注:不同的硬件电路,字模也不一样
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//黑屏
{0x3c,0x66,0x66,0x66,0x66,0x66,0x66,0x3c},//0
{0x18,0x1c,0x18,0x18,0x18,0x18,0x18,0x3c},//1
{0x1c,0x3e,0x36,0x30,0x18,0x0c,0x3e......
-----------------------------------------------------------------------

我看看,3Q,不能解决的问题还是不能解决,操之~

format 发表于 2011-5-14 18:13:05

我以前搞的

不知道能不能帮上忙

点击此处下载 ourdev_639793SBYWBZ.rar(文件大小:809K) (原文件名:16乘64点阵01.rar)

wg2700209 发表于 2011-5-14 23:59:01

以前在网上找的左移还有上移的16_64程序,行用的154,列也是595
点击此处下载 ourdev_639839P48CH5.rar(文件大小:45K) (原文件名:16_64点阵程序.rar)

woshigeshuai 发表于 2011-5-15 00:16:19

你想想,595送列数据,,列数据发送完毕,,这时候,我给595多移一位,再点亮会是什么结果?

多移俩位呢? 反之,给595少送一位或俩位,或三位数据,字会怎么显示?

hepday 发表于 2011-5-15 13:54:24

回复【12楼】woshigeshuai 我要造飞机
你想想,595送列数据,,列数据发送完毕,,这时候,我给595多移一位,再点亮会是什么结果?
多移俩位呢? 反之,给595少送一位或俩位,或三位数据,字会怎么显示?
-----------------------------------------------------------------------

你说的我都明白,问题不会用程序来处理,那就没有意义的!

hzr0071 发表于 2011-5-15 14:08:10

软件缓冲区。。。爱怎么移就怎么移。。。
移位不应该是硬件的任务。硬件只负责显示扫描。
lz可以看看我以前发的那个帖子http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4731857&bbs_page_no=1&search_mode=3&search_text=hzr0071&bbs_id=9999
里面有关于硬件软件如何分离的内容。
具体的实例可以看我做的那个集成两个游戏的16*32彩色点阵。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4685757&bbs_page_no=1&search_mode=3&search_text=hzr0071&bbs_id=9999
里面的所有显示的计算全放在软件中,像游戏这样比较复杂的移位不可能用硬件模拟出来。
lz用硬件的移位也只能做简单的左右或者上下移动,建议还是在软件中计算。

zk16 发表于 2011-5-17 20:40:30

仔细找找!我就在本论坛上见过程序!

wgm8023ln 发表于 2011-10-12 14:21:19

回复【11楼】wg2700209
-----------------------------------------------------------------------

谢了正是我想要的

ywy969740175 发表于 2011-10-17 16:40:05

回复【楼主位】hepday
-----------------------------------------------------------------------

void shift_L()                  //左移函数
{
bit hbit;
uchar i;
hbit=dispram&0x80;
for(i=0;i<3;i++)
   {
      dispram=dispram<<1;
          dispram+=dispram>>7;
   }
dispram=dispram<<1;
if(hbit)dispram+=0x01;
}

ywy969740175 发表于 2011-10-17 16:41:36

这是16*32的左移,不知道能不能用上,
回复【楼主位】hepday
-----------------------------------------------------------------------

wghaovv 发表于 2011-11-2 15:14:34

记号

xiaoyigechaos 发表于 2011-11-2 17:38:15

旋转下屏幕就可以了,然后再做一个上移,就实现了左移,而且没改变原来的效果

c_anny 发表于 2011-11-4 08:13:54

我也正在玩这个点阵,不知道能不能帮到你,写得不好请见谅:
void display_yd()//左移动显示
{
    uchar i,j,temp01,temp02,ch;
    uint num1,num2;
    if(flag==1)//中断控制标志位
    {
      flag=0;
      j++;
      if(j==16)
      {
            j=0;
            count++;
            if(count>=20) //显示多少字
            {
                count=0;
            }
      }
    }
    for(i=0; i<16; i++)
    {
      //WR_595G1(0XFF);//关掉蓝色
      for(ch=0; ch<4; ch++)
      {
            num1=(display);
            num1<<=8;
            num1|=(display);
            num1>>=j;
            num2=(display);
            num2<<=8;
            num2|=(display);
            num2<<=16-j;
            num1|=num2;
            temp02=num1;
            temp01=num1>>8;
            WR_595G1(temp02);//取显示数据
            WR_595G1(temp01);//取显示数据
      }
      P0=0X0F;
                P0&=i;
      RCK_595=0;
      RCK_595=1; //上升沿将数据送到输出锁存器
    }
}

yaohengyong1314 发表于 2012-3-30 03:10:26

正在找{:handshake:}

zyyn123 发表于 2012-3-30 08:39:21

行扫按顺序扫描,595的串行输入的数据加1.例如,点阵的最后一列全亮(亮用1表示,灭用0表示),那595串行输入的第一次第一位输入1,第二位至最后一位输入0,第二次第一位输入0,第二位输入1,第三位至最后一位输入0,第三次第一位输入0,第二位也输入0,第三位输入1,第四位输入0........以此类推.这样就实现了左移.右移的话595的串行输入的数据就减1.

51yyaayya 发表于 2012-3-30 09:18:38

顶楼上,我的理解也是行线不动,列线控制数据依次左右移动就能实现点阵左右!

fwluck 发表于 2012-3-30 09:56:05

简单一句话,开缓冲区,随意指定从哪里开始。
开两个一样大的绶冲区,第一个安排要显示的内容,第二个放实际显示内容。将第一个的内容根据需要放入第二合适的位置。刷屏直接刷第二缓冲区即可。

开销又小,速度又快的话,可以算好位置直接读字库(图可做成字库)进屏显示。这个就看你的功力了。
某打印机就是这么做的,主频很低内存极小,速度真还不慢。
页: [1]
查看完整版本: 16*64点阵该如何实现左移,