程序,51单片机实现的液晶时钟万年历_第1页
程序,51单片机实现的液晶时钟万年历_第2页
程序,51单片机实现的液晶时钟万年历_第3页
程序,51单片机实现的液晶时钟万年历_第4页
程序,51单片机实现的液晶时钟万年历_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2010年10月26111,完成三个按键控制年月”时分的加减

2,完成时分年月日的进位转换,测试成功。(注意闰年二月的转换)

3,增加液晶调整提示。

4,增加星期换算,未成功(待完成)。

5,调整年份显示方法,只调整后2位,前2位固定,显示正确(偷懒做法)

#include<AT89X52.h>

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitCS=P00

sbitSCK=P(T2

sbitSID二P0」

charyear=l1;mon=12;day=31;hour=23,min=59,sec=56,yqian=0;/*时、分、秒

单元清零*/

charDATA7SEG[10]=〃0123456789〃;

charweek[7][7]={〃星期一〃,〃星期二〃,〃星期三〃,〃星期四〃,〃星期五〃,〃星期六〃,〃星期日

〃};

uchardeda=O,shan=O,wd=l,wp;/*5mS计数单元清零*/

ucharj=2,i=l;〃在此设定时间显示的位置

ucharrqh=l,rql=0;

uchars[7]={0};

bitd05s=0;1*0.5秒标志*/

ucharset=O,te=O;/*模式设定标志*/

ucharm=O;

ucharflag=O;ARAM掉电标志*/

voiddelay(uintk);/*延时?函数*/

voidconv();/*走时单元转换*/

voiddisp();

unsignedcharcodeACTABLE[]={

0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,

0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,

0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,

0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,

);

voidSendByte(unsignedcharDbyte)

unsignedchari;

for(i=0;i<8;i++)

(

SCK=0;

Dbyte=Dbyte«l;

SID=CY;

SCK=1;

SCK=0;

}

unsignedcharReceiveByte(void)

(

unsignedchari,tempi,temp2;

templ=temp2z:0;

for(i=0;i<8;i++)

(

templ=templ«l;

SCK=0;

SCK=1;

SCK=0;

if(SID)templ++;

)

for(i=0;i<8;i++)

(

temp2=temp2<<l;

SCK=0;

SCK=1;

SCK=0;

if(SID)temp2++;

}

return((OxfO&templ)+(0x0f&temp2));

}

voidCheckBusy(void)

(

doSendByte(Oxfc);//lllll,RW(1),RS(0),0

while(0x80&ReceiveByte());

}

voidWriteCommand(unsignedcharCbyte)

CS=1;

CheckBusy();

SendByte(0xf8);//lllll,RW(O),RS(0),0

SendByte(OxfO&Cbyte);

SendByte(0xf0&Cbyte«4);

CS=0;

)

voidWriteData(unsignedcharDbyte)

(

CS=1;

CheckBusy();

SendByte(Oxfa);//lllll,RW(0),RS(1),0

SendByte(OxfO&Dbyte);

SendByte(0xf0&Dbyte«4);

CS=0;

)

unsignedcharReadData(void)

(

CheckBusy();

SendByte(Oxfe);//lllll,RW(1),RS(1),0

returnReceiveByteO;

)

voiddelay(unsignedintMS)

(

unsignedcharus,usn;

while(MS!=0)//for12M

{USD=2;

while(usn!=0)

(

us=0xf5;

while(us!=0){us一;};

usn——;

)

MS—;

)

)

voidLcmlnit(void)

WriteCommand(0x30);〃基本动作指令

WriteCommand(0x03);〃光标归位

WriteCommand(OxOC);〃现实状态

WriteCommand(OxOl);〃清屏

WriteCommand(0x06);

)

voidLcmClearTXT(void)

(

unsignedchari;

WriteCommand(0x30);

WriteCommand(0x80);

for(i=0;i<64;i++)

WriteData(0x20);

)

voidPutStr(unsignedcharrow,unsignedcharcol,unsignedchar*puts)

(

WriteCommand(0x30);

WriteCommand(AC_TABLE[8*row+col]);

while(*puts!='\0')

(

if(col==8)

(

col=0;

row++;

)

if(row-4)row=0;

WriteCommand(ACTABLE[8*row+co1]);

WriteData(*puts);

puts++;

WriteData(*puts);

puts++;

col++;

)

)

/*------------------------走时?函数部分-----------------------*/

/*定时器TO5nls初始化*/

voidinit_timer0

(

TM0D=0x01;

TH0=-(4800/256);

TL0=-(4800%256);

IE=0x82;

TRO=1;

/*5mS定时中断服务?函数*/

voidT0_srv(void)interrupt1

(

THO-(4800/256);

TL0=-(4800%256);

deda++;

}

/*----------------------------------*/

/*时、分、秒单元及走时单元转换*/

voidconv()

{yqian=year+2000;

if(deda<=100)d05s=0;

elsed_05s=l;

if(deda>=200){sec++;deda=0;shan=^shan;}

if(sec=60){min++;sec=0;}

if(min==60){hour++;min=0;}

if(hour==24){hour=0;day++;}

if(mon==lI!mon==31|mon=5!;mon==7||mon==8,|mon==10:mon=二⑵

{if(day==32){mon++;day=l;}

)

elseif(mon==2){

if(yqian%100==0){

if(yqian%400=0){if(day==30){mon++;day=1;}}

elseif(day==29){mon++;day=l;}

else{

if(yqian%4==0){if(day==30){mon++;day=l;}}

elseif(day==29){mon++;day=l;}

elseif(day=31){mon++;day=l;}

if(mon==13){year++;mon=l;}

if(day!=wp){wd++;

if(wd>=7)wd=0;

wp二day;

}

/*-------------------------显示?函数部分------------------------*/

/*走时时间显示?函数*/

voiddispO

(

s[0]=DATA_7SEG[year/10];

s[l]=DATA_7SEG[year%10];

PutStr(rqh,rql+1,s);

s[0]=DATA7SEG[mon/10];

s[l]=DATA_7SEG[mon%10];

PutStr(rqh,rql+3,s);

s[0]=DATA_7SEG[day/10];

s[l]=DATA_7SEG[day%10];

PutStr(rqh,rql+5,s);

s[0]=DATA_7SEG[hour/10];

s[l]=DATA_7SEG[hour%10];

PutStr(j,i,s);

s[0]=DATA7SEG[min/10];

s[l]=DATA_7SEG[min%10];

PutStr(j,i+2,s);

s[0]=DATA_7SEG[sec/10];

s[l]=DATA.7SEG[sec%10];

PutStr(j,i+4,s);

PutStr(3,l,week[wd]);

}

/*----------------------调整时间?函数部分--------------------*/

/*调整走时时间*/

voidset_time()

{ucharm;

if(te==2){

if(P2_l==0)delay(1);

if(P2_l==0){hour++;

if(hour==24)hour=0;}

if(P2_0=0){hour—;

if(hour==-l)hour=23;}

for(m=0;m<30;m++)

(

dispO;

if(P2_2==0)P0_7=0;

elseP0_7=l;

delay(1);

PutStr(0,0,〃时〃);

)

)

if(te==l){

if(P2」=0)delay(1);

if(P2,1=0){min++;

if(min==60)min=0;}

if(P2_0=0){min—;

if(min==-l)min=59;}

for(m=0;m<30;m++)

(

dispO;

if(P2j==0)P07=0;

elseP0_7=l;

delay(1);

PutStr(0,0,〃分“);

)

)

if(te==3){

if(P2_l==0)delay(l);

if(P2l==0){year++;if(year=100)year=0;}

if(P2_0-0){year-;if(year==-1)year=99;}

for(m=0;m<30;m++)

(

dispO;

if(P2_2==0)P0_7=0;

elseP0_7=l;

delay(1);

PutStr(O,0,〃年〃);

)

}

if(te==4){

if(P2_l==0)delay(1);

if(P2_l==0){mon++;

if(mon==13)mon=l;}

if(P2_0=0){mon--;

if(mon==0)mon=12;}

for(m=0;m<30;m++)

(

dispO;

if(P2_2==0)P0_7=0;

elseP0_7=l;

delay(1);

PutStr(0,0,“月");

)

)

if(te==5){

if(P2」=0)delay(1);

if(P2,1=0){day++;

if(day==32)day=l;}

if(P2_0=0){day—;

if(day-0)day=31;}

for(m=0;m<30;m++)

(

dispO;

if(P2_2==0)P0_7=0;

elseP0_7=l;

delay(1);

PutStr(0,0,〃日〃);

/*------------------按键扫描、延时等?函数部分--------------------*/

/*走时时间程序?函数*/

voidtime()

(

conv();/*走时单元转换?函数*/

dispO;/*走时时间显示?函数*/

}

/*.*/

/*扫描按键?函数*/

voidscan_key()

(

delay⑴;

if(P2_2==0){set=l;te++;}

if(te>=6){set=0,te=O;PutStr(0,0,〃");}

if(te==l)flag=0x55;

F0:if(P2_2=0)gotoF0;/*按键未释放,在此等候*/

)

/*-------------------------------*/

/*延时?函数*/

/*--------------------------主函数------------------------------*/

/*主函数*/

voidmain()

{Lcmlnit();

LcmClearTXT();

PutStr(0,2,〃现在时间是〃);

PutStr(rqh,rql,,z20z,);

PutStr(rqh,rql+2,"年");

PutStr(rqh,rql+4,〃月〃);

PutStr(rqh,rql+6,〃日“);

PutStr(j,i+1,〃时〃);

PutStr(j,i+3,"分”);

PutStr(j,i+5,〃秒〃);

wp=day;

//PutStr(3,6,〃当前时间〃);

init_timer();/*定时器T0初始化*/

while(l)/*无限循环*/

if(P2_2==0)scan_key();/*有按键,调用按键扫描?函数*/

switch(set)/*根据set键值散转*/

case0:time();break;/*走时时间程序*/

case1:set_time();break;/*走时时间调整*/

default:break;/*其它退出*/

)

if(flag!=0x55)/*判断掉电标志*/

PO=OxcO;P2=0xc0;delay(100);

P2=0xff;delay(400);

)

)

)

2010年10月30日:改进为利用1602做万年历,调试成功

#include<at89x52.h>

#include<intrins.h>

#definenop_nop_()

#defineDBP0

#defineucharunsignedchar

#defineuintunsignedint

*****/

charyear=10;mon=10;day=30;hour=21,min=6,sec=56,yqian=0;/*时、分、秒

单元清零*/

char

//,,

DATA_7SEG[10]=0123456789)week[7][3]={"Mom","Tue","Wed","Thu","Fri","Sat","Sun"

};

uchardeda=0,shan=0,wd=l,wp;

ucharnl=2,nh=2,sl=4,sh=l;

uchars[7]={0};

bitd_05s=0;/*0.5秒标志*/

ucharset=0,te=0;/*模式设定标志*/

ucharUFO;

ucharflag=0;/*RAM掉电标志*/

voiddelay(uintk);/*延时?函数*/

voidconv();/*走时单元转换*/

voiddisp();

sbitE=P2c2;

sbitRW=P21;

sbitRS=P2P;

voidinit(void);

voidwrite_com(unsignedcharcommand);

voidwritedata(unsignedchardat);

voiddisp_char(unsignedcharx,unsignedchary,unsignedchardat);

voidcheckbusy(void);

voiddelay_n40us(unsignedintn);

voidinit(void)

(

write_com(0x38);

delayn40us(500);

write_com(0x38);

delayn40us(500);

write_com(0x38);

writecom(0x0c);

write_com(0x01);

write_com(0x0f);

write_com(0x06);

write_com(0x01);

delay_n40us(100);

)

voidwrite_com(unsignedcharcommand)

DB=command;

RS=O;

RW=O;

E=1;

nop;

E=0;

delay_n40us(l);

}

voidwrite_data(unsignedchardat)

(

DB=dat;

RS=1;

RW=0;

E=l;

nop;

E=0;

delay_n40us(l);

)

voiddisp_char(unsignedcharx,unsignedchary,unsignedchardat)

(

unsignedcharaddress;

if(y==l)address=0x80+x;

elseaddress=0xc0+x;

writecom(address);

write_data(dat);

)

voiddisp_s(unsignedcharx,unsignedchary,unsignedcharwd)

(

disp_char(x,y,week[wd][0]);

dispchar(x+1,y,week[wd][1]);

disp_char(x+2,y,week[wd][2]);

)

voidcheck_busy(void)

(

do

(

E=0;

RS=O;

RW=1;

DB=0xff;

E=l;

}while((DB&0x80)==0x80);

}

voiddelay_n40us(unsignedintn)

unsignedinti,j;

for(i=n;i>0;i--)

for(j=2;j>0;j-);

/*------------------------走时?函数部分-----------------------*/

/*定时器TO5ms初始化*/

voidinit_timer()

(

TM0D=0x01;

TH0=-(4800/256);

TL0=-(4800%256);

IE=0x82;

TRO=1;

)

/*----------------------------------*/

/*5mS定时中断服务?函数*/

voidTOsrv(void)interrupt1

(

TH0=-(4800/256);

TL0=-(4800%256);

deda++;

)

/*-----------------------------------*/

/*时、分、秒单元及走时单元转换*/

voidconv()

{yqian=year+2000;

if(deda<=100)d05s=0;

elsed_05s=l;

if(deda>=200){sec++;deda=0;shan="shan;}

if(sec==60){min++;sec=0;}

if(min==60){hour++;min=0;}

if(hour==24){hour=0;day++;}

if(mon==l|imon==31|mon==51mon==7||mon==8,|mon==10,mon==12)

{if(day==32){mon++;day=l;}

}

elseif(mon==2){

if(yqian%100==0){

if(yqian%400=0){if(day==30){mon++;day=l;}}

elseif(day==29){mon++;day=1;}

}

else{

if(yqian%4=0){if(day==30){mon++;day=l;}}

elseif(day==29){mon++;day=1;}

}

)

elseif(day==31){mon++;day=l;}

if(mon=13){year++;mon=l;}

if(day!=wp){wd++;

if(wd>=7)wd=0;

wp=day;

)

}

/*-------------------------显示?函数部分-----------------------*/

/*走时时间显示?函数*/

voiddisp()

(

s[0]=DATA7SEG[year/10];

s[l]=l)ATA_7SEG[year%10];

dispchar(nl,nh,s[0]);

disp_char(nl+1,nh,s[l]);

s[0]=DATA_7SEG[mon/10];

s[l]=DATA_7SEG[mon%10];

disp_char(nl+3,nh,s[0]);

disp_char(nl+4,nh,s[l]);

s[0]=DATA_7SEG[day/10];

s[l]=DATA_7SEG[day%10];

disp_char(nl+6,nh,s[0]);

disp_char(nl+7,nh,s[l]);

s[0]=DATA_7SEG[hour/10];

s[l]=DATA_7SEG[hour%10];

disp_char(si,sh,s[0]);

disp_char(sl+1,sh,s[l]);

s[0]=DATA_7SEG[min/10];

s[l]=DATA_7SEG[min%10];

disp_char(sl+3,sh,s[0]);

disp_char(sl+4,sh,s[l]);

s[0]=DATA_7SEG[sec/10];

s[l]=DATA_7SEG[sec%10];

disp_char(sl+6,sh,s[0]);

disp_char(sl+7,sh,s[l]);

]*******************火***夕)z^j*****************************************/

if(d_05s){

disp_char(sl+2,sh,';

dispchar(sl+5,sh,'/);

)

else{

disp_char(sl+2,sh,'');

dispchar(sl+5,sh,'');

)八

disp_s(13,2,wd);

/*-----------------------调整时间?函数部分--------------------*/

/*调整走时时间*/

voidset_time()

{ucharm;

if(te==2){

if(P3_l==0)delay(1);

if(P3_l==0){hour++;

if(hour==24)hour=0;}

if(P3_0==0){hour--;

if(hour==-l)hour=23;}

for(m=0;m<30;m++)

(

dispO;

if(P3_2==0)P0_7=0;

elseP0_7=l;

delay(1);

}

)

if(te==l){

if(P3_l=0)delay(1);

if(P3_l==0){min++;

if(min==60)min=0;}

if(P3_0==0){min—;

if(min==-l)min=:59;}

for(m=0;m<30;m++)

(

dispO;

if(P3_2==0)P07=0;

elseP0_7=l;

delay(1);

if(te==3){

if(P3_l==0)delay(l);

if(P3l==0){year++;if(year=100)year=0;}

if(P3_0==0){year-;if(year==-1)year=99;}

for(m=0;m<30;m++)

(

dispO;

if(P3_2=0)P0_7=0;

elseP0_7=l;

delay(1);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论