89C52LCD1602的万年历程序Word格式文档下载.docx
- 文档编号:6509831
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:23
- 大小:18.40KB
89C52LCD1602的万年历程序Word格式文档下载.docx
《89C52LCD1602的万年历程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《89C52LCD1602的万年历程序Word格式文档下载.docx(23页珍藏版)》请在冰点文库上搜索。
ucharcodesecond_line[]="
12:
00:
00"
ucharcodeweek_data1[]="
Mon"
ucharcodeweek_data2[]="
Tue"
ucharcodeweek_data3[]="
Wen"
ucharcodeweek_data4[]="
Thu"
ucharcodeweek_data5[]="
Fri"
ucharcodeweek_data6[]="
Sat"
ucharcodeweek_data7[]="
Sun"
//延时子函数1ms延时
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
//液晶写指令子函数com即所需输入的指令码
voidlcd_write_com(ucharcom)
rs=0;
rw=0;
en=0;
P0=com;
delay(5);
en=1;
//液晶写数据子函数
voidlcd_write_data(ucharlcd_data)
rs=1;
P0=lcd_data;
//初始化子函数(包括:
液晶初始化操作和定时器0子函数操作)
voidinit()
ucharnum;
u1=0;
u2=0;
//关闭U1U2锁存器防止对P0口的影响
//给时间设置初值2014-03-23Sun12:
00
year=2014;
month=3;
day=23;
week=7;
hou=12;
min=00;
sec=0;
//液晶指令初始化
//将液晶en端拉低,为初始化写指令和数据准备
lcd_write_com(0x38);
//MODE
lcd_write_com(0x0c);
//DCB
lcd_write_com(0x06);
//NS
lcd_write_com(0x01);
//清屏
//液晶写初值
lcd_write_com(0x80);
//写第一行地址
for(num=0;
num<
16;
num++)
{
lcd_write_data(first_line[num]);
delay(5);
}
lcd_write_com(0x80+0x40);
//写第二行地址
lcd_write_data(second_line[num]);
//定时器初始化
TMOD=0x01;
//定时器0工作方式为1
TH0=(65535-50000)/256;
//装初值
TL0=(65535-50000)%256;
ET0=1;
//开定时器0中断
EA=1;
//开总中断
TR0=1;
//开始计时
//星期显示动态设置
voidwrite_week(ucharweek_num)
uchartemp,k;
temp=week_num;
if(temp==1)
for(k=0;
k<
3;
k++)
{
lcd_write_data(week_data1[k]);
delay(5);
}
if(temp==2)
lcd_write_data(week_data2[k]);
}
if(temp==3)
lcd_write_data(week_data3[k]);
if(temp==4)
lcd_write_data(week_data4[k]);
if(temp==5)
lcd_write_data(week_data5[k]);
if(temp==6)
lcd_write_data(week_data6[k]);
if(temp==7)
lcd_write_data(week_data7[k]);
}/*
switch(temp)
case1:
for(k=0;
{
lcd_write_data(week_data1[k]);
delay(5);
}
break;
case2:
lcd_write_data(week_data2[k]);
case3:
lcd_write_data(week_data3[k]);
case4:
lcd_write_data(week_data4[k]);
case5:
lcd_write_data(week_data5[k]);
case6:
lcd_write_data(week_data6[k]);
case7:
lcd_write_data(week_data7[k]);
}*/
//闰年判断的子函数
voidleapyear_choise(uints)
{
if(((s%4==0)&
&
(s%100!
=0))||(s%400==0))//四年一闰一百年不闰四百年一闰
y=1;
//能被某个数整除即对这个数求余(%),而非求模(/)
else
y=0;
//大小月份的判断
voidbig_month(ucharmon)
switch(mon)
case1:
m=1;
break;
case3:
case5:
case7:
case8:
case10:
case12:
case4:
m=0;
case6:
case9:
case11:
}
//液晶显示动态数据即时刷新显示数据
voiddata_refresh(ucharadd,ucharre_data)//add为需要刷新的位置地址ch_data为需要改变的数据
uchars0,s1;
//分别为各位的十进制数
s1=re_data/10;
s0=re_data%10;
lcd_write_com(0x80+add);
lcd_write_data(0x30+s1);
//高位刷新
lcd_write_data(0x30+s0);
//低位刷新
voidtime_key_set()
//功能键设定
//key_com=0;
if(key1==0)
//按键延时消抖
if(key1==0)
{
num++;
while(!
key1);
//松手检测
if(num==1)
TR0=0;
//当进入调时模式时关闭T0计时器,停止计时
lcd_write_com(0x80+0x40+10);
//设定需要调改的位置地址秒钟
lcd_write_com(0x0d);
//被选中的位光标闪烁
elseif(num==2)
lcd_write_com(0x80+0x40+7);
//分钟
elseif(num==3)
lcd_write_com(0x80+0x40+4);
//时钟
elseif(num==4)
lcd_write_com(0x80+13);
//星期
elseif(num==5)
lcd_write_com(0x80+9);
//日期
elseif(num==6)
lcd_write_com(0x80+6);
//月份
elseif(num==7)
lcd_write_com(0x80+3);
//年(低位)
elseif(num==8)
lcd_write_com(0x80+1);
//年(高位)
elseif(num==9)
sec=0;
num=0;
TR0=1;
//开启定时器
lcd_write_com(0x0c);
//取消闪烁
}
}
//加计数键设定
if(num!
=0)//只有在功能设定键起作用期间才可以调时除此之外该键将不起作用
if(key2==0)
delay(5);
if(key2==0)
while(!
key2);
//松手检测
if(num==1)
sec++;
if(sec==60)
sec=0;
data_refresh(0x40+10,sec);
//即使将更新的时间显示数据发送给液晶
lcd_write_com(0x80+0x40+10);
//选择需要更改的地址位
if(num==2)
min++;
if(min==60)
min=0;
data_refresh(0x40+7,min);
lcd_write_com(0x80+0x40+7);
if(num==3)
hou++;
if(hou==24)
hou=0;
data_refresh(0x40+4,hou);
lcd_write_com(0x80+0x40+4);
if(num==4)
week++;
if(week==8)
week=1;
write_week(week);
lcd_write_com(0x80+13);
if(num==5)
day++;
big_month(month);
//调用大小月判断子函数
if(m==1)
{
if(day==32)
day=1;
}
else
if(day==31)
if(month==2)
leapyear_choise(year);
//调用闰年判断子函数
if(y==1)
{
if(day==30)
day=1;
}
if(y==0)
if(day==29)
data_refresh(9,day);
lcd_write_com(0x80+9);
if(num==6)
month++;
if(month==13)
month=1;
data_refresh(6,month);
lcd_write_com(0x80+6);
if(num==7)
year++;
if(year==9999)
year=0;
data_refresh(3,year%100);
lcd_write_com(0x80+3);
if(num==8)
year=year+100;
if((year/100)>
99)
year=0;
data_refresh(1,year/100);
lcd_write_com(0x80+1);
}
if(key3==0)
if(key3==0)
//取消闪烁
}
//闹钟设定
voidclock()
bitflag;
if(key4==0)//闹钟开关键
if(key4==0)
flag=!
flag;
key4);
if(flag==1)
{
led=0;
if(min==0)
if(hou==0)
beep=0;
delay(1000);
beep=1;
if((hou>
0)&
(hou<
13))
if((sec>
(sec<
=hou))
beep=0;
delay(110);
beep=1;
delay(770);
12)&
=23))
=hou-12))
if(flag==0)
led=1;
//主函数
voidmain()
init();
while
(1)
time_key_set();
clock();
//定时器中断子函数
voidt0()interrupt1
time0++;
if(time0==20)
time0=0;
sec++;
if(sec==60)
sec=0;
min++;
if(min==60)
min=0;
hou++;
if(hou==24)
hou=0;
//注意这两行的顺序不能反过来
//注意这两行的顺序不能反过来
month++;
if(month==13)
{
month=1;
year++;
if(year==9999)
{
year=0;
}
data_refresh(1,year/100);
data_refresh(3,year%100);
}
data_refresh(6,month);
data_refresh(6,month);
month=3;
elseif(y==0)
data_refresh(0x40+4,hou);
data_refresh(0x40+7,min);
data_refresh(0x40+10,sec);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 89 C52LCD1602 万年历 程序