基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc

上传人:wj 文档编号:143194 上传时间:2023-04-28 格式:DOC 页数:13 大小:74KB
下载 相关 举报
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第1页
第1页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第2页
第2页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第3页
第3页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第4页
第4页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第5页
第5页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第6页
第6页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第7页
第7页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第8页
第8页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第9页
第9页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第10页
第10页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第11页
第11页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第12页
第12页 / 共13页
基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc

《基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc》由会员分享,可在线阅读,更多相关《基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc(13页珍藏版)》请在冰点文库上搜索。

基于51单片机定时器的1602液晶显示器时钟显示(带年月日).doc

#include

#defineucharunsignedchar

#defineuintunsignedint

uchara,count,S1num,xqnum;

charyue,ri,shi,fen,miao;

intnian;

sbitlcdrs=P2^5;

sbitlcdrw=P2^4;

sbitlcden=P2^3;

sbitS1=P3^0; //定义键——进入设置

sbitS2=P3^1; //定义键——增大

sbitS3=P3^2; //定义键——减小

sbitS4=P3^3; //定义键——退出设置

ucharcodetable0[]="2014-08-13WED";

ucharcodetable1[]="00:

00:

00";

ucharcodexingqi[][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

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

1602液晶显示器模块

sbitlcdrs=P2^5;

sbitlcdrw=P2^4;

sbitlcden=P2^3;

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

voidwrite_com(ucharcom) //液晶写指令

{

lcdrw=0;

lcdrs=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

voidwrite_data(uchardat) //液晶写数据

{

lcdrw=0;

lcdrs=1;

P0=dat;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

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

年月日写入1602函数

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

voidwrite_sfm(ucharadd,uchardat) //写时分秒函数

{

ucharshi,ge;

shi=dat/10;

ge=dat%10;

write_com(0x80+0x40+add);

write_data(0x30+shi);

write_data(0x30+ge);

}

voidwrite_yr(ucharadd,uchardat) //写月日函数

{

ucharshi,ge;

shi=dat/10;

ge=dat%10;

write_com(0x80+add);

write_data(0x30+shi);

write_data(0x30+ge);

}

voidwrite_nian(ucharadd,uintdat) //写年函数

{

uintqian,bai,shi,ge;

qian=dat/1000;

bai=dat%1000/100;

shi=dat%100/10;

ge=dat%10;

write_com(0x80+add);

write_data(0x30+qian);

write_data(0x30+bai);

write_data(0x30+shi);

write_data(0x30+ge);

}

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

初始化

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

voidinit_lcd() //液晶初始化

{

lcden=0;

nian=2014;

yue=8;

ri=13;

shi=0; //初始shi、fen、miao

fen=0;

miao=0;

write_com(0x38); //设置16x2显示,5x7点阵,8位数据口

write_com(0x0c); //设置开显示,不显示光标

write_com(0x06); //写一个字符后地址指针加1

write_com(0x01); //显示清0,数据指针清0

}

voidinit() //初始化函数

{

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); //分别将shi、fen、miao送去液晶显示

write_sfm(3,fen);

write_sfm(0,shi);

count=0;

xqnum=0;

S1num=0; //初始化全局变量count

TMOD=0x01; //设置定时器0工作模式1

TH0=(65535-50000)/256; //定时器装初始值

TL0=(65535-50000)%256;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时器0

}

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

独立键盘

sbitS1=P3^0; //定义键——进入设置

sbitS2=P3^1; //定义键——增大

sbitS3=P3^2; //定义键——减小

sbitS4=P3^3; //定义键——退出设置

独立键盘已接地

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

voidkeyscan()

{

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%400==0)

{

if(ri==30)

{

ri=1;

}

}

if(nian%400!

=0)

{

if(ri==29)

{

ri=1;

}

}

}

elseif(yue<=7)

{

if(yue%2==0&yue!

=2)

{

if(ri==31)

{

ri=1;

}

}

elseif(yue%2!

=0&yue!

=2)

{

if(ri==32)

{

ri=1;

}

}

}

elseif(yue>=8)

{

if(yue%2==0)

{

if(ri==32)

{

ri=1;

}

}

elseif(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%400==0)

{

if(ri==0)

{

ri=29;

}

}

if(nian%400!

=0)

{

if(ri==0)

{

ri=28;

}

}

}

elseif(yue<=7)

{

if(yue%2==0&yue!

=2)

{

if(ri==0)

{

ri=30;

}

}

elseif(yue%2!

=0&yue!

=2)

{

if(ri==0)

{

ri=31;

}

}

}

elseif(yue>=8)

{

if(yue%2==0)

{

if(ri==0)

{

ri=31;

}

}

elseif(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);

}

}

}

}

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

定时器0

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

voidtimer0()interrupt1 //定时器0中断服务程序

{

TH0=(65535-50000)/256; //重装定时器初始值

TL0=(65535-50000)%256;

count++; //中断次数累加

if(count==20) //20次50毫秒即一秒

{

count=0;

miao++;

if(miao==60) //秒加到60时分进位

{

miao=0;

fen++;

if(fen==60) //分加到60时时进位

{

fen=0;

shi++;

if(shi==24) //时加到24时清0

{

shi=0;

xqnum++;

ri++;

if(yue==2) //如果是二月

{

if(nian%400==0) //闰年判断

{

if(ri==30)

{

ri=1;

yue++;

write_yr(5,yue);

}

}

if(nian%400!

=0) //平年判断

{

if(ri==29)

{

ri=1;

yue++;

write_yr(5,yue);

}

}

}

elseif(yue<=7&yue!

=2) //一月到七月

{

if(yue%2==0) //偶数月(除二月)

{

if(ri==31)

{

ri=1;

yue++;

}

}

elseif(yue%2!

=0) //奇数月

{

if(ri==32)

{

ri=1;

yue++;

}

}

write_yr(5,yue);

}

elseif(yue>=8) //八月到12月

{

if(yue%2==0) //偶数月(除二月)

{

if(ri==32)

{

ri=1;

yue++;

if(yue==13) //如果判断月份为12月,则加一后重新定义月份为1

{

yue=1;

nian++;

write_nian(0,nian);

}

write_yr(5,yue);

}

}

elseif(yue%2!

=0) //奇数月

{

if(ri==31)

{

ri=1;

yue++;

write_yr(5,yue);

}

}

}

write_yr(8,ri);

if(xqnum==7) //星期写入

xqnum=0;

write_com(0x80+0x0b);

for(a=0;a<3;a++)

{

write_data(xingqi[xqnum][a]);

delay(5);

}

}

write_sfm(0,shi); //重新写入数据

}

write_sfm(3,fen); //重新写入数据

}

write_sfm(6,miao); //重新写入数据

}

}

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

主函数

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

voidmain()

{

init();

while

(1)

{

keyscan(); //不停的检测按键是否被按下

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2