【数码管/定时器/中断】一个定时器控制数码管显示

两种方式实现

/*用定时器以间隔500MS在6位数码管上

依次显示0、1、2、3….C、D、E、F,重复。*/

/*轮流在每一位数码管上显示*/

-----------------------------------------------------①--------------------------------------------------------------------- 


/*利用一个定时器实现数码管从左到右每位依次显示数字,且数字由0变到F再变到0,循环。*/
#include<reg52.h>
#define ui unsigned int
#define uc unsigned char
void init();
sbit we=P2^7;
sbit du=P2^6;
/*数码管段码表*/
uc code tabledu[]=		   //段码表
{
/*0   1    2    3*/
0x3f,0x06,0x5b,0x4f,
/*4   5    6    7*/
0x66,0x6d,0x7d,0x07,
/*8   9    A    B*/
0x7f,0x6f,0x77,0x7c,
/*C   D    E    F 不显示*/
0x39,0x5e,0x79,0x71,0
};
/*数码管位码表*/
uc code tablewe[]=		 //位码表(从高位到低位)
{
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f 
};
ui i;
uc numdu=0;
uc numwe=0;
uc flag=0;
void main()
{
	init();	 //初始化定时器0
	i=0;
	
	we=1;
	P0=tablewe[0]; //显示第一位数码管;
	we=0;
	du=1;
	P0=tabledu[0];
	du=0;
	while(1)
	{	
		if(i==20)
		{
			i=0;
			numdu++;
			numwe++;
			if(numdu==16)
				numdu=0;
			if(numwe==8)
				numwe=0;
		
			we=1;
			P0=tablewe[numwe];
			we=0;
			du=1;
			P0=tabledu[numdu];
			du=0;	
			TR0=1;
		}	
	
		 
	}			
}
void init()
{
	TMOD=0x01; 			//设置定时器0为工作方式1
	TH0=(65535-50000)/256;  //    "/"是求模运算 即能被几个整除
	TL0=(65535-50000)%256;	 //	 "%"是求余运算 即整除后剩余
	EA=1;               //开总中断
	ET0=1;              //开定时器0中断
	TR0=1;              //启动定时器0
}
void time0()interrupt 1
{
	TH0=(65535-50000)/256;  //   再赋初值
	TL0=(65535-50000)%256;	 //	 
	i++;
	if(i==20)
		TR0=0;
}
-----------------------------------------------------②--------------------------------------------------------------------- 

/*用定时器以间隔500MS在6位数码管上
依次显示0、1、2、3….C、D、E、F,重复。*/
/*轮流在每一位数码管上显示*/
#include<reg52.h>
#define ui unsigned int 
#define uc unsigned char
sbit du=P2^6;
sbit we=P2^7;

uc numwe,numdu;
uc flag=0;
ui tt;

uc code tabledu[]=		   //段码表
{
/*0   1    2    3*/
0x3f,0x06,0x5b,0x4f,
/*4   5    6    7*/
0x66,0x6d,0x7d,0x07,
/*8   9    A    B*/
0x7f,0x6f,0x77,0x7c,
/*C   D    E    F 不显示*/
0x39,0x5e,0x79,0x71,0
};

uc code tablewe[]=		   //位码表(从高位到低位)
{
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f 
};

void delay(ui z)
{
	ui x,y;
	for(x=z;x>0;x--)
		for(y=114;y>0;y--); 
}

void init_timer0()
{
	TMOD=0x01;
	TH0=(65536-46083)/256;  //50ms
	TL0=(65536-46083)%256; 
	EA=1;
	ET0=1;
	TR0=1;	
}

void display()
{
	du=1;
	P0=tabledu[0];		   
	du=0;	
	while(1)
	{
		we=1;
		if(numwe==8)
			numwe=0;
	 	P0=tablewe[numwe];
		we=0;
		if(flag)
		{
			du=1;
			if(numdu==16)
				numdu=0;
			P0=tabledu[numdu];		   
			du=0;
			flag=0;
		}
	}		
}

void main()
{	
	init_timer0();
	display();		 
}

void timer0() interrupt	1
{
	TH0=(65536-46083)/256;  //50ms
	TL0=(65536-46083)%256;
	tt++;
	if(tt==10)
	{
	numwe++;
	numdu++;
	flag=1;
	tt=0;
	}	
}



  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值