我在做万年历时在时钟与年月日转化出问题了;;
我基本想法是令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--);
- }
复制代码 |