16*64点阵该如何实现左移,
两个138做的行选,595做的列线,现在我只能向上滚动,请问一下该如何实现左移,麻烦高手赐教一下思路或者程序,谢谢。 施加一个向左的力...~ 回复【1楼】Ian11122840 船儿-----------------------------------------------------------------------
麻烦你来帮我推一下哦~ 你向上怎么移的,向左移也是一个思想 你把整片板子左转90度,不久向左了么???
楼主!~~~
哈哈哈哈 如果138刷屏,595送数据,那就每次处理字节数据。
改成595刷列,138送数据的话,左移就很简单了 回复【5楼】elecfun 熊
---------------------------------------------------------------------
我也这样想过。那请教一下,2个138是组成的4-16姨妈器,那么显示的数据跟这个有什么关系可寻吗?假设我现在是第3行的灯亮,那么下一次第5行的灯亮,那么在138的输入端就应该是2个不同的状态,请问有规则吗? 1楼4楼人才 给你个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;
}
}
} 回复【8楼】xxqxiao
给你个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......
-----------------------------------------------------------------------
我看看,3Q,不能解决的问题还是不能解决,操之~ 我以前搞的
不知道能不能帮上忙
点击此处下载 ourdev_639793SBYWBZ.rar(文件大小:809K) (原文件名:16乘64点阵01.rar) 以前在网上找的左移还有上移的16_64程序,行用的154,列也是595
点击此处下载 ourdev_639839P48CH5.rar(文件大小:45K) (原文件名:16_64点阵程序.rar) 你想想,595送列数据,,列数据发送完毕,,这时候,我给595多移一位,再点亮会是什么结果?
多移俩位呢? 反之,给595少送一位或俩位,或三位数据,字会怎么显示? 回复【12楼】woshigeshuai 我要造飞机
你想想,595送列数据,,列数据发送完毕,,这时候,我给595多移一位,再点亮会是什么结果?
多移俩位呢? 反之,给595少送一位或俩位,或三位数据,字会怎么显示?
-----------------------------------------------------------------------
你说的我都明白,问题不会用程序来处理,那就没有意义的! 软件缓冲区。。。爱怎么移就怎么移。。。
移位不应该是硬件的任务。硬件只负责显示扫描。
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用硬件的移位也只能做简单的左右或者上下移动,建议还是在软件中计算。 仔细找找!我就在本论坛上见过程序! 回复【11楼】wg2700209
-----------------------------------------------------------------------
谢了正是我想要的 回复【楼主位】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;
} 这是16*32的左移,不知道能不能用上,
回复【楼主位】hepday
----------------------------------------------------------------------- 记号 旋转下屏幕就可以了,然后再做一个上移,就实现了左移,而且没改变原来的效果 我也正在玩这个点阵,不知道能不能帮到你,写得不好请见谅:
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; //上升沿将数据送到输出锁存器
}
} 正在找{:handshake:} 行扫按顺序扫描,595的串行输入的数据加1.例如,点阵的最后一列全亮(亮用1表示,灭用0表示),那595串行输入的第一次第一位输入1,第二位至最后一位输入0,第二次第一位输入0,第二位输入1,第三位至最后一位输入0,第三次第一位输入0,第二位也输入0,第三位输入1,第四位输入0........以此类推.这样就实现了左移.右移的话595的串行输入的数据就减1. 顶楼上,我的理解也是行线不动,列线控制数据依次左右移动就能实现点阵左右! 简单一句话,开缓冲区,随意指定从哪里开始。
开两个一样大的绶冲区,第一个安排要显示的内容,第二个放实际显示内容。将第一个的内容根据需要放入第二合适的位置。刷屏直接刷第二缓冲区即可。
开销又小,速度又快的话,可以算好位置直接读字库(图可做成字库)进屏显示。这个就看你的功力了。
某打印机就是这么做的,主频很低内存极小,速度真还不慢。
页:
[1]