打印

关于一个16*64LED滚动显示的问题

[复制链接]
2437|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yinvictor|  楼主 | 2011-7-16 15:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我最近做了一个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,flag;
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++)
{
  //if(j*8+i+k<112){
  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;
flag=0;
  
LE=1;
select(X_table[0]);
TMOD=0x01;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
   if(flag==1)
   {
   OE=1;//消隐
   STCP=0;
   STCP=1;
   //select(X_table);
   operate(Y_table);
   OE=0;
   
   i++;
   if(i==16)
   i=0;
   select(X_table);
   flag=0;
   }
}
}
void timer0() interrupt 1
{
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
flag=1;
   
}file:///C:/Documents

关键是如何才能逐行滚动显示,不要那种一下跳出一个字的。

相关帖子

沙发
xwj| | 2011-7-16 15:23 | 只看该作者
移位芯片做的大屏的话,滚动是相当容易的。

移位时都不用修改缓存数据,只要每行多设n字节缓存,然后设个变量shift,每行扫描时多发shift%8个脉冲即可,
shift/n做为行指针偏移。

然后每次移位只要shift加1即可。


LZ自己去想想吧

使用特权

评论回复
板凳
yinvictor|  楼主 | 2011-7-16 20:34 | 只看该作者
2# xwj
好的,多谢,我已经按照你的思想搞定了,多谢,叹为观止,结贴。

使用特权

评论回复
地板
xwj| | 2011-7-17 08:24 | 只看该作者
呵呵,搞定就好。

对LZ赞一个~
理解能力不错,解决问题还挺快的:)

像你这个小屏的话是否用“0缓存操作”影响不大,但是大屏影响就大了
没有(或想不出、没想到)老x这种思路的程序员,根本就算不到高手:P

使用特权

评论回复
5
mugenwon| | 2011-7-21 16:01 | 只看该作者
这招够狠!比当初我自己处理内存数据移位容易多了。不过如果显示内存不够你就不能用这招了!
不过我还做了个能任意平移显示坐标的功能,上下左右斜几多度都可以移动哈哈!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

15

帖子

0

粉丝