我在做萬年歷時在時鐘與年月日轉化出問題了;;
我基本想法是令key2控制由時鐘轉化為年月日;然后年月日用for語句執行100次后重新返回時鐘程序,理想狀態下應該是時鐘一直在執行,中斷返回后時鐘繼續走,但現在出現的問題是轉化為年月日返回后有時可以時鐘正常運行,有時需停頓幾秒才能繼續運行。
求大神指點!!!
- #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]; //個位
- delay(1);
- P0=0xbf;
- P1=table[miao/10]; //十位
- delay(1);
- P0=0xff; //消影
- delay(1);
- }
- //void display(uchar shu)
- //{
- //
- //
- // P0=0x7f;
- // P1=table[shu%10]; //個位
- // delay(1);
- // P0=0xbf;
- // P1=table[shu/10]; //十位
- // delay(1);
- // P0=0xff; //消影
- // delay(1);
- //}
- void wfen()
- {
- P0=0xef;
- P1=table[fen%10]; //分個位
- delay(1);
- P0=0xf7;
- P1=table[fen/10]; //分十位
- delay(1);
- P0=0xff; //消影
- delay(1);
- }
- void wshi()
- {
- P0=0xfd;
- P1=table[shi%10]; //時個位
- delay(1);
- P0=0xfe;
- P1=table[shi/10]; //時十位
- 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() //啟動定時器并賦值
- {
- 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) //切換時鐘與年月日
- {
- 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進1
- {
- fen=0;
- shi++;
- if(shi>=24)
- {
- shi=fen=miao=0;
- }
- }
- }
- }
- if(key4==0) //時加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進1
- {
- miao=0;
- fen++;
- if(fen>=60) //分60進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) //延時函數
- {
- uint x,y;
- for(x=m;x>0;x--)
- for(y=110;y>0;y--);
- }
復制代碼 |