关于16*64点阵滚动显示的问题

yinvictor 2011-07-14 04:49:46
我最近做了一个16*64点阵的小东西,要求逐行滚动显示出“长江大学欢迎你”七个字,显示没问题,但滚动实在没想到好的方法,求各位大侠赐教。电路中使用8个74HC595串联起来做列驱动,用两个74HC573做行驱动,具体的连接方法在程序中都体现出来了。
#include <reg52.h>
sbit SHCP=P1^0;
sbit DS=P1^1;
sbit STCP=P1^2;
sbit OE=P1^3;
sbit LE=P1^4;
unsigned char i,j,k;
unsigned char temp;
unsigned char code X_table[16][14]={0x08,0x00,0x40,0x00,0x01,0x00,0x22,0x08,0x00,0x40,0x00,0x00,0x08,0x80,
0x08,0x10,0x30,0x04,0x01,0x00,0x11,0x08,0x00,0x40,0x20,0xc2,0x08,0x80,
0x08,0x30,0x17,0xfc,0x01,0x00,0x11,0x10,0xfe,0x40,0x13,0x3f,0x08,0x80,
0x08,0x40,0x00,0x40,0x01,0x00,0x00,0x20,0x02,0x7e,0x0a,0x22,0x11,0xfe,
0x08,0x80,0x80,0x40,0x01,0x04,0x7f,0xfe,0x22,0x82,0x02,0x22,0x11,0x02,
0x09,0x00,0x60,0x40,0xff,0xfe,0x40,0x02,0x23,0x24,0x02,0x22,0x32,0x04,
0x80,0x40,0x20,0x40,0x01,0x00,0x80,0x04,0x14,0x20,0xfa,0x22,0xd4,0x20,
0xff,0xfe,0x08,0x40,0x02,0x80,0x1f,0xe0,0x14,0x20,0x0a,0x62,0x10,0x20,
0x09,0x00,0x10,0x40,0x02,0x80,0x00,0x40,0x04,0x20,0x0a,0xa2,0x10,0xa8,
0x09,0x00,0x20,0x40,0x02,0x40,0x01,0x84,0x14,0x20,0x0b,0x2a,0x10,0xa4,
0x08,0x80,0xe0,0x40,0x04,0x40,0xff,0xfe,0x12,0x50,0x0a,0x24,0x11,0x26,
0x08,0x40,0x20,0x40,0x04,0x20,0x01,0x00,0x22,0x50,0x08,0x20,0x12,0x22,
0x08,0x20,0x20,0x44,0x08,0x10,0x01,0x00,0xc0,0x88,0x08,0x20,0x10,0x20,
0x09,0x1c,0x2f,0xfe,0x10,0x0e,0x01,0x00,0x00,0x84,0x14,0x23,0x10,0x20,
0x0e,0x08,0x20,0x00,0x60,0x04,0x05,0x00,0x00,0x17,0x23,0xfe,0x10,0xa0,
0x08,0x00,0x20,0x00,0x00,0x00,0x02,0x00,0x06,0x02,0x00,0x00,0x10,0x40
}; //长江大学欢迎你
unsigned int code Y_table[]={0xfffe,0xfffd,0xfffb,0xfff7,0xffef,0xffdf,0xffbf,0xff7f,0xfeff,0xfdff,0xfbff,0xf7ff,0xefff,0xdfff,0xbfff,0x7fff};
void select(unsigned char a[14])
{
int i,j;
//unsigned char temp;
for(j=0;j<14;j++)
{

temp=a[13-j];
for(i=0;i<8;i++)
{

SHCP=0;
DS=temp&1;
temp=temp>>1;
SHCP=1;
}
}

}
void operate(unsigned int a)
{
P2=a%256;
P3=a/256;
}
void main()
{
i=0;
j=0;
k=0;
TMOD=0x01;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
EA=1;
ET0=1;
TR0=1;
LE=1;
select(X_table[0]);

while(1)
{

}
}
void timer0() interrupt 1
{
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
OE=1;//消隐
STCP=0;
STCP=1;
//select(X_table[i]);
operate(Y_table[i]);
OE=0;

i++;
if(i==16)
i=0;
select(X_table[i]);

}
关键是如何才能逐行滚动显示,不要那种一下跳出一个字的。
...全文
415 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinvictor 2011-07-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 alex_rcpilot 的回复:]
不要吝惜内存,成品LED点阵屏都是有专门的内存空间用来做特效的。那些做旋转缩放特效的都没少用内存。

你这只是滚动而已,应该只是多定义几个变量的事。垂直卷动比水平卷动好做一些,595的移位都不用大改,只改573的线选时序就行了。你这个程序里从Y_table[i]里取行选择字的时候,在下标i上加一个偏移量,比如[i+shift],动画的每帧对shift进行增减即可。

渐入或者渐出的时候,空……
[/Quote]
我要做的就是水平卷动,我再试试吧,谢谢了。
Simality 2011-07-14
  • 打赏
  • 举报
回复
不要吝惜内存,成品LED点阵屏都是有专门的内存空间用来做特效的。那些做旋转缩放特效的都没少用内存。

你这只是滚动而已,应该只是多定义几个变量的事。垂直卷动比水平卷动好做一些,595的移位都不用大改,只改573的线选时序就行了。你这个程序里从Y_table[i]里取行选择字的时候,在下标i上加一个偏移量,比如[i+shift],动画的每帧对shift进行增减即可。

渐入或者渐出的时候,空白区域(水平的行)直接用for结构对595填充背景色即可。如果要做单行文字的水平渐入渐出,可以先做出以一个字为单位的渐入渐出,然后你的显存不要刚好够64*16点阵,而是(64+16)*16点阵的空间。一次从字库里读入5个字顺序排列在显存中。显示的时候如果窗口刚好显示完整的汉字则直接送字节,如果汉字左移或右移了n个像素,n<16,则在你的代码中把对应位置的字节从字库中取出来,简单地<<或>>相应的位数,然后再送到595的串行总线上即可。

旋转之类的更复杂,用更大的内存 + 足够快的U + 矩阵运算可以统一解决所有二维变换。
yinvictor 2011-07-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 congyue123 的回复:]
哈哈,看在你和我做的第一个东西一样的份上,我说说。

就是不停的移动嘛,按列移动,间隔时间控制一下,就行了。
[/Quote]
能说具体点吗,我试了几个方案,效果都很不好,需要再定义一个缓存数组吗?
congyue123 2011-07-14
  • 打赏
  • 举报
回复
哈哈,看在你和我做的第一个东西一样的份上,我说说。

就是不停的移动嘛,按列移动,间隔时间控制一下,就行了。

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧