基于51单片机定时器的1602液晶显示器时钟显示(带年月日)
更新时间:2023-10-13 13:39:01 阅读量: 综合文库 文档下载
#include
#define uchar unsigned char #define uint unsigned int
uchar a,count,S1num,xqnum; char yue,ri,shi,fen,miao; int nian;
sbit lcdrs=P2^5; sbit lcdrw=P2^4; sbit lcden=P2^3;
sbit S1=P3^0; //定义键——进入设置 sbit S2=P3^1; //定义键——增大 sbit S3=P3^2; //定义键——减小 sbit S4=P3^3; //定义键——退出设置
uchar code table0[]=%uchar code table1[]=\
uchar code xingqi[][3]={\
void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
/************************************************** 1602液晶显示器模块 sbit lcdrs=P2^5; sbit lcdrw=P2^4; sbit lcden=P2^3;
*************************************************/ void write_com(uchar com) //液晶写指令 { lcdrw=0; lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; }
void write_data(uchar dat) //液晶写数据 { lcdrw=0; lcdrs=1; P0=dat; delay(5); lcden=1; delay(5); lcden=0; }
/******************************************** 年月日写入1602函数
********************************************/ void write_sfm(uchar add,uchar dat) //写时分秒函数 { uchar shi,ge; shi=dat/10; ge=dat; write_com(0x80+0x40+add); write_data(0x30+shi); write_data(0x30+ge); }
void write_yr(uchar add,uchar dat) //写月日函数 { uchar shi,ge; shi=dat/10; ge=dat; write_com(0x80+add); write_data(0x30+shi); write_data(0x30+ge); }
void write_nian(uchar add,uint dat) //写年函数 { uint qian,bai,shi,ge; qian=dat/1000; bai=dat00/100; shi=dat0/10; ge=dat; write_com(0x80+add); write_data(0x30+qian); write_data(0x30+bai); write_data(0x30+shi); write_data(0x30+ge);
}
/*************************************************** 初始化
***************************************************/ void init_lcd() //液晶初始化 { lcden=0; nian=2014; yue=8; ri=13; shi=0; fen=0; miao=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); }
void init() { init_lcd(); write_com(0x80); for(a=0;a<14;a++) { write_data(table0[a]); delay(5); } write_com(0x80+0x40); for(a=0;a<8;a++) { write_data(table1[a]); delay(5); } write_nian(0,nian); write_sfm(6,miao); write_sfm(3,fen); write_sfm(0,shi); count=0; xqnum=0;
//初始shi、fen、miao //设置16x2显示,5x7点阵,8位数据口 //设置开显示,不显示光标 //写一个字符后地址指针加1 //显示清0,数据指针清0 //初始化函数 //液晶初始化 //设置显示初始坐标 //显示年月日初始值 //设置显示初始坐标 //显示时分秒初始值 //分别将shi、fen、miao送去液晶显示 S1num=0; //初始化全局变量count TMOD=0x01; //设置定时器0工作模式1 TH0=(65535-50000)/256; //定时器装初始值 TL0=(65535-50000)%6; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0 }
/************************************************** 独立键盘 sbit S1=P3^0; //定义键——进入设置 sbit S2=P3^1; //定义键——增大 sbit S3=P3^2; //定义键——减小 sbit S4=P3^3; //定义键——退出设置 独立键盘已接地
*************************************************/ void keyscan() { if(S1==0) { delay(5); //确认定义键被按下 if(S1==0) { S1num++; //定义键S1按下次数记录 while(!S1); //释放按键确认 if(S1num==1) //S1按下一次时 { TR0=0; //关闭定时器 write_com(0xc0+7); //光标定位到秒位置 write_com(0x0f); //光标闪烁 } if(S1num==2) //S1按下两次时 { write_com(0xc0+4); //光标定位到分位置 } if(S1num==3) //S1按下三次时 { write_com(0xc0+1); //光标定位到时位置 } if(S1num==4) //S1按下四次时 { write_com(0x80+13); //光标定位到星期位置 }
if(S1num==5) //S1按下五次时 { write_com(0x80+9); //光标定位到日位置 } if(S1num==6) //S1按下六次时 { write_com(0x80+6); //光标定位到月位置 } if(S1num==7) //S1按下七次时 { write_com(0x80+3); //光标定位到年位置 } if(S1num==8) //S1按下八次时 { S1num=0; //S1记录按键次数清零 TR0=1; //开启定时器 write_com(0x0c); //取消光标闪烁 } } }
if(S1num!=0) //只有定义键按下后S2、S3、S4才有效 { if(S2==0) { delay(5); //防抖 if(S2==0) //确认按键被按下 { while(!S2); //释放按键确认 if(S1num==1) //S1按下一次时 { miao++; //调整秒加1 if(miao==60) //满60清零 miao=0; write_sfm(6,miao); //每调节一次送液晶显示一次 write_com(0x80+0x40+6); //显示位置重新回到调节处 } if(S1num==2) //S1按下两次时 { fen++; //调整分加1 if(fen==60) fen=0; write_sfm(3,fen); write_com(0x80+0x40+3); }
if(S1num==3) //S1按下三次时 { shi++; //调整时加1 if(shi==24) shi=0; write_com(0x80+0x40); write_sfm(0,shi); }
if(S1num==4) //星期加调整 { xqnum++; if(xqnum==7) xqnum=0; write_com(0x80+0x0b); for(a=0;a<3;a++) { write_data(xingqi[xqnum][a]); delay(5); } }
if(S1num==5) { ri++; if(yue==2) { if(nian@0==0) { if(ri==30) { ri=1; } } if(nian@0!=0) { if(ri==29) { ri=1; } } } else if(yue<=7) { if(yue%2==0&yue!=2) {
//日加调整 if(ri==31) { ri=1; } } else if(yue%2!=0&yue!=2) { if(ri==32) { ri=1; } } } else if(yue>=8) { if(yue%2==0) { if(ri==32) { ri=1; } } else if(yue%2!=0) { if(ri==31) { ri=1; } } } write_yr(8,ri); }
if(S1num==6) { yue++; if(yue==13) yue=1; write_yr(5,yue); } if(S1num==7) { nian++; if(nian==2019) nian=2014;
//月加调整 //年加调整 write_nian(0,nian); } } }
if(S3==0) { delay(5); if(S3==0) //确认按键被按下 { while(!S3); if(S1num==1) { miao--; //调整秒减1 if(miao==-1) //减到00后再减重新设置为59 miao=59; write_sfm(6,miao); write_com(0x80+0x40+6); } if(S1num==2) { fen--; //调整分减1 if(fen==-1) fen=59; write_sfm(3,fen); write_com(0x80+0x40+3); } if(S1num==3) { shi--; //调整时减1 if(shi==-1) shi=23; write_sfm(0,shi); write_com(0x80+0x40); } if(S1num==4) { xqnum--; //调整星期减一 if(xqnum==-1) xqnum=6; write_com(0x80+0x0b); for(a=0;a<3;a++) { write_data(xingqi[xqnum][a]); delay(5);
} }
if(S1num==5) //调整日 { ri--; if(yue==2) { if(nian@0==0) { if(ri==0) { ri=29; } } if(nian@0!=0) { if(ri==0) { ri=28; } } } else if(yue<=7) { if(yue%2==0&yue!=2) { if(ri==0) { ri=30; } } else if(yue%2!=0&yue!=2) { if(ri==0) { ri=31; } } } else if(yue>=8) { if(yue%2==0) { if(ri==0)
{ ri=31; } } else if(yue%2!=0) { if(ri==0) { ri=30; } } } write_yr(8,ri); } if(S1num==6) //调整月 { yue--; if(yue==0) yue=12; write_yr(5,yue); } if(S1num==7) //调整年 { nian--; if(nian==2013) nian=2018; write_nian(0,nian); } } } if(S4==0) //退出设置、开启中断 { delay(5); if(S4==0) { S1num=0; TR0=1; write_com(0x0c); } } } }
/**************************************************
正在阅读:
基于51单片机定时器的1602液晶显示器时钟显示(带年月日)10-13
2006年中国银行业IT需求分析04-23
青春,在党旗下闪光06-01
做香囊作文500字06-21
广东基层医院将实行全员竞聘上岗07-28
田园风光作文400字07-16
黄梅县联社房屋按揭贷款按揭贷款业务操作手册(完整版) - 图文03-04
注塑机操作指导书 - 图文01-22
北师大版二年级数学下册第二单元教案01-23
郑州大学实验室危险化学品废物处理实施办法11-12
- 企业安全培训试题题库
- 《WEB应用开发》复习题
- 2018届河南省新乡市高三第三次模拟测试英语试题Word版含答案
- 山东省建设工程优质结构评审标准(试行)
- 2016-2022年中国MEMS行业分析及发展趋势预测报告 - 图文
- 工程材料习题和练习 - 图文
- 2013--2014年小学六年级数学毕业水平检测卷及答案
- 江苏省2017-2018学年高考模拟历史试题分解(现代世界经济) Word版
- 移动通信实验指导书
- 2017-2018年最新审定新人教版六年级语文新人教版小学语文六年级
- 会展案例分析教案
- 数据库复习题
- 情智作文之学会选材
- 高一年级十月月考地理试题
- 河南省教育科学“十三五”规划2018年度一般课题立项名单
- 大学生宿舍文化现象调查与分析
- 山东省潍坊市2010届高三第二次模拟考试 理综 Word版
- 风险管理简答题
- 大连广播电视大学
- 民航安全管理经典论文
- 定时器
- 单片机
- 时钟
- 年月日
- 显示器
- 液晶
- 基于
- 显示
- 1602