#include <stc15.h>    	            //包含支持STC15W4K32S4单片机的头文件
#include <intrins.h>
#include <gpio.h>					 //I/O初始化文件
#define uchar unsigned char
#define uint  unsigned int
#include <display.h>
 /*--------定义k0、k1、k2输入引脚----------*/
sbit k0=P3^2;
sbit k1=P3^3;
sbit k2=P3^4;
uchar data timedata[6]={0x00,0x00,0x00,0x00,0x02,0x01,}; //计时单元数据初值，共6个
uchar data con1s=0x00,con03s=0x00,con=0x00;   //秒定时用
uchar a=16,b;                                  //用于闪烁功能交换数据用
/*―――――系统时钟为11.0592MHz时为10ms的延时函数―――――――――*/
void Delay10ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 117;
	j = 184;
	do
	{
		while (--j);
	} while (--i);
}

/*-------------------键盘扫描子程序--------------------------*/
void keyscan()
{
	EA=0;
	if(k0==0)
	{
		Delay10ms();
		while(k0==0);
		if(Dis_buf[con]==16)
		{
			b=Dis_buf[con];Dis_buf[con]=a;
			a=b;
		}
		con++;TR0=0;ET0=0;TR1=1;ET1=1;
		if(con>=6)
		{con=0;TR1=0;ET1=0;TR0=1;ET0=1;}
	}
	if(con!=0)
	{
		if(k1==0)
   		{
   			Delay10ms();
			while(k1==0);
			timedata[con]++;             
        	switch(con)
        	{
          		case 1:
          		case 3: if(timedata[con]>=6)   //判断是否是分、秒十位,如是加到大
                                               //于5,变为0
	  	  				{timedata[con]=0;}
                  		break;
          		case 2:
          		case 4:   if(timedata[con]>=10) //判断是否是时、分个位,如是加到
                                                //大于9,变为0
	  	  				{timedata[con]=0;}
                  		break;
          		case 5: if(timedata[con]>=3)      //判断是否是小时十位,如是加到
                                                   //大于2,变为0
	  	  		  		{timedata[con]=0;}
                  		break;
          		default:;
        	} 
			Dis_buf[con]=timedata[con];a=0x10;
    	 }
	}
	if(con!=0)
	{
		if(k2==0)
   		{
   			Delay10ms();
			while(k2==0);             
			switch(con)
          	{
          		case 1:
          		case 3: if(timedata[con]==0)    //判断是否是分、秒十位,如是减到等于
                                                 //0,变为5
	  	  				{timedata[con]=0x05;}
                  		else {timedata[con]--;}
                  		break;
          		case 2:
          		case 4: if(timedata[con]==0)          //判断是否是时、分个位,
                                                       //如是减到等于0,变为9
	  	  				{timedata[con]=0x09;}
                  		else {timedata[con]--;}
                  		break;
          				case 5: if(timedata[con]==0) //判断是否是小时十位, 如是减到等于0
                                                                          //变为2
	  	  						{timedata[con]=0x02;}
                  				else {timedata[con]--;}
                 				 break;
          				default:;
         	 }
             Dis_buf[con]=timedata[con];a=0x10;
   		}
	}
	EA=1;
}

/*-------------定时器初始化------------------------------------*/
void Timer0Init(void)		//50毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xB0;		//设置定时初值
	TH0 = 0x3C;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}
void Timer1Init(void)		//50毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0xB0;		//设置定时初值
	TH1 = 0x3C;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
}

/*-----------------------主程序-------------------------------*/
void main()
{
	uchar i;
	gpio();
    Timer0Init();
	Timer1Init();
	TMOD=0x11;
	ET0=1;
	ET1=1;		 //
	EA=1;
	TR1=0;     //关闭T1
	for(i=0;i<6;i++)
	{
		   Dis_buf[i]=timedata[i];
	}
	while(1)
	{
		display();
		keyscan();
	}
}
/*--------------------------------T0中断处理子程序-----------------*/
void Timer0_int (void) interrupt 1
{
	TL0 = 0xB0;		//设置定时初值
	TH0 = 0x3C;		//设置定时初值
	con1s++;
	if(con1s==20)
	{
		con1s=0x00;
		timedata[0]++;
		if(timedata[0]>=10)
		{
			timedata[0]=0;timedata[1]++;
			if(timedata[1]>=6)
			{
				timedata[1]=0;timedata[2]++;
				if(timedata[2]>=10)
				{
					timedata[2]=0;timedata[3]++;
					if(timedata[3]>=6)
					{
						timedata[3]=0;timedata[4]++;
						if(timedata[4]>=10)
						{
							timedata[4]=0;timedata[5]++;
						}
						if(timedata[5]==2)
						{
							if(timedata[4]==4)
							{
																				 							timedata[4]=0;timedata[5]=0;
							}
						}
					}
				}
			}

		}
		Dis_buf[0]=timedata[0];
		Dis_buf[1]=timedata[1];
		Dis_buf[2]=timedata[2];
		Dis_buf[3]=timedata[3];
		Dis_buf[4]=timedata[4];
		Dis_buf[5]=timedata[5];
	}
}
/*-----------------------0.3s闪烁中断子程序----------------------*/
void Timer1_int (void) interrupt 3
{
	con03s++;
	if(con03s==6)
	{
		con03s=0x00;
		b=Dis_buf[con];Dis_buf[con]=a;a=b;
	}
	
}
