下面是仿真图,芯片是用的51单片机:

下面是源程序:
#include"AT89X52.H"
#define uchar unsigned char
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; //断码
uchar code pos[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //微码
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit jidianqi1=P1^5;
sbit k6=P1^6;
sbit led=P1^7;
uchar k[8]={0,0,16,0,0,16,0,0}; //01234567
uchar code seg00[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf}; //断码
uchar code pos00[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //微码
uchar k00[8]={0,0,16,0,0,16,0,0}; //01234567
uchar second; 
uchar minite; 
uchar hour; 
uchar num;  
uchar naozhongqiyongFlag;
uchar second00; 
uchar minite00; 
uchar hour00; 
uchar num00; 
////////////////////////////////////////////////////////////////////////////////////
void TimeCompate(void)
 {
if(naozhongqiyongFlag)
 {
 if((second00==0)&&(minite00==1)&&(hour00==0)) ///&&(minite00<=2),,,(naozhongqiyongFlag==1)&&,, led=1
 {
 jidianqi1=0; 
 }
 else if((second00==5)&&(minite00==42)&&(hour00==0))
 {
 jidianqi1=1; naozhongqiyongFlag=~naozhongqiyongFlag; led=~led; 
 }
 }  
/*if(hour00!=0)
 { jidianqi1=1; naozhongqiyongFlag=0; 
 }
 if(hour00==0) 
 {
 if(minite00<1)
 { jidianqi1=1; naozhongqiyongFlag=0; 
 }
 else if(minite00>2)
 { jidianqi1=1; naozhongqiyongFlag=0; 
 }
  else
 {
 jidianqi1=0; 
 }
} 
/*/
//////////////////////////////////////////
 
}
//////////////// //延时程序///////////////////////////////
void delay_5ms(void) 
{
 uchar i,j;
 for(i=10;i>0;i--)
 for(j=248;j>0;j--)
 ;
}
////////////显示程序,这个写法不错啊。//////////////////////////
void disp(uchar m,uchar n) 
{
P2=pos[n]; //查表法 把对应的段码送P2?
P0=seg[m]; //查表法 把对应的未码送P0口
delay_5ms();
P2=0x00;
}
////////////显示程序,这个写法不错啊。//////222222222222222/////
void disp00(uchar x,uchar y) 
{
P2=pos00[y]; //查表法 把对应的段码送P2?
P0=seg00[x]; //查表法 把对应的未码送P0口
delay_5ms();
P2=0x00;
}
////////////////////主程序//////////////////////////////
void main(void)
{
 uchar j;
 uchar p;
 TMOD=0x01;
 // TH0=-50000/256;
 // TL0=-50000%256;
 TR0=1;
 ET0=1;
 EA=1;
 second=0;
 minite=0;
 hour=0;
 second00=7;
 minite00=8;
 hour00=9;
 jidianqi1=1;
 naozhongqiyongFlag=0; 
 led=1;
 while(1) 
 {
 TimeCompate();
 if(k1==0) 
 { 
 delay_5ms();
 if(k1==0) //判断按键是否按下
 { 
 second=0;
  while(k1==0);  
 } 
 } 
 if(k2==0) //判断按键是否按下
 { 
 delay_5ms(); 
 if(k2==0) 
 { 
 minite++; 
 if(minite==60) minite=0;
 while(k2==0); 
 } 
 } 
 if(k3==0) //判断按键是否按下
 { 
 delay_5ms();
 if(k3==0) 
 { 
 hour++; 
 if(hour==24) hour=0; 
 while(k3==0)
 {for(j=0;j<8;j++) //扫描显示程序,循环有8次,01234567.
 disp(k[j],j); //扫描显示程序
 }  
 } 
 }
//////////////////////////////////////////////////////////////////////
 if(k4==0) //判断按键是否按下
 { 
 delay_5ms();
 if(k4==0) 
 { 
 while(k4==0)
 {
 for(p=0;p<8;p++) 
 disp00(k00[p],p); 
TimeCompate();
 ; 
 } 
 } 
 }
 ///////////////////////////////////////////////////////////////////////////////
 if(k5==0) //判断按键是否按下
 { 
 delay_5ms();
 if(k5==0) 
 { 
 second00=57; 
 minite00=0; 
 hour00=0;
 while(k5==0)
 {
 for(p=0;p<8;p++) 
 disp00(k00[p],p); 
 ; 
 } 
 } 
 }
//////////////////////////////////////////////////////////////////////////////////////
if(k6==0) //判断按键是否按下
 { 
 delay_5ms();
 if(k6==0) 
 { 
 naozhongqiyongFlag=~naozhongqiyongFlag; 
 led=~led;
 
 while(k6==0)
 {
 ;
 } 
 } 
 }
 ////////////////////////////////////////////////////////////////////////////////////
 for(j=0;j<8;j++) //扫描显示程序,循环有8次,01234567.
 disp(k[j],j); //扫描显示程序
 ////////////////////////////////////////////////////////////////////////////////////
 TimeCompate();
 ////////////////////////////////////////////////////////////////////////////////////
 
 }
}
////////////////*定时器工作方式*/ /////////////////////////////////
void t0(void) interrupt 1 /*定时器工作方式*/ using 0 //工作寄存器
{ 
 num++; 
 
 if(num==20) 
 { 
 num=0; 
 second++; 
 if(second==60) 
 { 
 second=0; 
 minite++; 
 if(minite==60) 
 { 
 minite=0; 
 hour++;  
 if(hour==24) 
 { 
 hour=0; 
 } 
 } 
 } 
 k[0]=second%10; //各位
 k[1]=second/10; //各十位
 k[3]=minite%10; //各位
 k[4]=minite/10; //各十位
 k[6]=hour%10; //各位
 k[7]=hour/10; //各十位
 } 
 num00++; 
 if(num00==20) 
 { 
 num00=0; 
 second00++; 
 if(second00==60) 
 { 
 second00=0; 
 minite00++; 
 if(minite00==60) 
 { 
 minite00=0; 
 hour00++; 
 if(hour00==99) 
 { 
 hour00=0; 
 } 
 } 
 } 
 k00[0]=second00%10; //各位
 k00[1]=second00/10; //各十位
 k00[3]=minite00%10; //各位
 k00[4]=minite00/10; //各十位
 k00[6]=hour00%10; //各位
 k00[7]=hour00/10; //各十位
 }
 
 
 TH0=-50000/256;
 TL0=-50000%256;
 
}