51单片机时钟

来源:互联网 发布:知乎什么是互联网数据 编辑:程序博客网 时间:2024/06/05 01:53
可以调时间,包括平年润年的情况



#include
#define uchar unsigned char

sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
sbit keyen=P2^0;
sbit keyfu=P2^1;
sbit keyjia=P2^2;
sbit keyjian=P2^3;

ucharyear=12,month=2,day=29,week=7;
char hour=23,min=59,sec=50;
uchar count,t,jud;
uchar wek[][3]={"  ","Mon","Tue","Wen","Thi","Fri","Sta","Sun"};

void delayms(int a)
{
int x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}

void write_com(uchar com)
{
rs=0;
rw=0;
en=0;
P0=com;
delayms(2);
en=1;
delayms(2);
en=0;
delayms(2);
}

void write_dat(uchar dat)
{
rs=1;
rw=0;
en=0;
P0=dat;
delayms(2);
en=1;
delayms(2);
en=0;
delayms(2);
}

void write_zfc(uchar *ch)
{
while(*ch!=0)
write_dat(*ch++);
}

void write_nyr(uchar add,uchardat)
{
uchar shi=dat/10,ge=dat;
write_com(0x80+add);
write_dat(0x30+shi);
write_dat(0x30+ge);
}

void write_sfm(uchar add,uchardat)
{
uchar shi=dat/10,ge=dat;
write_com(0x80+0x40+add);
write_dat(0x30+shi);
write_dat(0x30+ge);
}

void write_week(uchar dat)
{
write_com(0x80+13);
write_zfc(wek[dat]);
}

void init_1602()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+2);
write_zfc("20  -  ");
write_com(0x80+0x40+6);
write_zfc(": :");
write_nyr(4,year);
write_nyr(7,month);
write_nyr(10,day);
write_week(week);
write_sfm(4,hour);
write_sfm(7,min);
write_sfm(10,sec);
}

int is(uchar year)
{
int temp=20*100+year;
if((temp%4==0&&temp0!=0)||(temp@0==0))
return 1;
return 0;
}

void keyscan()
{
if(keyen==0)
{
jud=1;
delayms(20);
while(!keyen);
TR0=0;
if(t==0)
{
write_com(0x80+0x40+11);
write_com(0x0f);
}
if(t==1)
{
write_com(0x80+0x40+8);
write_com(0x0f);
}
if(t==2)
{
write_com(0x80+0x40+5);
write_com(0x0f);
}
if(t==3)
{
write_com(0x80+13);
write_com(0x0f);
}
if(t==4)
{
write_com(0x80+11);
write_com(0x0f);
}
if(t==5)
{
write_com(0x80+8);
write_com(0x0f);
}
if(t==6)
{
write_com(0x80+5);
write_com(0x0f);
}
t++;
if(t>6)
t=0;
}
if(keyfu==0)
{
delayms(20);
while(!keyfu);
TR0=1;
write_com(0x80+0x40+11);
write_com(0x0c);
jud=t=0;
}
if(jud==1&&keyjia==0)
{
delayms(20);
while(!keyjia);
if(t==1)
{
sec++;
if(sec>59)
sec=0;
write_sfm(10,sec);
write_com(0x80+0x40+11);
}
if(t==2)
{
min++;
if(min>59)
min=0;
write_sfm(7,min);
write_com(0x80+0x40+8);
}
if(t==3)
{
hour++;
if(hour>23)
hour=0;
write_sfm(4,hour);
write_com(0x80+0x40+5);
}
if(t==4)
{
week++;
if(week>7)
week=1;
write_week(week);
write_com(0x80+13);
}
if(t==5)
{
day++;
if(day>31)
day=1;
write_nyr(10,day);
write_com(0x80+11);
}
if(t==6)
{
month++;
if(month>12)
month=1;
write_nyr(7,month);
write_com(0x80+8);
}
if(t==0)
{
year++;
write_nyr(4,year);
write_com(0x80+5);
}
}
if(jud==1&&keyjian==0)
{
delayms(20);
while(!keyjian);
if(t==1)
{
sec--;
if(sec<0)
sec=59;
write_sfm(10,sec);
write_com(0x80+0x40+11);
}
if(t==2)
{
min--;
if(min<0)
min=59;
write_sfm(7,min);
write_com(0x80+0x40+8);
}
if(t==3)
{
hour--;
if(hour<0)
hour=23;
write_sfm(4,hour);
write_com(0x80+0x40+5);
}
if(t==4)
{
week--;
if(week<1)
week=7;
write_week(week);
write_com(0x80+13);
}
if(t==5)
{
day--;
if(day<1)
day=31;
write_nyr(10,day);
write_com(0x80+11);
}
if(t==6)
{
month--;
if(month<1)
month=12;
write_nyr(7,month);
write_com(0x80+8);
}
if(t==0)
{
year--;
write_nyr(4,year);
write_com(0x80+5);
}
}
}

void main()
{
t=jud=0;
init_1602();
TMOD=0X10;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
EA=1;
ET0=1;
TR0=1;
while(1)
{
keyscan();
if(count==200)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
day++;
week++;
if(week=8)
week=1;
if(is(year)==1)
{
switch(month)
{
case 1:case 3:case 5:case 7:case 8:case10:case 12:
if(day>31)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
case 4:case 6:case 9:case11:
if(day>30)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
default :
if(day>29)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
}
}
else
{
 switch(month)
{
case 1:case 3:case 5:case 7:case 8:case10:case 12:
if(day>31)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
case 4:case 6:case 9:case11:
if(day>30)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
default :
if(day>28)
{
day=1;
month++;
if(month>12)
{
month=1;
year++;
write_nyr(4,year);
}
write_nyr(7,month);
}break;
}
}
write_nyr(10,day);
write_week(week);
}
write_sfm(4,hour);
}
write_sfm(7,min);
}
write_sfm(10,sec);
}
}
}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
count++;
}
原创粉丝点击