51单片机lcd万年历.docx
- 文档编号:7845463
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:9
- 大小:45.19KB
51单片机lcd万年历.docx
《51单片机lcd万年历.docx》由会员分享,可在线阅读,更多相关《51单片机lcd万年历.docx(9页珍藏版)》请在冰豆网上搜索。
51单片机lcd万年历
基于51单片机的LCD数字钟万年历
#include
#include
//定义控制信号端口
sbitRS=P2^4; //P2.4
sbitRW=P2^5; //P2.5
sbitE=P2^6; //P2.6
sbitset=P3^4; //设置键
sbitenter=P3^5;//确认键
sbitadd1=P3^6;//加1键
sbitsub1=P3^7;//减1键
bitk=0,f=0;//k为0表示运行状态,k为1表示设置状态;f为0表示第一行显示,f为1表示第二行显示
charsec,min,hour,week,day,month,year,n,m;
unsignedcharcount,key;
unsignedcharlcdd[]="0123456789";
/*声明调用函数*/
voiddispd();//日期显示函数
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)
{
m=0;
n=0;
f=0;
}
}
if(f==0)
{
lcd_w_cmd(0x0d);
lcd_w_cmd(0x86+n);
}
else
{
lcd_w_cmd(0x0d);
lcd_w_cmd(0xc4+m);
}
}break;
case0xd0:
//按下确认键
{
k=0;
TR0=1;
n=-3;
m=-3;
f=0;
}break;
case0xb0:
//按下加1键
{
if(k==1)
{
if(f==0)
{
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(); //调用第一行显示函数
lcd_w_cmd(0x0d);//光标闪烁
lcd_w_cmd(0x86+n);//返回设置值显示地址
}
else
{
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(); //调用第二行显示函数
lcd_w_cmd(0x0d);//光标闪烁
lcd_w_cmd(0xc4+m);//返回设置值显示地址
}
}
}break;
case0x70:
//按下减1键
{
if(k==1)
{
if(f==0)
{
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;}
dispd(); //调用第一行显示函数
lcd_w_cmd(0x0d);//光标闪烁
lcd_w_cmd(0x86+n);//返回设置值显示地址
}
else
{
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;}
dispt(); //调用第二行显示函数
lcd_w_cmd(0x0d);//光标闪烁
lcd_w_cmd(0xc4+m);//返回设置值显示地址
}
}
}break;
}
if(k==0){dispd();dispt();}//调用LCD显示函数
}
}
/*延时函数*/
voiddelay(unsignedchart)
{
unsignedcharj,i;
for(i=0;i for(j=0;j<20;j++); } /*延时函数1*/ voiddelay1() { _nop_(); _nop_(); _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; delay1(); E=1; //E端时序 delay1(); s=P0; //从LCD的数据口读状态 delay1(); E=0; delay1(); RW=0; delay1(); 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命令字 delay1(); E=1; //E端时序 delay1(); P0=com; //将com中的命令字写入LCD数据口 delay1(); E=0; delay1(); RW=1; delay(255); } /*LCD写数据函数*/ voidlcd_w_dat(unsignedchardat) { unsignedchari; do{ //查忙操作 i=lcd_r_start();//调用读状态字函数 i=i&0x80; //与操作屏蔽掉低7位 delay (2); }while(i! =0);//LCD忙,继续查询,否则退出循环 RW=0; delay1(); RS=1; //RW=1,RS=0,写LCD数据 delay1(); E=1; //E端时序 delay1(); P0=dat; //将dat中的显示数据写入LCD数据口 delay1(); E=0; delay1(); RW=1; delay(255); } /*****定时中断函数*****/ voidtimer0()interrupt1 { TH0=0x3c; TL0=0xb0; 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&&month==2&&year%4==0){day=1;month++;} elseif(day==31&&(month==4||month==6||month==9||month==11)){day=1;month++;} elseif(day==32&&(month==1||month==3||month==5||month==7||month==8||month==10||month==12)){day=1;month++;} 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&0xf0;//读入键值 do //等待键释放 { P3=0xf0; del=P3&0xf0; }while(del! =0xf0); return(cod);//返回键值 } } return(0xf0); //返回该值 } /*第一行显示日期函数*/ voiddispd() { lcd_w_cmd(0x0c);//设置光标不显示、不闪烁 delay(20); lcd_w_cmd(0x83);//第一行起始显示地址0x80+0x03 delay(20); lcd_w_dat('2'); delay (2); lcd_w_dat('0'); delay (2); lcd_w_dat(lcdd[year/10]); delay (2); lcd_w_dat(lcdd[year%10]); delay (2); lcd_w_dat('-'); delay (2); lcd_w_dat(lcdd[month/10]); delay (2); lcd_w_dat(lcdd[month%10]); delay (2); lcd_w_dat('-'); delay (2); lcd_w_dat(lcdd[day/10]); delay (2); lcd_w_dat(lcdd[day%10]); delay (2); } /*第二行显示时间、星期函数*/ voiddispt() { lcd_w_cmd(0x0c);//设置光标不显示、不闪烁 delay(20); lcd_w_cmd(0xc3);//第二行起始显示地址0x80+0x43 delay(20); lcd_w_dat(lcdd[hour/10]); delay (2); lcd_w_dat(lcdd[hour%10]); delay (2); lcd_w_dat(': '); delay (2); lcd_w_dat(lcdd[min/10]); delay (2); lcd_w_dat(lcdd[min%10]); delay (2); lcd_w_dat(': '); delay (2); lcd_w_dat(lcdd[sec/10]); delay (2); lcd_w_dat(lcdd[sec%10]); delay (2); lcd_w_dat(''); delay (2); lcd_w_dat('W'); delay (2); lcd_w_dat(lcdd[week]); delay (2); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 lcd 万年历