|
我在做萬年歷時(shí)在時(shí)鐘與年月日轉(zhuǎn)化出問題了;;
我基本想法是令key2控制由時(shí)鐘轉(zhuǎn)化為年月日;然后年月日用for語句執(zhí)行100次后重新返回時(shí)鐘程序,理想狀態(tài)下應(yīng)該是時(shí)鐘一直在執(zhí)行,中斷返回后時(shí)鐘繼續(xù)走,但現(xiàn)在出現(xiàn)的問題是轉(zhuǎn)化為年月日返回后有時(shí)可以時(shí)鐘正常運(yùn)行,有時(shí)需停頓幾秒才能繼續(xù)運(yùn)行。
求大神指點(diǎn)!�。�
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code table[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f};
- void delay(uint);
- sbit key1=P2^7;
- sbit key2=P2^6;
- sbit key5=P2^3;
- sbit key4=P2^4;
- uchar num=0,shi=0,fen=0,miao=0,nian=20,yue=10,ri=3;
- void wmiao()
- {
- P0=0x7f;
- P1=table[miao%10]; //個(gè)位
- delay(1);
- P0=0xbf;
- P1=table[miao/10]; //十位
- delay(1);
- P0=0xff; //消影
- delay(1);
- }
- //void display(uchar shu)
- //{
- //
- //
- // P0=0x7f;
- // P1=table[shu%10]; //個(gè)位
- // delay(1);
- // P0=0xbf;
- // P1=table[shu/10]; //十位
- // delay(1);
- // P0=0xff; //消影
- // delay(1);
- //}
- void wfen()
- {
- P0=0xef;
- P1=table[fen%10]; //分個(gè)位
- delay(1);
- P0=0xf7;
- P1=table[fen/10]; //分十位
- delay(1);
- P0=0xff; //消影
- delay(1);
- }
- void wshi()
- {
- P0=0xfd;
- P1=table[shi%10]; //時(shí)個(gè)位
- delay(1);
- P0=0xfe;
- P1=table[shi/10]; //時(shí)十位
- delay(1);
- P0=0xff; //消影
- delay(1);
- }
- void gang() //杠
- {
- P0=0xdb;
- P1=0x40;
- delay(1);
- }
- void wnyr()
- {
- P0=0xfe; //年
- P1=table[nian/10];
- delay(1);
- P0=0xfd;
- P1=table[nian%10];
- delay(1);
- P0=0xfb;
- P1=table[nian/10];
- delay(1);
- P0=0xf7;
- P1=table[nian%10];
- delay(1);
- P0=0xef; //月
- P1=table[yue/10];
- delay(1);
- P0=0xdf;
- P1=table[yue%10];
- delay(1);
- P0=0xbf; //日
- P1=table[ri/10];
- delay(1);
- P0=0x7f;
- P1=table[ri%10];
- delay(1);
- }
- void init() //啟動(dòng)定時(shí)器并賦值
- {
- TMOD=0x01;
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- // TH1=(65536-45872)/256;
- // TL1=(65536-45872)%256;
- EA=1;
- ET0=1;
- // ET1=1;
- TR0=1;
- // TR1=1;
- }
- void keyscan() //掃描鍵盤
- {
- uchar m;
- if(key1==0)
- {
- delay(10); //去抖
- if(key1==0)
- {
- while(!key1); //等待按鍵釋放
- TR1=~TR1;
- }
- }
- if(key2==0) //切換時(shí)鐘與年月日
- {
- delay(10); //去抖
- if(key2==0)
- {
- for(m=0;m<100;m++)
- wnyr();
- }
- }
- if(key5==0) //分加1
- {
- delay(10); //去抖
- if(key5==0)
- {
- fen++;
- delay(200);
- if(fen>=60) //分滿60進(jìn)1
- {
- fen=0;
- shi++;
- if(shi>=24)
- {
- shi=fen=miao=0;
- }
- }
- }
- }
- if(key4==0) //時(shí)加1
- {
- delay(10); //去抖
- if(key4==0)
- {
- shi++;
- delay(200);
- if(shi>=24)
- {
- shi=fen=miao=0;
- }
- }
- }
- }
- void main()
- {
- init();
- while(1)
- {
- keyscan();
- //display(num);
- wmiao();
- wfen();
- wshi();
- gang();
- if(num==20) //1秒到
- {
- num=0;
- miao++;
- if(miao==60) //秒60進(jìn)1
- {
- miao=0;
- fen++;
- if(fen>=60) //分60進(jìn)1
- {
- fen=0;
- shi++;
- if(shi>=24)
- {
- shi=fen=miao=0;
- ri++;
- if(yue!=2) //月份
- {
- switch(yue)
- {
- case 1:if(ri==32)
- ri=1;
- break;
- case 3:if(ri==31)
- ri=1;
- break;
- case 4:if(ri==31)
- ri=1;;
- break;
- case 5:if(ri==32)
- ri=1;
- break;
- case 6:if(ri==31)
- ri=1;
- break;
- case 7:if(ri==32)
- ri=1;
- break;
- case 8:if(ri==32)
- ri=1;
- break;
- case 9:if(ri==31)
- ri=1;
- break;
- case 10:if(ri==32)
- ri=1;
- break;
- case 11:if(ri==31)
- ri=1;
- break;
- case 12:if(ri==32)
- ri=1;
- break;
- }
- }
- else //二月
- {
- if((nian%4==0)&&(nian%400==0)) //閏年
- {
- if(ri>=30)
- ri=1;
- }
- else
- {
- if(ri>=29)
- ri=1;
- }
- }
- if(ri==1)
- {
- yue++;
- if(yue==13)
- {
- yue=0;
- nian++;
- }
- }
- }
- }
- }
- }
- }
- }
- //void T1_time() interrupt 3
- //{
- // TH1=(65536-45872)/256;
- // TL1=(65536-45872)%256;
- // num++;
- //}
- void T0_time() interrupt 1
- {
- // uchar n;
- TH0=(65536-45872)/256;
- TL0=(65536-45872)%256;
- num++;
- // if(key2==0)
- // {
- //// delay(10);
- //// if(key2==0)
- //// {
- // for(n=0;n<100;n++)
- // wnyr();
- //// }
- // }
- }
- void delay(uint m) //延時(shí)函數(shù)
- {
- uint x,y;
- for(x=m;x>0;x--)
- for(y=110;y>0;y--);
- }
復(fù)制代碼 |
|