暑假写的,你参考参考#include <reg51.h>#include <stdio.h>#include <absacc.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define outbit P3#define outseg P1uchar second;sbit p20=P2^0 ; //设置sbit p21=P2^1 ; //+sbit p22=P2^2 ; //-sbit change=P2^3 ; //显示选择sbit speak=P2^4;//蜂鸣器uchar clock[7]={6,6,12,58,12,59,0};//依次为月 日 时 分 闹钟时 闹钟分 比较量uchar code TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar m,n,q,i,h;j=6;k=1;a=0xff;b=0xff;c=0xff;d=0xff;
void delay(){uint e;for(e=0;e<200;e++);}
void display(){ outbit=0x08&d; outseg=TAB[m]; delay();
outbit=0x04&c; outseg=TAB[n]; delay();
outbit=0x02&b; outseg=TAB[q]; delay();
outbit=0x01&a; outseg=TAB[i]; delay();}
void keyscan(){ P2=0x0f;
if(p20==0) {h=j; if(j==6) j=0; else j=j+1; }
if(p21==0) {switch(j) { case 0:if(clock[j]<12) clock[j]=clock[j]+1; else clock[j]=1; break; case 1:if(clock[j]<31) clock[j]=clock[j]+1; else clock[j]=1;break; case 2:if(clock[j]<23) clock[j]=clock[j]+1; else clock[j]=0;break; case 3:if(clock[j]<59) clock[j]=clock[j]+1; else clock[j]=0;break; case 4:if(clock[j]<23) clock[j]=clock[j]+1; else clock[j]=0; break; case 5:if(clock[j]<59) clock[j]=clock[j]+1; else clock[j]=0; break; default:break; } }
if(p22==0) {switch(j) { case 0:if(clock[j]>1) clock[j]=clock[j]-1; else clock[j]=12; break; case 1:if(clock[j]>1) clock[j]=clock[j]-1; else clock[j]=31; break; case 2:if(clock[j]>0) clock[j]=clock[j]-1; else clock[j]=23;break; case 3:if(clock[j]>0) clock[j]=clock[j]-1; else clock[j]=59;break; case 4:if(clock[j]>0) clock[j]=clock[j]-1; else clock[j]=23;break; case 5:if(clock[j]>0) clock[j]=clock[j]-1; else clock[j]=59; break; default:break; } }
if(change==1) { while(1) { P2=0x0f; if((P2&0x0f)==0x0f ) break; } }
}
main(){EA=1;ET0=1;TMOD=0x01; TH0=-20000/256; TL0=-20000%256; TR0=1; while(1) {display(); keyscan(); if(j==6) {if(change==1) {m=clock[3]%10; //选择显示时间 n=clock[3]/10; q=clock[2]%10; i=clock[2]/10;
outbit=0x08; //显示秒的点 闪动 outseg=second; delay(); } else {m=clock[1]%10; //选择显示日期 n=clock[1]/10; q=clock[0]%10; i=clock[0]/10; } } else if(j==0) { q=clock[j]%10; i=clock[j]/10; } else if(j==1) {m=clock[j]%10; n=clock[j]/10; } else if(j==2) { q=clock[j]%10; i=clock[j]/10; } else if(j==3) {m=clock[j]%10; n=clock[j]/10; } else if(j==4) {q=clock[j]%10; i=clock[j]/10; } else if(j==5) {m=clock[j]%10; n=clock[j]/10; } if(clock[2]==clock[4]&&clock[3]==clock[5]) //定点报时 { if(p20==0||p21==0||p22==0||change==0) //有键按下则停止报警 k=0; speak=1&k; } else k=1;
}}
void timer0() interrupt 1 using 1{uchar e,f,g,h;
TH0=-20000/256; TL0=-20000%256; e=e+1; if (e==50) //1sec { e=0; g=g+1; second=second^0x80;
if(g==60) //1min { g=0;
if(clock[3]==59) //每过60s改变下时间 {if(clock[2]==23) {clock[2]=0; clock[3]=0; } else {clock[2]=clock[2]+1; clock[3]=0; } } else clock[3]=clock[3]+1; if(clock[3]==0&&clock[2]==0) //时间都为0时改变日期 {switch(clock[0]) { case 1:if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=2; } break; case 2: if(clock[1]<29) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=3; } break; case 3: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=4; } break; case 4: if(clock[1]<30) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=5; } break; case 5: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=6; } break; case 6: if(clock[1]<30) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=7; } break; case 7: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=8; } break; case 8: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=9; } break; case 9: if(clock[1]<30) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=10; } break; case 10: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=11; } break; case 11: if(clock[1]<30) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=12; } break; case 12: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=1; } break; default:break; } }
}
if(j!=6) {f=f+1; if(f!=10) //判断10s是否到 是否有键按下 { switch(j) //所设置的那位闪动 {case 0:a=~a;b=~b;c=0;d=0;break; case 1:c=~c;d=~d;a=0;b=0;break; case 2:a=~a;b=~b;c=0;d=0;break; case 3:c=~c;d=~d;a=0;b=0;break; case 4:a=~a;b=~b;c=0;d=0;break; case 5:c=~c;d=~d;a=0;b=0;break; default:break; } if(clock[6]!=clock[j]||h!=j) {f=0; h=j; clock[6]=clock[j]; } } else {j=6; f=0; a=0xff; b=0xff; c=0xff; d=0xff; } } else {a=0xff; b=0xff; c=0xff; d=0xff; } }}
void delay(){uint e;for(e=0;e<200;e++);}
void display(){ outbit=0x08&d; outseg=TAB[m]; delay();
outbit=0x04&c; outseg=TAB[n]; delay();
outbit=0x02&b; outseg=TAB[q]; delay();
outbit=0x01&a; outseg=TAB[i]; delay();}
void keyscan(){ P2=0x0f;
if(p20==0) {h=j; if(j==6) j=0; else j=j+1; }
if(p21==0) {switch(j) { case 0:if(clock[j]<12) clock[j]=clock[j]+1; else clock[j]=1; break; case 1:if(clock[j]<31) clock[j]=clock[j]+1; else clock[j]=1;break; case 2:if(clock[j]<23) clock[j]=clock[j]+1; else clock[j]=0;break; case 3:if(clock[j]<59) clock[j]=clock[j]+1; else clock[j]=0;break; case 4:if(clock[j]<23) clock[j]=clock[j]+1; else clock[j]=0; break; case 5:if(clock[j]<59) clock[j]=clock[j]+1; else clock[j]=0; break; default:break; } }
if(p22==0) {switch(j) { case 0:if(clock[j]>1) clock[j]=clock[j]-1; else clock[j]=12; break; case 1:if(clock[j]>1) clock[j]=clock[j]-1; else clock[j]=31; break; case 2:if(clock[j]>0) clock[j]=clock[j]-1; else clock[j]=23;break; case 3:if(clock[j]>0) clock[j]=clock[j]-1; else clock[j]=59;break; case 4:if(clock[j]>0) clock[j]=clock[j]-1; else clock[j]=23;break; case 5:if(clock[j]>0) clock[j]=clock[j]-1; else clock[j]=59; break; default:break; } }
if(change==1) { while(1) { P2=0x0f; if((P2&0x0f)==0x0f ) break; } }
}
main(){EA=1;ET0=1;TMOD=0x01; TH0=-20000/256; TL0=-20000%256; TR0=1; while(1) {display(); keyscan(); if(j==6) {if(change==1) {m=clock[3]%10; //选择显示时间 n=clock[3]/10; q=clock[2]%10; i=clock[2]/10;
outbit=0x08; //显示秒的点 闪动 outseg=second; delay(); } else {m=clock[1]%10; //选择显示日期 n=clock[1]/10; q=clock[0]%10; i=clock[0]/10; } } else if(j==0) { q=clock[j]%10; i=clock[j]/10; } else if(j==1) {m=clock[j]%10; n=clock[j]/10; } else if(j==2) { q=clock[j]%10; i=clock[j]/10; } else if(j==3) {m=clock[j]%10; n=clock[j]/10; } else if(j==4) {q=clock[j]%10; i=clock[j]/10; } else if(j==5) {m=clock[j]%10; n=clock[j]/10; } if(clock[2]==clock[4]&&clock[3]==clock[5]) //定点报时 { if(p20==0||p21==0||p22==0||change==0) //有键按下则停止报警 k=0; speak=1&k; } else k=1;
}}
void timer0() interrupt 1 using 1{uchar e,f,g,h;
TH0=-20000/256; TL0=-20000%256; e=e+1; if (e==50) //1sec { e=0; g=g+1; second=second^0x80;
if(g==60) //1min { g=0;
if(clock[3]==59) //每过60s改变下时间 {if(clock[2]==23) {clock[2]=0; clock[3]=0; } else {clock[2]=clock[2]+1; clock[3]=0; } } else clock[3]=clock[3]+1; if(clock[3]==0&&clock[2]==0) //时间都为0时改变日期 {switch(clock[0]) { case 1:if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=2; } break; case 2: if(clock[1]<29) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=3; } break; case 3: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=4; } break; case 4: if(clock[1]<30) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=5; } break; case 5: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=6; } break; case 6: if(clock[1]<30) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=7; } break; case 7: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=8; } break; case 8: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=9; } break; case 9: if(clock[1]<30) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=10; } break; case 10: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=11; } break; case 11: if(clock[1]<30) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=12; } break; case 12: if(clock[1]<31) clock[1]=clock[1]+1; else {clock[1]=1; clock[0]=1; } break; default:break; } }
}
if(j!=6) {f=f+1; if(f!=10) //判断10s是否到 是否有键按下 { switch(j) //所设置的那位闪动 {case 0:a=~a;b=~b;c=0;d=0;break; case 1:c=~c;d=~d;a=0;b=0;break; case 2:a=~a;b=~b;c=0;d=0;break; case 3:c=~c;d=~d;a=0;b=0;break; case 4:a=~a;b=~b;c=0;d=0;break; case 5:c=~c;d=~d;a=0;b=0;break; default:break; } if(clock[6]!=clock[j]||h!=j) {f=0; h=j; clock[6]=clock[j]; } } else {j=6; f=0; a=0xff; b=0xff; c=0xff; d=0xff; } } else {a=0xff; b=0xff; c=0xff; d=0xff; } }}