#includereg52.h//头文件#defineucharunsignedchar//宏定义#defineuintunsignedintsbitP32=P3^2;//位声明sbitP36=P3^6;sbitP37=P3^7;ucharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳段码表uinthou1,hou2,min1,min2,sec1,sec2,numhou,nummin,numsec,yue1,yue2,ri1,ri2,numyue,numri;uintnum,m,n;voiddelayms(uintxms)//延时函数{uinti,j;for(i=xms;i0;i--)for(j=110;j0;j--);}voidp32xd()//按键P32消抖{delayms(2);while(P32!=1);delayms(2);}voidp36xd()//按键P36消抖{delayms(1);while(P36!=1);delayms(1);}voidp37xd()//按键P37消抖{delayms(1);while(P37!=1);delayms(1);}voiddisplaysj()//显示时间{P2=0x00;P0=table[hou1];//显示时的第一位P2=0X20;delayms(1);P2=0xff;P0=table[hou2]&0x7f;//显示时的第二位与小数点P2=0X10;delayms(1);P2=0xff;P0=table[min1];//显示分的第一位P2=0X08;delayms(1);P2=0xff;P0=table[min2]&0x7f;//显示时的第二位与小数点P2=0X04;delayms(1);P2=0xff;P0=table[sec1];//显示秒的第一位P2=0X02;delayms(1);P2=0xff;P0=table[sec2];//显示秒的第二位P2=0X01;delayms(1);}voiddisplayrq()//显示日期{P2=0x00;P0=table[yue1];//显示月的第一位P2=0X20;delayms(1);P2=0x00;P0=table[yue2]&0x7f;//显示月的第二位P2=0X10;delayms(1);P2=0x00;P0=table[ri1];//显示日的第一位P2=0X08;delayms(1);P2=0x00;P0=table[ri2];//显示日的第二位P2=0X04;delayms(1);}voidhouqh()//时针切换函数{hou1=numhou/10;hou2=numhou%10;}voidminqh()//分针切换函数{min1=nummin/10;min2=nummin%10;}voidsecqh()//秒针切换函数{sec1=numsec/10;sec2=numsec%10;}voidyueqh()//月切换函数{yue1=numyue/10;yue2=numyue%10;}voidriqh()//日切换函数{ri1=numri/10;ri2=numri%10;}voidstart()//初始化函数{num=0;TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;IT0=0;//电平触发(低电平有效)EX0=1;ET0=1;TR0=1;yueqh(),riqh();//初始化日月切换}voidritiao()//日期的调节函数{if(P36==0)//日期加一调节键{p36xd();if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12)){numri+=1;if(numri=32)//如果是大月,日期有31号,等于符号是防止日期大于31号而乱码{numri=1;}}if((numyue==4)||(numyue==6)||(numyue==9)||(numyue==11)){numri+=1;if(numri=31)//如果是小月,日期有30号{numri=1;}}if(numyue==2){numri+=1;if(numri=29)//如果是小月,日期有28号{numri=1;}}riqh();//日期调节后切换一下}if(P37==0)//日期减一调节键{p37xd();if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12)){numri-=1;if(numri==0){numri=31;}}if((numyue==4)||(numyue==6)||(numyue==9)||(numyue==11)){numri-=1;if(numri==0){numri=30;}}if(numyue==2){numri-=1;if(numri==0){numri=28;}}riqh();}}voidyuetiao()//月份的调节函数{if(P36==0){p36xd();numyue+=1;if(numyue==13)//月份为12时再加一马上为一月{numyue=1;}yueqh();}if(P37==0){p37xd();numyue-=1;if(numyue==0){numyue=12;}yueqh();}}voidint0()interrupt0{p32xd();while(P32!=0)//第一次按下p32时,进行秒调时{for(m=0;m40;m++)//此for循环不显示秒,为的是使秒闪烁{P2=0x00;P0=table[hou1];P2=0X20;delayms(1);P2=0x00;P0=table[hou2]&0x7f;P2=0X10;delayms(1);P2=0x00;P0=table[min1];P2=0X08;delayms(1);P2=0x00;P0=table[min2]&0x7f;P2=0X04;delayms(1);if(P36==0)//如果按一下P36,则秒加一{p36xd();numsec+=1;if(numsec==60){numsec=0;}secqh();}if(P37==0)//如果按一下P37,则秒减一{p37xd();numsec-=1;if(numsec==-1){numsec=59;}secqh();}};for(n=0;n40;n++)//此循环时分秒全显示,也为的是使秒闪烁{displaysj();if(P36==0){p36xd();numsec+=1;if(numsec==60){numsec=0;}secqh();}if(P37==0){p37xd();numsec-=1;if(numsec==-1){numsec=59;}secqh();}}};p32xd();while(P32!=0)//第二次按下p32时,进行分调时{for(m=0;m40;m++){P2=0x00;P0=table[hou1];P2=0X20;delayms(1);P2=0x00;P0=table[hou2]&0x7f;P2=0X10;delayms(1);P2=0x00;P0=table[sec1];P2=0X02;delayms(1);P2=0x00;P0=table[sec2];P2=0X01;delayms(1);if(P36==0){p36xd();nummin+=1;if(nummin==60){nummin=0;}minqh();}if(P37==0){p37xd();nummin-=1;if(nummin==-1){nummin=59;}minqh();}}for(n=0;n40;n++){displaysj();if(P36==0){p36xd();nummin+=1;if(nummin==60){nummin=0;}minqh();}if(P37==0){p37xd();nummin-=1;if(nummin==-1){nummin=59;}minqh();}}};p32xd();while(P32!=0)//第三次按下p32时,进行时调时{for(m=0;m40;m++){P2=0x00;P0=table[min1];P2=0X08;delayms(1);P2=0x00;P0=table[min2]&0x7f;P2=0X04;delayms(1);P2=0x00;P0=table[sec1];P2=0X02;delayms(1);P2=0x00;P0=table[sec2];P2=0X01;delayms(1);if(P36==0){p36xd();numhou+=1;if(numhou==24){numhou=0;}houqh();}if(P37==0){p37xd();numhou-=1;if(numhou==-1){numhou=23;}houqh();}}for(n=0;n40;n++){displaysj();if(P36==0){p36xd();numhou+=1;if(numhou==24){numhou=0;}houqh();}if(P37==0){p37xd();numhou-=1;if(numhou==-1){numhou=23;}houqh();}}}p32xd();while(P32!=0)//第四次按下p32时,进行日期调节{for(m=0;m50;m++){P2=0x00;P0=table[yue1];P2=0x20;delayms(1);P2=0x00;P0=table[yue2]&0x7f;P2=0x10;delayms(1);ritiao();}for(n=0;n50;n++){displayrq();ritiao();}}p32xd();while(P32!=0)//第五次按下p32时,进行月调节{for(m=0;m50;m++){P2=0xff;P0=table[ri1];P2=0xf7;delayms(1);P2=0xff;P0=table[ri2];P2=0xfb;delayms(1);yuetiao();}for(n=0;n50;n++){displayrq();yuetiao();}}p32xd();}voidyuejia(){numri=1;numyue+=1;if(numyue==13){numyue=1;}}voidtimer0()interrupt1{TH0=(65536-46100)/256;TL0=(65536-46100)%256;num++;if(num==20){num=0;TH0=(65536-46100)/256;TL0=(65536-46100)%256;numsec=numsec+1;if(numsec==60){numsec=0;nummin=nummin+1;if(nummin==60){nummin=0;numhou=numhou+1;if(numhou==24){numhou=0;numri+=1;if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12)){numri+=1;if(numri=32){numri=1;numyue+=1;if(numyue==13){numyue=1;}}}if((numyue==4)||(numyue==6)||(numyue==9)||(numyue==11)){numri+=1;if(numri=31){numri=1;numyue+=