{
clocksing=0; } } else {
clocksing=1; } } else {
clocksing=1; }
if(keyscan()==0xff) continue; keypro(); } }
/******************键扫描程序******************/ unsigned char keyscan(void) {
P3=0xff; keyval=P3;
if(keyval==0xff) {
return 0xff; }
delay(10000); if(keyval!=P3) {
return 0xff; } else {
while(P3!=0xff); return keyval; } }
/******************时钟中断及显示程序******************/ void t0int(void) interrupt 1 using 1 {
TH0=(0-2000)/256; //2ms TL0=(0-2000)%6;
P0=0xff; P1=0xff;
P1=bittab[dispindex];
if(mode==4&&P1==0xfd) //秒表处显示小数点的if语句 {
P0=segtab_dot[dispbuf[dispindex]]; } else {
P0=segtab[dispbuf[dispindex]]; }
if((dispindex==pos)&&(flash==1)&&(mode==2||(mode==3&&clock_shanshuo==0)))//闪烁控制程序 {
P0=0xff; P1=0xf0; }
dispindex++;
dispindex=dispindex&0x03; cnt++; cnt1++;
if(cnt1>=250) //0.5ms闪烁 {
cnt1=0;
flash=~flash; }
if(cnt>=500) //2ms*500=1s {
cnt=0; ss++;
if(ss>=60) {
ss=0; mm++;
if(mm>=60) {
mm=0; hh++;
if(hh>=24) {
hh=0;
} } }
if(mode==0) {
dispbuf[0]=mm/10; dispbuf[1]=mm; dispbuf[2]=ss/10; dispbuf[3]=ss; }
else if(mode==1||(mode==3&&clock_shanshuo==1)) {
dispbuf[0]=hh/10; dispbuf[1]=hh; dispbuf[2]=mm/10; dispbuf[3]=mm;
} } }
/******************按键选择,进入不同模式******************/ void keypro(void) {
switch(mode) {
case 0://显示分秒
if(keyval==0x7f) {
mode=1;
dispbuf[0]=hh/10; dispbuf[1]=hh; dispbuf[2]=mm/10; dispbuf[3]=mm; }
break;
case 1://显示时分
if(keyval==0x7f) {
mode=2;
dispbuf[0]=hh/10; dispbuf[1]=hh; dispbuf[2]=mm/10; dispbuf[3]=mm; }
break;
case 2://时间调整(只调整时分)
if(keyval==0x7f) //按键1 调整模式 进入闹钟模式 { mode=3; clock_hh=0; clock_mm=0;
clock_shanshuo=0;
hh=dispbuf[0]*10+dispbuf[1]; //保存调整后的时间 mm=dispbuf[2]*10+dispbuf[3];
dispbuf[0]=clock_hh/10; //显示闹钟的初始时间 dispbuf[1]=clock_hh; dispbuf[2]=clock_mm/10; dispbuf[3]=clock_mm; TR0=1; }
else if(keyval==0xbf) //按键2 加 {
if(pos==0) {
dispbuf[pos]++; if(dispbuf[pos]==3) {
dispbuf[pos]=0; } }
else if(pos==1) {
if(dispbuf[0]==0||dispbuf[0]==1) {
dispbuf[pos]++;
dispbuf[pos]=dispbuf[pos]; }
if(dispbuf[0]==2) {
dispbuf[pos]++;