/**************************头文件***********************/
#include"regx52.h"		   
#define uchar unsigned char
#define uint unsigned int

uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
						0x6d,0x7d,0x07,0x7f,0x6f};  //0~9共阴显示子码
uchar code dispbit[]={0xfd,0xfb,0xf7,0xef};			
								//数码管位选码，低电平为选通，分别是P11，P12，P13，P14
uchar dispbuf[]={"    "};
uint num=0;						//计数变量
uchar cont=0;					//显示偏移量
uchar i=0;						//计时变量
sbit LOCK=P1^0;					//定义锁存端

/************************毫秒级延时函数*****************/
void delayms(uint ms)
{
	uchar b;
	while(ms--)
	{
		for(b=0;b<125;b++);
	}
}

/**************************主函数*****************/
void main()
{
	LOCK=0;						//数码管直通
	IE=0X82;					//EA=1 ET0=1 打开总中断 打开定时器0中断
	TMOD=0X01;					//T0方式2 8位定时器自动重装
	TL0=(65536-5000)%256;		//定时5MS
	TH0=(65536-5000)/256;
	TR0=1;						//启动定时器T0
	while(1)					//大循环
	{
		num++;					//计数变量自增
		if(num==10000)			//满10000清0（数码管最大显示9999）
		{
			num=0;	  
		}
		dispbuf[3]=num/1000%10;	//分离千位，放缓冲区dispbuf[]
		dispbuf[2]=num/100%10;	//分离百位
		dispbuf[1]=num/10%10;	//分离十位
		dispbuf[0]=num/1%10;	//分离个位
		delayms(50);			//延时50MS（时间自定）
	}
}

/********************定时器0的中断服务程序*****************/
//利用中断服务函数，完成4位数码管的显示
void timetodisplay() interrupt 1//定时器T0
{
	 TL0=(65536-5000)%256;		//定时5MS
     TH0=(65536-5000)/256;
	 P0=dispcode[dispbuf[cont]];//根据显示偏移量cont,将数组dispbuf[]中的数取出来,
	 							//作为取数组dispcode[]的偏移量,再根据取出来的数,
								//将dispcode[]里面的段码取出来送给P0
	 P1=dispbit[cont]&0xff;		//根据偏移量
	 cont++;					//显示偏移量自增（显示下一位）
	 if(cont==4)				//满4清0（四位数码管）
     {
		cont=0;
	} 
}