电子时钟程序.docx
《电子时钟程序.docx》由会员分享,可在线阅读,更多相关《电子时钟程序.docx(16页珍藏版)》请在冰豆网上搜索。
电子时钟程序
#include//lcd1602数字钟可调整时间和日期
#defineuintunsignedint
#defineucharunsignedchar
//lcd_data=P0
//位定义
sbitlcdrs=P2^2;
sbitlcdrw=P2^1;
sbitlcden=P2^0;
sbitk1=P3^3;//mod
sbitk2=P3^2;//+
sbitk3=P3^1;//-
//函数声明
uchari,t=0,k1num=0;//t为中断次数计数,k1num为k1按下的次数
uintyear=2014;//year年
charh=0,m=0,s=0,w=7,month=5,day=1;//h时,m分,s秒,w星期,year年,month月,day日
ucharcodetable1[]={"2014-05-01THU"};//日期
ucharcodetable2[]={"00:
00:
00"};//时间
//延时zms
voiddelay(ucharz)
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
lcdrw=0;
P0=com;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
//lcd写数据
voidwrite_dat(uchardat)
{
lcdrs=1;
lcdrw=0;
P0=dat;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
voidMonday(void)
{
write_com(0x80+12);
write_dat('M');
write_com(0x80+13);
write_dat('O');
write_com(0x80+14);
write_dat('N');
}
voidTuesday(void)
{
write_com(0x80+12);
write_dat('T');
write_com(0x80+13);
write_dat('U');
write_com(0x80+14);
write_dat('E');
}
voidWednesday(void)
{
write_com(0x80+12);
write_dat('W');
write_com(0x80+13);
write_dat('E');
write_com(0x80+14);
write_dat('D');
}
voidThursday(void)
{
write_com(0x80+12);
write_dat('T');
write_com(0x80+13);
write_dat('H');
write_com(0x80+14);
write_dat('U');
}
voidFriday(void)
{
write_com(0x80+12);
write_dat('F');
write_com(0x80+13);
write_dat('R');
write_com(0x80+14);
write_dat('I');
}
voidSaturday(void)
{
write_com(0x80+12);
write_dat('S');
write_com(0x80+13);
write_dat('A');
write_com(0x80+14);
write_dat('T');
}
voidSunday(void)
{
write_com(0x80+12);
write_dat('S');
write_com(0x80+13);
write_dat('U');
write_com(0x80+14);
write_dat('N');
}
voiddisplay_week(ucharweek)//星期显示
{
switch(week)
{
case1:
Monday();break;
case2:
Tuesday();break;
case3:
Wednesday();break;
case4:
Thursday();break;
case5:
Friday();break;
case6:
Saturday();break;
case7:
Sunday();break;
}
}
//lcd初始设置
voidinit(void)
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
TMOD=0x01;
ET0=1;
EA=1;
TH0=0x3c;TL0=0xb0;//50ms
TR0=1;
write_com(0x80);//第一行
for(i=0;i<15;i++)
{write_dat(table1[i]);delay(5);}
write_com(0x80+0x40);//第二行
for(i=0;i<11;i++)
{write_dat(table2[i]);delay(5);}
}
voiddisplay_time(ucharad,uchartime)//时间显示
{
uchara,b;
a=time/10;b=time%10;
write_com(0x80+0x40+ad);
write_dat(0x30+a);
write_com(0x80+0x40+1+ad);
write_dat(0x30+b);
}
voiddisplay_date(uintnian,charyue,charri)//日期显示
{
uinty1,y2,y3,y4;
chara,b,c,d;
y1=nian/1000;//千位
y2=nian%1000/100;//百位
y3=nian%1000%100/10;//十位
y4=nian%1000%100%10;//个位
a=yue/10;
b=yue%10;
c=ri/10;
d=ri%10;
write_com(0x80+1);
write_dat(0x30+y1);
write_com(0x80+2);
write_dat(0x30+y2);
write_com(0x80+3);
write_dat(0x30+y3);
write_com(0x80+4);
write_dat(0x30+y4);
write_com(0x80+6);
write_dat(0x30+a);
write_com(0x80+7);
write_dat(0x30+b);
write_com(0x80+9);
write_dat(0x30+c);
write_com(0x80+10);
write_dat(0x30+d);
}
voidkeyscan(void)//按键扫描
{
if(k1==0)
{
delay(10);
if(k1==0)
{
k1num++;TR0=0;t=0;
while(!
k1);
if(k1num==1)
{write_com(0x80+0x40+11);write_com(0x0f);}//s
if(k1num==2)
{write_com(0x80+0x40+8);}//m
if(k1num==3)
{write_com(0x80+0x40+5);}//h
if(k1num==4)
{write_com(0x80+14);}//week
if(k1num==5)
{write_com(0x80+10);}//day
if(k1num==6)
{write_com(0x80+7);}//month
if(k1num==7)
{write_com(0x80+4);}//year
if(k1num==8)
{k1num=0;write_com(0x0c);TR0=1;}
}
}
if(k1num!
=0)
{
if(k2==0)
{
delay(5);
if(k2==0)
{
while(!
k2);
if(k1num==1)
{
s++;
if(s==60)
s=0;
display_time(10,s);
}
if(k1num==2)
{
m++;
if(m==60)
m=0;
display_time(7,m);
}
if(k1num==3)
{
h++;
if(h==24)
h=0;
display_time(4,h);
}
if(k1num==4)
{
w++;
if(w==8)
w=1;
display_week(w);
}
if(k1num==5)
{
day++;
if(day==32)
day=1;
display_date(year,month,day);
}
if(k1num==6)
{
month++;
if(month==13)
month=1;
display_date(year,month,day);
}
if(k1num==7)
{
year++;
display_date(year,month,day);
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!
k3);
if(k1num==1)
{
s--;
if(s==-1)
s=59;
display_time(10,s);
}
if(k1num==2)
{
m--;
if(m==-1)
m=59;
display_time(7,m);
}
if(k1num==3)
{
h--;
if(h==-1)
h=23;
display_time(4,h);
}
if(k1num==4)
{
w--;
if(w==0)
w=7;
display_week(w);
}
if(k1num==5)
{
day--;
if(day==0)
day=31;
display_date(year,month,day);
}
if(k1num==6)
{
month--;
if(month==0)
month=12;
display_date(year,month,day);
}
if(k1num==7)
{
year--;
display_date(year,month,day);
}
}
}
}
display_date(year,month,day);
display_week(w);
display_time(10,s);
display_time(7,m);
display_time(4,h);
}
voidmain(void)//主函数
{
init();
while
(1)
{
keyscan();
}
}
voidtimer0()interrupt1//定时器T0中断函数
{
ucharleap(ucharyear)//判断是否闰年并返回二月份的天数
{//闰年返回29,平年返回28
year+=2000;
if(year%4==0)
{if(year%100==0)
{if(year%400==0)
return29;
elsereturn28;
}
elsereturn29;
}
elsereturn28;
}
ucharmon(ucharmonth)//计算并返回每个月的天数
{
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
return31;break;//1,3,5,7,8,10,12月每月31天
case4:
case6:
case9:
case11:
return30;break;//4,6,9,11月每月30天
case2:
returnleap(year);break;//返回二月份的天数
default:
break;
}
}
voidtime0()interrupt1
{
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
t++;
if(t==20)
{
t=0;
s++;
if(s==60)
{
s=0;
m++;
if(m==60)
{
m=0;
h++;
if(h==24)
{
h=0;
n=mon(month);
day++;
w++;
if(++day>n)
{
day=01;
month++;
if(month==13)
{
month=0;
year++;
}
write_sf(3,year);
write_com(0x80+3);
}
write_sf(6,month);
write_com(0x80+6);
}
write_sf(14,w);
write_com(0x80+14);
write_sf(9,day);
write_com(0x80+9);
}
write_sfm(4,h);
write_com(0x80+0x40+4);
}
write_sfm(7,m);
write_com(0x80+0x40+7);
}
write_sfm(10,s);
write_com(0x80+0x40+10);
}}