麻煩大家給我看看 處理閏年問題的時(shí)候哪里出錯(cuò)了
/*時(shí)鐘12、24小時(shí)轉(zhuǎn)換--日期--星期*/
/*調(diào)整時(shí)間 ,日期 --------------------------閏年還有些問題*/
/*只用定時(shí)器*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^2; //外部中斷位定義 切換時(shí)間日期
sbit key1=P3^3; //外部中斷 12/24小時(shí)切換
uint t;
//dy年份 考慮閏年
uchar ts=55,tm=59,th=11,dd=31,dmi=12,dy=6,week=7; //時(shí)間日期定義 初始化
uchar shu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //不帶小數(shù)點(diǎn) - 0x40
uchar shu1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xf3}; //帶小數(shù)點(diǎn) 最后兩個(gè)顯示a p 上午下午
uchar dm[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //一到十二月每個(gè)月的天數(shù)
uchar wei[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7};
uchar flag=0,flag1=0; //顯示日期 時(shí)間的標(biāo)志
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) //顯示時(shí)間 24
{
display(th,0);
display(tm,2);
display(ts,4);
display(week,6);
}
void display_time1(void) //顯示時(shí)間 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) //顯示時(shí)間 日期
{
//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) //考慮到實(shí)際應(yīng)用中 年份變化范圍不大所以取年份的后面兩位
dm[2]=29;
else
dm[2]=20;
//年月日
if(dd==dm[dmi]+1)
{
dd=1;
dmi++;
if(dmi==13)
{
dmi=1;
dy++;
}
}
if(key==0) //時(shí)間日期切換
{
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; //調(diào)整時(shí)間的時(shí)候 用TR0=0使時(shí)間暫停
while(1)
{
keyscan();
display_dt();
}
}
沒人指點(diǎn)下嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |