用定时器设计时钟并在1602液晶上显示Word文档格式.docx
《用定时器设计时钟并在1602液晶上显示Word文档格式.docx》由会员分享,可在线阅读,更多相关《用定时器设计时钟并在1602液晶上显示Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
![用定时器设计时钟并在1602液晶上显示Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/11/774fa2a5-136c-41fd-b0ae-ac1758fbf544/774fa2a5-136c-41fd-b0ae-ac1758fbf5441.gif)
/*****延时1ms*****/
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
/**********
1602初始化
**********/
voidwrite_com(ucharcom)//写命令
lcdrs=0;
P0=com;
delay(5);
lcden=1;
lcden=0;
voidwrite_data(uchardate)//写数据
lcdrs=1;
P0=date;
voidinit_1602()//初始化
//lcdwr=0;
dula=0;
//关断选、位选
wela=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x04);
write_data('
:
'
);
write_com(0x80+0x07);
write_com(0x80+0x40);
for(i=0;
i<
4;
i++)
write_data(table[i]);
write_com(0x80+0x44);
.'
write_com(0x80+0x47);
/************
1602显示时间
************/
voidwrite_sfm()//显示时分秒
write_com(0x80+0x02);
write_data(0x30+shi/10);
write_com(0x80+0x03);
write_data(0x30+shi%10);
write_com(0x80+0x05);
write_data(0x30+fen/10);
write_com(0x80+0x06);
write_data(0x30+fen%10);
write_com(0x80+0x08);
write_data(0x30+miao/10);
write_com(0x80+0x09);
write_data(0x30+miao%10);
/*****当显示小时的数小于13,显示AM*****/
if(shi<
13)
{
write_com(0x80+0x0c);
write_data('
A'
write_com(0x80+0x0d);
M'
}
/*****显示PM*****/
if(shi>
12)
P'
}
/*显示月日*/
write_com(0x80+0x45);
write_data(0x30+yue/10);
write_com(0x80+0x46);
write_data(0x30+yue%10);
write_com(0x80+0x48);
write_data(0x30+ri/10);
write_com(0x80+0x49);
write_data(0x30+ri%10);
/*显示星期*/
write_com(0x80+0x4c);
write_data(table1[q][0]);
write_com(0x80+0x4d);
write_data(table1[q][1]);
write_com(0x80+0x4e);
write_data(table1[q][2]);
write_com(0x80+0x4f);
write_data(table1[q][3]);
voidwrite_sfm1()
write_data(0x30+shi1/10);
write_data(0x30+shi1%10);
write_data(0x30+fen1/10);
write_data(0x30+fen1%10);
write_data(0x30+miao1/10);
write_data(0x30+miao1%10);
/*************
定时器计时
*************/
voidinit_time0()
TMOD=0x02;
//定时器0的工作方式2,避免了软件重装初值所带来的时间误差
TH0=6;
TR0=6;
EA=1;
ET0=1;
TR0=1;
/***************
分解独立键盘扫描
***************/
voidkeyscanf()
if(s1==0)//当按键1按下,开始进入设置时间状态,
delay(5);
if(s1==0)
{
num++;
if(num==1)//按下的次数决定光标的位置,即为要修改的地方
{
TR0=0;
//关闭定时器(当设置下面的闹钟时不用关定时器)
write_com(0x80+0x09);
write_com(0x0f);
//光标显示并闪烁
}
if(num==2)
write_com(0x80+0x08);
if(num==3)
write_com(0x80+0x06);
if(num==4)
write_com(0x80+0x05);
if(num==5)
write_com(0x80+0x03);
if(num==6)
write_com(0x80+0x02);
if(num==7)
write_com(0x80+0x49);
if(num==8)
write_com(0x80+0x48);
if(num==9)
write_com(0x80+0x46);
if(num==10)
write_com(0x80+0x45);
if(num==11)
write_com(0x80+0x4c);
if(num==12)
num=0;
//按下第12次跳出调时间状态
TR0=1;
//打开定时器
write_com(0x0c);
while(!
s1);
//等待按键释放
}
/*****按下s2和s3分别增大和减小数值*****/
if(num!
=0)//这里不能写成“if(s1==0)”,否则当s2按下后数字不会自加
if(s2==0)
delay(5);
if(s2==0)
switch(num)
{
case1:
miao++;
if(miao==60)
miao=0;
write_sfm();
break;
case3:
fen++;
if(fen==60)
fen=0;
write_sfm();
case5:
shi++;
if(shi==24)
shi=0;
case7:
ri++;
q++;
if(ri==30)
ri=1;
if(q==7)
q=0;
case9:
yue++;
if(yue==12)
yue=1;
case11:
q++;
}
while(!
s2);
=0)
if(s3==0)//减小数值
if(s3==0)
miao--;
if(miao==0)
miao=60;
fen--;
if(fen==0)
fen=60;
shi--;
if(shi==0)
shi=24;
ri--;
if(ri==1)
ri=30;
yue--;
if(yue==1)
yue=12;
q--;
//表示星期,q的值用于选择数组的值
if(q==0)
q=7;
}
s3);
/*闹钟功能*/
if(s4==0)//进入调闹钟功能,调闹钟功能时不用关定时器
if(s4==0)
temp=1;
num1++;
if(num1==1)//用于选择调的位置
if(num1==2)
if(num1==3)
if(num1==4)
if(num1==5)
if(num1==6)
if(num1==7)
num1=0;
temp=0;
s4);
if(num1!
=0)
if(s2==0)
switch(num1)
miao1++;
if(miao1==60)
miao1=0;
write_sfm1();
fen1++;
if(fen1==60)
fen1=0;
write_sfm1();
shi1++;
if(shi1==24)
shi1=0;
if(s3==0)
miao1--;
if(miao1==0)
miao1=60;
fen1--;
if(fen1==0)
fen1=60;
shi1--;
if(shi1==0)
shi1=24;
}
}
/*******
主函数
*******/
voidmain()
rd=0;
init_1602();
init_time0();
while
(1)
keyscanf();
if(temp==0)//temp为标志,为0时显示调时间的状态,为1时显示调闹钟状态
write_sfm();
else
write_sfm1();
if(shi==shi1&
&
fen==fen1&
miao==miao1)//当设置的闹钟时间和当前显示的时间吻合,led做出反应
for(i=0;
10;
for(j=0;
j<
50;
j++)
P1=0xfd;
delay(5);
P1=0xff;
write_sfm();
}
/***********
中断函数
***********/
voidt0()interrupt1
a++;
if(a==4000)//当a=4000,1秒
a=0;
miao++;
if(miao==60)
miao=0;
fen++;
if(fen==60)
fen=0;
shi++;
if(shi==24)
shi=0;
ri++;
q++;
if(q==7)
q=0;
if(ri==30)
{
ri=1;
yue++;
if(yue==12)
yue=1;
}
}