新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)帶閏年補(bǔ)償?shù)囊粋€(gè)時(shí)鐘程序

51單片機(jī)帶閏年補(bǔ)償?shù)囊粋€(gè)時(shí)鐘程序

作者: 時(shí)間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
這是我教的學(xué)生寫的帶閏年補(bǔ)償的一個(gè)時(shí)鐘,比我自己寫成的還有成就感


#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar S1num;
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit GND=P2^4;
sbit K2=P2^3;
sbit K4=P2^2;
sbit K6=P2^1;
uchar x,num,shi,fen,miao,day,mon,year,week,count;
void display();
void write_com(uchar com)
{
RS=0;
EN=0;
P0=com;
delay(5);
//RW=0;
EN=1;
delay(5);
EN=0;

}
void write_dat(uchar dat)
{
RS=1;
EN=0;
P0=dat;
delay(5);
//RW=0;
EN=1;
delay(5);
EN=0;

}
void timer0()interrupt 1
{
TH0=(65536-45872)/256;//45872這個(gè)值是11.0592MHz產(chǎn)生一次中斷,最接近50Ms,如果是12MHz請(qǐng)用50000
TL0=(65536-45872)%256;
count++;
}
write_sfm(uchar add,uchar date)
{
uchar shi,ge;
write_com(0x80+0x40+add);
shi=date/10;
ge=date%10;
write_dat(0x30+shi);
write_dat(0x30+ge);
}
write_ymd(uchar add,uchar date)
{
uchar shi,ge;
write_com(0x80+add);
shi=date/10;
ge=date%10;
write_dat(0x30+shi);
write_dat(0x30+ge);
}
write_week(week)
{
switch(week)
{
case 1:write_dat(M);
write_dat(O);
write_dat(N);
break;
case 2:write_dat(T);
write_dat(U);
write_dat(E);
break;
case 3:write_dat(W);
write_dat(E);
write_dat(N);
break;
case 4:write_dat(T);
write_dat(H);
write_dat(U);
break;
case 5:write_dat(F);
write_dat(R);
write_dat(I);
break;
case 6:write_dat(S);
write_dat(A);
write_dat(T);
break;
case 7:write_dat(S);
write_dat(U);
write_dat(N);
break;
}
}
void init()
{
EN=0;
RW=0;
write_com(0x38);//顯示模式
delay(5);
write_com(0x0c);//開顯示
write_com(0x06);//光標(biāo)自加
write_com(0x80);//指針左一
write_com(0x01);//清屏

TMOD=0x01;//定時(shí)器0的工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;

EA=1;//開中斷
ET0=1;
TR0=1;//開定時(shí)器
display();
}
void display()
{
write_sfm(10,0);
write_com(0x80+0x40+11);
write_com(0x80+0x40+9);
write_dat(:);
write_sfm(7,0);
write_com(0x80+0x40+8);
write_com(0x80+0x40+6);
write_dat(:);
write_sfm(4,0);
write_com(0x80+0x40+5);
write_ymd(10,29);
write_com(0x80+11);
write_com(0x80+9);
write_dat(-);
write_ymd(7,3);
write_com(0x80+8);
write_com(0x80+6);
write_dat(-);
write_com(0x80+2);
write_dat(2);
write_dat(0);
write_ymd(4,12);
write_com(0x80+5);
write_com(0x80+13);
write_week(4);

}
void keyscan()
{
if(K2==0)
{
delay(5);
if(K2==0);//防止誤動(dòng)作
{
S1num++;
while(!K2);
switch(S1num)
{
case 1:
TR0=0;
write_com(0x80+0x40+11);
write_com(0x0f);
break;
case 2:
write_com(0x80+0x40+8);
break;
case 3:
write_com(0x80+0x40+5);
break;
case 4:
write_com(0x80+11);
break;
case 5:
write_com(0x80+8);
break;
case 6:
write_com(0x80+5);
break;
case 7:
write_com(0x80+13);
break;
case 8:
S1num=0;
TR0=1;
write_com(0x0c);
break;
}
}
}
if(S1num!=0)
{
if(K4==0)
{
delay(5);
while(!K4);
switch(S1num)
{
case 1:
miao++;
if(miao==60)miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+11);
break;
case 2:
fen++;
if(fen==60)fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+8);
break;
case 3:
shi++;
if(shi==24)shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+5);
break;
case 4:
day++;
switch(mon)
{
case 1:if(day==32)day=1;break;
case 3:if(day==32)day=1;break;
case 5:if(day==32)day=1;break;
case 7:if(day==32)day=1;break;
case 8:if(day==32)day=1;break;
case 10:if(day==32)day=1;break;
case 12:if(day==32)day=1;break;
case 4:if(day==31)day=1;break;
case 6:if(day==31)day=1;break;
case 9:if(day==31)day=1;break;
case 11:if(day==31)day=1;break;
case 2:x=20*100+year;
if((x%4==0 && x%100!=0) || x%400==0)
{
if(day==30)
{
day=1;break;
}

}
else if(day==29)
{
day=1;break;
}
}
write_ymd(10,day);
write_com(0x80+11);
break;
case 5:
mon++;
if(mon==13)mon=1;
write_ymd(7,mon);
write_com(0x80+8);
break;
case 6:
year++;
write_ymd(4,year);
write_com(0x80+5);
break;
case 7:
week++;
if(week==8)week=1;
write_week(week);
write_com(0x80+13);
break;
}
}
if(K6==0)
{
delay(5);
while(!K6);
switch(S1num)
{
case 1:
miao--;
if(miao==-1)miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+11);
break;
case 2:
fen--;
if(fen==-1)fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+8);
break;
case 3:
shi--;
if(shi==-1)shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+5);
break;
case 4:
day--;
switch(mon)
{
case 1:if(day==0)day=31;break;
case 3:if(day==0)day=31;break;
case 5:if(day==0)day=31;break;
case 7:if(day==0)day=31;break;
case 8:if(day==0)day=31;break;
case 10:if(day==0)day=31;break;
case 12:if(day==0)day=31;break;
case 4:if(day==0)day=30;break;
case 6:if(day==0)day=30;break;
case 9:if(day==0)day=30;break;
case 11:if(day==0)day=30;break;
case 2:x=20*100+year;
if((x%4==0 && x%100!=0) || x%400==0)
{
if(day==0)
{
day=29;break;
}

}
else if(day==0)
{
day=28;break;
}
}
write_ymd(10,day);
write_com(0x80+11);
break;
case 5:
mon--;
if(mon==0)mon=12;
write_ymd(7,mon);
write_com(0x80+8);
break;
case 6:
year--;
write_ymd(4,year);
write_com(0x80+5);
break;
case 7:
week--;
if(week==-1)week=7;
write_week(week);
write_com(0x80+13);
break;
}
}
}
}
void main()
{
init();
GND=0;

while(1)
{
keyscan();
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
day++;
week++;
switch(mon)
{
case 1:if(day==32)day=1;mon++;break;
case 3:if(day==32)day=1;mon++;break;
case 5:if(day==32)day=1;mon++;break;
case 7:if(day==32)day=1;mon++;break;
case 8:if(day==32)day=1;mon++;break;
case 10:if(day==32)day=1;mon++;break;
case 12:if(day==32)day=1;mon++;break;
case 4:if(day==31)day=1;mon++;break;
case 6:if(day==31)day=1;mon++;break;
case 9:if(day==31)day=1;mon++;break;
case 11:if(day==31)day=1;mon++;break;
case 2:x=20*100+year;
if((x%4==0 && x%100!=0) || x%400==0)
{
if(day==30)
{
day=1;mon++;break;
}

}
else if(day==29)
{
day=1;mon++;break;
}
}
if(mon==13)
{
mon=1;
year++;
write_ymd(4,year);
}
write_ymd(10,day);
write_com(0x80+13);
write_week(week);
write_ymd(7,mon);
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}

}

本文引用地址:http://butianyuan.cn/article/201612/324684.htm


評(píng)論


技術(shù)專區(qū)

關(guān)閉