四位数码管流动显示10位数

一.图

在这里插入图片描述

二.代码

#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();
	}
}

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值