程序,51單片機實現(xiàn)的液晶時鐘萬年歷_第1頁
程序,51單片機實現(xiàn)的液晶時鐘萬年歷_第2頁
程序,51單片機實現(xiàn)的液晶時鐘萬年歷_第3頁
程序,51單片機實現(xiàn)的液晶時鐘萬年歷_第4頁
程序,51單片機實現(xiàn)的液晶時鐘萬年歷_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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計數(shù)單元清零*/

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);/*延時?函數(shù)*/

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);〃現(xiàn)實狀態(tài)

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++;

)

)

/*------------------------走時?函數(shù)部分-----------------------*/

/*定時器TO5nls初始化*/

voidinit_timer0

(

TM0D=0x01;

TH0=-(4800/256);

TL0=-(4800%256);

IE=0x82;

TRO=1;

/*5mS定時中斷服務?函數(shù)*/

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;

}

/*-------------------------顯示?函數(shù)部分------------------------*/

/*走時時間顯示?函數(shù)*/

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]);

}

/*----------------------調整時間?函數(shù)部分--------------------*/

/*調整走時時間*/

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,〃日〃);

/*------------------按鍵掃描、延時等?函數(shù)部分--------------------*/

/*走時時間程序?函數(shù)*/

voidtime()

(

conv();/*走時單元轉換?函數(shù)*/

dispO;/*走時時間顯示?函數(shù)*/

}

/*.*/

/*掃描按鍵?函數(shù)*/

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;/*按鍵未釋放,在此等候*/

)

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

/*延時?函數(shù)*/

/*--------------------------主函數(shù)------------------------------*/

/*主函數(shù)*/

voidmain()

{Lcmlnit();

LcmClearTXT();

PutStr(0,2,〃現(xiàn)在時間是〃);

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)/*無限循環(huán)*/

if(P2_2==0)scan_key();/*有按鍵,調用按鍵掃描?函數(shù)*/

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);/*延時?函數(shù)*/

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

/*------------------------走時?函數(shù)部分-----------------------*/

/*定時器TO5ms初始化*/

voidinit_timer()

(

TM0D=0x01;

TH0=-(4800/256);

TL0=-(4800%256);

IE=0x82;

TRO=1;

)

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

/*5mS定時中斷服務?函數(shù)*/

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;

)

}

/*-------------------------顯示?函數(shù)部分-----------------------*/

/*走時時間顯示?函數(shù)*/

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

/*-----------------------調整時間?函數(shù)部分--------------------*/

/*調整走時時間*/

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論