【Keil5 C51】AT89C52 数码管的动态显示

数码管的动态显示原理

第一个数码管显示0,1s后第二个数码管显示1,直到第六个数码管显示5后又重新开始
#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char
	
sbit LE_D = P2^6;
sbit LE_W = P2^7;

uchar code table_D[] = {0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x98};
uchar code table_W[] = {0x01,0x02,0x04,0x08,0x10,0x20};		

uint time = 0;
uint Num_D = 0;
uint Num_W = 0;

void main(){
	//中断初始化
	TMOD = 0x01;			//0000 0001
	TH0 = 0xFC;				//1ms
	TL0 = 0x17;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
		
	//第一个数码管显示0,1mS后第二个数码管显示1...
	while(1){

		if(time == 1000){ 	
			time = 0;
									
			if(Num_D == 6) Num_D = 0;	
			if(Num_W == 6) Num_W = 0;
			
			//消隐(当你更新显示的“段”的时候,显示的位置,还是在前一时间的“位”上;
			//然后你再更新“位”,这就出现移动的效果了。)
			LE_W = 1;
			P0 = 0x00;
			LE_W = 0;

			LE_D = 1;
			P0 = table_D[Num_D];
			LE_D = 0;
			
			LE_W = 1;
			P0 = table_W[Num_W];
			LE_W = 0;
					
			Num_D++;
			Num_W++;		
		}		
	}	
}

void exter1() interrupt 1{
	TH0 = 0xFC;		//1ms
	TL0 = 0x17;
	time++;
}
如果我们把数字依次显示的间隔时间换为5mS,那么数码管就能动态显示出012345

在这里插入图片描述

用数码管动态显示1-300

#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char
	
sbit LE_D = P2^6;
sbit LE_W = P2^7;

uchar code table_D[] = {0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x98};
uchar code table_W[] = {0x01,0x02,0x04,0x08,0x10,0x20};		

uint time = 0;
uint Num_D = 0;
uint Num_W = 0;
uchar ge,shi,bai;
uint num = 0;

void init();
void delay(uint dtime);
void display(uint num);

void main(){
	init();
	num = 0;
	while(1){
		if (time >= 1000){
			time = 0;
			num++;	
			if(num == 301){
				num = 0;
			}					
		}
		
		display(num);
	}
}

//计时器中断函数
void exter1() interrupt 1{
	TH0 = 0xFC;		//1ms
	TL0 = 0x17;
	time++;
}

//数码管显示数字的函数
void display(uint num){		
	bai = num / 100;				//百位应显示的数字
	shi = num % 100 /10;		//十位应显示的数字
	ge = num % 10;					//个位应显示的数字

		//数码管显示个位数字
		LE_D = 1;
		P0 = table_D[ge];			//段——>位 会在段所指的位置上显示段
		LE_D = 0;							//位——>段 新的数字会显示到之前的位置上
		LE_W = 1;
		P0 = 	0x20;					//0010 0000
		LE_W = 0;
		delay(1);
		LE_W = 1;						//消隐
		P0 = 0;
		LE_W = 0;
		
		//数码管显示十位数字
		LE_D = 1;
		P0 = table_D[shi];	
		LE_D = 0;	
		LE_W = 1;
		P0 = 0x10;					//0001 0000
		LE_W = 0;
		delay(1);
		LE_W = 1;						//消隐
	  P0 = 0;
		LE_W = 0;
		
		//数码管显示百位数字
		LE_D = 1;
		P0 = table_D[bai];
		LE_D = 0;
		LE_W = 1;
		P0 = 0x08;					//0000 1000
		LE_W = 0;
		delay(1);
		LE_W = 1;						//消隐
		P0 = 0;
		LE_W = 0;
}
//延时
void delay(uint dtime)  //delay = 1 ms 0.001s
{
	uint y;
	uint z;
	for(z = dtime; z > 0; z--){
			for(y = 115; y > 0; y--){}
	}
}

//初始化
void init(){				
	LE_D = 0;
	LE_W = 0;
	TMOD = 0x01;			//0000 0001
	TH0 = 0xFC;				//1ms
	TL0 = 0x17;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
}


Proteus仿真

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值