麻煩大家給我看看 處理閏年問題的時候哪里出錯了
/*時鐘12、24小時轉換--日期--星期*/ /*調整時間 ,日期 --------------------------閏年還有些問題*/ /*只用定時器*/
#include<reg52.h> #define uchar unsigned char #define uint unsigned int
sbit key=P3^2; //外部中斷位定義 切換時間日期 sbit key1=P3^3; //外部中斷 12/24小時切換
uint t;
//dy年份 考慮閏年 uchar ts=55,tm=59,th=11,dd=31,dmi=12,dy=6,week=7; //時間日期定義 初始化
uchar shu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不帶小數點 - 0x40 uchar shu1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xf3}; //帶小數點 最后兩個顯示a p 上午下午 uchar dm[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //一到十二月每個月的天數 uchar wei[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7};
uchar flag=0,flag1=0; //顯示日期 時間的標志
void time(void) interrupt 1 //50ms { TH0=(65536-50000)/256; TL0=(65536-50000)%256; t++; }
void delay(uchar x) { //x 1ms uchar y; for(x;x>0;x--) for(y=250;y>0;y--); }
void display(uchar m,uchar n) //顯示一位 秒、分... { uchar m_ge,m_shi; m_ge=m%10; m_shi=m/10;
P1=wei[n]; P2=shu[m_shi]; delay(1);
P1=wei[n+1]; P2=shu1[m_ge]; delay(1); }
void display_time0(void) //顯示時間 24 { display(th,0); display(tm,2); display(ts,4); display(week,6); }
void display_time1(void) //顯示時間 12 { display(th%12,0); display(tm,2); display(ts,4);
P1=wei[7]; P2=shu1[10+th/12]; delay(1); }
void display_day(void) { display(dy,0); display(dmi,2); display(dd,4); }
void display_dt(void) //顯示時間 日期 { //one day if(t==20) { t=0; ts++; if(ts==60) { ts=0; tm++; if(tm==60) { tm=0; th++; if(th==24) { th=0; dd++; week++; if(week==8) week=1; //星期week } } } } //閏年二月 // if(dy/400==0||(dy/100!=0&&dy/4==0)) if(dy/4==0) //考慮到實際應用中 年份變化范圍不大所以取年份的后面兩位 dm[2]=29; else dm[2]=20;
//年月日 if(dd==dm[dmi]+1) { dd=1; dmi++; if(dmi==13) { dmi=1; dy++; } }
if(key==0) //時間日期切換 { delay(15); if(key==0) { flag=~flag; while(!key); } }
if(key1==0) //12、24切換 { delay(12); if(key1==0) { flag1=~flag1; while(!key1); } } if(flag==0) { if(flag1==0) display_time0(); else display_time1(); } else display_day(); }
uchar add(uchar i,j,n) //add 1 { if(key1==0) delay(12); if(key1==0) while(!key1) //按著不放 快速加1 { delay(80); while(!key1) { display(i,n); delay(500); i++; if(i>=j) i=0; } } return i; }
uchar keyscan() //鍵盤掃描 { unsigned char a; P0=0xf0; if(P0!=0xf0) delay(12); if(P0!=0xf0) { a=P0; TR0=0; delay(1); } P0=0x0f; a=a|P0; switch(a) { case 0xee: //00 ts=add(ts,60,4); break; case 0xde: //01 tm=add(tm,60,2); break; case 0xbe: //02 th=add(th,24,0); break; case 0x7e: //03 week=add(week,7,6); break;
case 0xed: //10 dd=add(dd,dm[dmi],4); break; case 0xdd: //11 dmi=add(dmi,12,2); break; case 0xbd: //12 dy=add(dy,99,0); break; case 0x7d: //13 TR0=1; break;
default :break; } return a; }
void main(void) { //初始化 TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; //調整時間的時候 用TR0=0使時間暫停
while(1) { keyscan(); display_dt(); } }
|