/*-------------------------------------------------------------------------------------------------------------------------
程序功能：在上题的基础上，用另外三个独立键盘实现按下第一个时计时停止，按下第二个时计时开始，按下第三个是计数值清零从头开始。

		  设晶振频率为12MHz。
--------------------------------------------------------------------------------------------------------------------------*/

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit S2=P3^4;  //独立按键位定义
sbit S3=P3^5;
sbit S4=P3^6;
sbit S5=P3^7;
uint disnum;
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //数码管段选编码
display(uint);  //数码管显示函数声明
delay(uchar);  //延时函数声明
void main()
{
	EA=1;
	ET0=1;
	TMOD=0X01;
	TH0=(65536-10000)/256;  //给定时器0装初值，12M晶振定时时间为10ms
	TL0=(65536-10000)%256;
	TR0=1;
	while(1)
	{			
			display(disnum);   //数码管显示

			if(S2==0)         //S2按键按下
			{
				delay(50);  //延时
				if(S2==0)   //再次判断是否真的有按键按下(即消除前沿抖动)
				{
					TR0=0;  
					while(!S2)
					{
						display(disnum); 
					}
					TR0=1;
				}
				
			}
			
			if(S3==0) //S3按键按下
			{
				delay(50);
				if(S3==0)
				{	
					TR0=0;
					while(!S3)
					{
						display(disnum); 	
					}
				
				}
			}

			if(S4==0) //S4按键按下
			{
				delay(50);
				if(S4==0)
				{
					while(!S4)
					{
						display(disnum); 
					}
					TR0=1;
				}
			}
			
			if(S5==0)  //S5按键按下
			{
				delay(50);
				if(S5==0)
				{	
					TR0=0;
					disnum=0;
					while(!S5)
					{
						display(disnum); 
					}
					TR0=1;
			}
		}		
				
	}
}

void time0() interrupt 1     //定时器0中断服务程序
{
	TH0=(65536-10000)/256;   //重装初值，12M晶振隔间10ms重装一次
	TL0=(65536-10000)%256;
	disnum++;   
	if(disnum==1000)   //这个数用来送到数码管显示，到1000后归0
	disnum=0;
	
}

display(uint disnum)   //数码管显示函数
{
    P0=0xff;       //关闭所有数码管显示，防止有交替重影，专业名称叫（消隐）
	wela=1;
	wela=0;
	P0=table_du[disnum/100];    //百位上的数
	dula=1;
	dula=0;
	P0=0xfe;   //第1个数码管位选值
	wela=1;
	wela=0;
	delay(10);   //延时

    P0=0xff;       //关闭所有数码管显示，防止有交替重影，专业名称叫（消隐）
	wela=1;
	wela=0;
	P0=table_du[disnum%100/10];   //十位上的数
	dula=1;
	dula=0;
	P0=0xfd;    //第2个数码管位选值
	wela=1;
	wela=0;
	delay(10);

	P0=0xff;       //关闭所有数码管显示，防止有交替重影，专业名称叫（消隐）
	wela=1;
	wela=0;
	P0=table_du[disnum%100%10];    //个位上的数
	dula=1;
	dula=0;
	P0=0xfb;    //第3个数码管位选值
	wela=1;
	wela=0;
	delay(10);
}
delay(uchar x)   //延时函数
{
	uchar a,b;
	for(a=x;a>0;a--)
		for(b=200;b>0;b--);
}
