51单片机lcd万年历Word文档格式.docx
- 文档编号:20975026
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:9
- 大小:45.19KB
51单片机lcd万年历Word文档格式.docx
《51单片机lcd万年历Word文档格式.docx》由会员分享,可在线阅读,更多相关《51单片机lcd万年历Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
//日期显示函数
voiddispt();
//时间显示函数
unsignedcharkeys();
//按键扫描函数
voidlcd_w_cmd(unsignedcharcom);
//写命令字函数
voidlcd_w_dat(unsignedchardat);
//写数据函数
unsignedcharlcd_r_start();
//读状态函数
voidint1();
//LCD初始化函数
voiddelay(unsignedchart);
//可控延时函数
voiddelay1();
//软件实现延时函数,5个机器周期
/*主函数*/
voidmain()
{
TMOD=0x01;
//设置为定时器模式1
TH0=0x3c;
//晶振6MHz,定时时间100ms
TL0=0xb0;
IE=0x82;
//开全局中断和定时中断
TR0=1;
//启动定时器
sec=0;
//秒
min=0;
//分
hour=0;
//时
week=0;
//星期
day=1;
//日
month=1;
//月
year=0;
//年
count=0;
//中断次数清0
n=-3;
//设置键按下次数,第一行日期
m=-3;
//设置键按下次数,第二行时间
P0=0xff;
//送全1到P0口
int1();
//初始化LCD
delay(255);
while
(1)
{
key=keys();
//读取按键
switch(key)
{
case0xe0:
//按下设置键
{
TR0=0;
k=1;
if(f==0)
n=n+3;
if(n==9)
n=0;
m=0;
f=1;
}
else
m=m+3;
if(m==12)
f=0;
if(f==0)
lcd_w_cmd(0x0d);
lcd_w_cmd(0x86+n);
lcd_w_cmd(0xc4+m);
}break;
case0xd0:
//按下确认键
k=0;
TR0=1;
n=-3;
m=-3;
case0xb0:
//按下加1键
if(k==1)
if(n==0){year++;
if(year==100)year=0;
}
elseif(n==3){month++;
if(month==13)month=1;
else{day++;
if(day==32)day=1;
}
dispd();
//调用第一行显示函数
//光标闪烁
//返回设置值显示地址
}
if(m==0){hour++;
if(hour==24)hour=0;
elseif(m==3){min++;
if(min==60)min=0;
elseif(m==6){sec++;
if(sec==60)sec=0;
else{week++;
if(week==7)week=0;
dispt();
//调用第二行显示函数
case0x70:
//按下减1键
if(n==0){year--;
if(year<
0)year=99;
elseif(n==3){month--;
if(month==0)month=12;
else{day--;
if(day==0)day=31;
if(m==0){hour--;
if(hour<
0)hour=23;
elseif(m==3){min--;
if(min<
0)min=59;
elseif(m==6){sec--;
if(sec<
0)sec=59;
else{week--;
if(week<
0)week=6;
}
if(k==0){dispd();
dispt();
}//调用LCD显示函数
/*延时函数*/
voiddelay(unsignedchart)
unsignedcharj,i;
for(i=0;
i<
t;
i++)
for(j=0;
j<
20;
j++);
/*延时函数1*/
voiddelay1()
{
_nop_();
/*LCD初始化函数*/
voidint1()
lcd_w_cmd(0x3c);
//设置工作方式
lcd_w_cmd(0x0c);
//设置光标
lcd_w_cmd(0x01);
//清屏
lcd_w_cmd(0x06);
//设置输入方式
lcd_w_cmd(0x80);
//设置初始显示位置
/*LCD读状态函数*/
//返回值:
返回状态字,最高位D7=0,LCD控制器空闲;
D7=1,LCD控制器忙
unsignedcharlcd_r_start()
unsignedchars;
RW=1;
//RW=1,RS=0,读LCD状态
delay1();
RS=0;
E=1;
//E端时序
s=P0;
//从LCD的数据口读状态
E=0;
RW=0;
return(s);
//返回读取的LCD状态字
/*LCD写命令函数*/
voidlcd_w_cmd(unsignedcharcom)
unsignedchari;
do{
//查LCD忙操作
i=lcd_r_start();
//调用读状态字函数
i=i&
0x80;
//与操作屏蔽掉低7位
delay
(2);
}while(i!
=0);
//LCD忙,继续查询,否则退出循环
RW=0;
delay1();
RS=0;
//RW=0,RS=0,写LCD命令字
E=1;
P0=com;
//将com中的命令字写入LCD数据口
E=0;
RW=1;
delay(255);
/*LCD写数据函数*/
voidlcd_w_dat(unsignedchardat)
//查忙操作
RS=1;
//RW=1,RS=0,写LCD数据
//E端时序
P0=dat;
//将dat中的显示数据写入LCD数据口
/*****定时中断函数*****/
voidtimer0()interrupt1
count++;
if(count==10)
count=0;
sec++;
if(sec==60)
sec=0;
min++;
if(min==60)
min=0;
hour++;
if(hour==24)
hour=0;
week++;
day++;
if(week==7)week=0;
if(day==29&
&
month==2&
year%4!
=0){day=1;
month++;
elseif(day==30&
year%4==0){day=1;
elseif(day==31&
(month==4||month==6||month==9||month==11)){day=1;
elseif(day==32&
(month==1||month==3||month==5||month==7||month==8||month==10||month==12)){day=1;
if(month==13)
month=1;
year++;
if(year==100)year=0;
/*按键扫描函数*/
unsignedcharkeys()
unsignedcharcod,del;
P3=0xf0;
cod=P3&
0xf0;
//读入P3口键值
if(cod!
=0xf0)
//先检测有无按键按下
delay(100);
//去抖
if(cod!
=0xf0)
{
cod=P3&
//读入键值
do
//等待键释放
P3=0xf0;
del=P3&
}while(del!
=0xf0);
return(cod);
//返回键值
return(0xf0);
//返回该值
/*第一行显示日期函数*/
voiddispd()
{
lcd_w_cmd(0x0c);
//设置光标不显示、不闪烁
delay(20);
lcd_w_cmd(0x83);
//第一行起始显示地址0x80+0x03
lcd_w_dat('
2'
);
delay
(2);
0'
lcd_w_dat(lcdd[year/10]);
lcd_w_dat(lcdd[year%10]);
-'
lcd_w_dat(lcdd[month/10]);
lcd_w_dat(lcdd[month%10]);
lcd_w_dat(lcdd[day/10]);
lcd_w_dat(lcdd[day%10]);
/*第二行显示时间、星期函数*/
voiddispt()
lcd_w_cmd(0xc3);
//第二行起始显示地址0x80+0x43
lcd_w_dat(lcdd[hour/10]);
lcd_w_dat(lcdd[hour%10]);
:
'
lcd_w_dat(lcdd[min/10]);
lcd_w_dat(lcdd[min%10]);
lcd_w_dat(lcdd[sec/10]);
lcd_w_dat(lcdd[sec%10]);
'
W'
lcd_w_dat(lcdd[week]);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 lcd 万年历
![提示](https://static.bdocx.com/images/bang_tan.gif)