/*8位數(shù)碼管顯示 時(shí)間格式 05—50—00 標(biāo)示05點(diǎn)50分00秒S1 用于小時(shí)加1操作S2 用于小時(shí)減1操作S3 用于分鐘加1操作S4 用于分鐘減1操作*/#includereg52.h>sbit KEY1=P3^0; //定義端口參數(shù)sbit KEY2=P3^1;sbit KEY3=P3^2;sbit KEY4=P3^3;sbit LED=P1^2; //定義指示燈參數(shù)code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰極數(shù)碼管0—9unsigned char StrTab[8]; //定義緩沖區(qū)unsigned char minute=19,hour=23,second; //定義并初始化為 12:30:00void delay(unsigned int cnt){while(--cnt);}/******************************************************************//* 顯示處理函數(shù) *//******************************************************************/void Displaypro(void){StrTab[0]=tab[hour/10]; //顯示小時(shí)StrTab[1]=tab[hour%10];StrTab[2]=0x40; //顯示"-"StrTab[3]=tab[minute/10]; //顯示分鐘StrTab[4]=tab[minute%10];StrTab[5]=0x40; //顯示"-"StrTab[6]=tab[second/10]; //顯示秒StrTab[7]=tab[second%10];}main(){TMOD |=0x01; //定時(shí)器0 10ms inM crystal 用于計(jì)時(shí)TH0=0xd8; //初值TL0=0xf0;ET0=1;TR0=1;TMOD |=0x10; //定時(shí)器1用于動(dòng)態(tài)掃描TH1=0xF8; //初值TL1=0xf0;ET1=1;TR1=1;EA =1;Displaypro(); //調(diào)用顯示處理函數(shù)while(1){if(!KEY1) //按鍵1去抖以及動(dòng)作{delay(10000);if(!KEY1){ hour++;if(hour==24)hour=0; //正常時(shí)間 小時(shí) 加1Displaypro();}}if(!KEY2) //按鍵2去抖以及動(dòng)作{delay(10000);if(!KEY2){hour--;if(hour==255)hour=23; //正常時(shí)間 小時(shí)減1Displaypro();}}if(!KEY3) //按鍵去抖以及動(dòng)作{delay(10000);if(!KEY3){minute++;if(minute==60)minute=0; //分加1Displaypro();}} if(!KEY4) //按鍵去抖以及動(dòng)作{delay(10000);if(!KEY4){minute--;if(minute==255)minute=59; //分減1Displaypro();}}}}/******************************************************************//* 定時(shí)器1中斷 *//******************************************************************/void time1_isr(void) interrupt 3 using 0 //定時(shí)器1用來(lái)動(dòng)態(tài)掃描{static unsigned char num;TH1=0xF8; //重入初值TL1=0xf0;switch (num){case 0:P2=0;P0=StrTab[num];break; //分別調(diào)用緩沖區(qū)的值進(jìn)行掃描case 1:P2=1;P0=StrTab[num];break;case 2:P2=2;P0=StrTab[num];break;case 3:P2=3;P0=StrTab[num];break;case 4:P2=4;P0=StrTab[num];break;case 5:P2=5;P0=StrTab[num];break;case 6:P2=6;P0=StrTab[num];break;case 7:P2=7;P0=StrTab[num];break;default:break;}num++; //掃描8次,使用8個(gè)數(shù)碼管if(num==8)num=0;}/******************************************************************//* 定時(shí)器0中斷 *//******************************************************************/void tim(void) interrupt 1 using 1{static unsigned char count; //定義內(nèi)部局部變量TH0=0xd8; //重新賦值TL0=0xf0;count++;switch (count){case 0:case 20:case 40:case 60:case 80:Displaypro();break; //隔一定時(shí)間調(diào)用顯示處理case 50:P1=~P1;break; //半秒 LED 閃爍default:break;}if (count==100){count=0;second++; //秒加1if(second==60){second=0;minute++; //分加1if(minute==60){minute=0;hour++; //時(shí)加1if(hour==24)hour=0;} }} }
評(píng)論