基于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); } } } }

/**************************************************

本文来源:https://www.bwwdw.com/article/s54f.html

Top