#include"at89x51.h"
unsigned char code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x7c};
unsigned char b[]={0,0,0,0};
unsigned char c[]={2,0,1,7,1,2,4,0,5,6};//把c的值轮流赋给b
unsigned char i,j,k,m,n,cz;
unsigned int q;
tv()
{
for(i=0;i<7;i++)//把c的值轮流赋给b,组一个四个数的窗口,从b[0]-b[3]开始,每循环一次,窗口向前移动一位数
{
q=0;//延时用的,与下方的while循环配合,这句是q的初始化
b[0]=c[0+i];
b[1]=c[1+i];//第一个循环为c[0]-c[3]即2017,第二个循环后i由0变为1,窗口向前移一位b数组变为0171.。。。
b[2]=c[2+i];
b[3]=c[3+i];
while(q<1000)//这个循环在for循环内,每一个for循环它都要执行1000次,
//这个循环里语句的功能是把b数组的四个数展示在数码管上
{
cz=0xfe;
for(n=0;n<4;n++)
{
P2=0xff; //消隐,proteus7一定要加,不然仿真看不出效果
k=b[n];
P0=a[k];
P2=cz;
for(j=0;j<20;j++);
cz=(cz<<1)+1;
}
q=q+1;
}
}
}
void main(void)
{
while(1)
{
tv();
}
}
思考:这个滚动显示一开始就是4位全部显示出来,滚动的效果不明显,别人家的LED显示屏的内容都是从屏幕右侧从无到有显示出来的,能不能对代码改进一下让它实现从右侧从无到有滚动显示出来呢?
我还是太菜了,费了老久才想出来
#include"at89x51.h"
unsigned char code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x7c};
unsigned char b[]={0,0,0,0};
unsigned char c[]={2,0,1,7,1,2,4,0,5,6};//把c的值轮流赋给b
unsigned char i,j,k,m,n,cz;
unsigned int q;
tv()
{
for(i=0;i<4;i++)
{
q=0;
b[3]=c[i-4];//这里我本来是写的b[2]=c[i-2],其他的b数组相应减一
b[2]=c[i-3];//可是仿真结果出来是0开头,0,01,017,2017....
b[1]=c[i-2];//所以我试着把i-x都减小了一位,仿真结果达到了我想要的结果,
b[0]=c[i-1];//可是我有点想不通,为什么会这样子呢?
while(q<3000)
{
cz=0xf7;
for(n=0;n<i;n++)
{
P2=0xff;
k=b[n];
P0=a[k];
P2=cz;
for(j=0;j<20;j++);
cz=(cz>>1);
}
q=q+1;
}
}
for(i=0;i<7;i++)//把c的值轮流赋给b,组一个四个数的窗口,从b[0]-b[3]开始,每循环一次,窗口向前移动一位数
{
q=0;//延时用的,与下方的while循环配合,这句是q的初始化
b[0]=c[0+i];
b[1]=c[1+i];//第一个循环为c[0]-c[3]即2017,第二个循环后i由0变为1,窗口向前移一位b数组变为0171.。。。
b[2]=c[2+i];
b[3]=c[3+i];
while(q<2000)//这个循环在for循环内,每一个for循环它都要执行2000次,
//这个循环里语句的功能是把b数组的四个数展示在数码管上
{
cz=0xfe;
for(n=0;n<4;n++)
{
P2=0xff; //消隐,proteus7一定要加,不然仿真看不出效果
k=b[n];
P0=a[k];
P2=cz;
for(j=0;j<20;j++);
cz=(cz<<1)+1;
}
q=q+1;
}
}
}
void main(void)
{
while(1)
{
tv();
}
}