|
基于51單片機LCD12864大字符校時萬年歷帶高考倒計時程序,感覺不錯就分享給大家。
全部源碼下載:
基于51單片機LCD12864大字符校時萬年歷帶高考倒計時程序.zip
(258.11 KB, 下載次數: 121)
2017-3-23 21:30 上傳
點擊文件名下載附件
主程序預覽:
- /*---------------------------------------------------------------------------
- 電子時鐘程序
- 單 片 機:STC89C58RC
- 晶 振:12MHz
- 時鐘芯片:DS1302
- 液 晶 屏:LCM-12864-ST7920
- 功能描述: 大數字顯示時間;能顯示農歷、設置鬧鈴;
- 說 明:LCM12864使用并口連接方式,PSB、RST接高電平
- ------------------------------------------------------------------------------*/
- /*-------------------------------頭文件---------------------------------------*/
- #include <reg52.h>
- #include <intrins.h>
- #include "LCD12864.h"
- #include "DS1302.h"
- #include "nongli.h"
- #include "displaytime.h"
- #include "zk.h"
- #include "bell.h"
- #include "HW.H"
- #include "delay.h"
- #include "DS18B20.h"
- #define uint unsigned int
- #define uchar unsigned char
- /*--------------------定義按鍵-----------------------------------------------*/
- sbit K1 = P2^3; //K1-設置
- sbit K2 = P2^4; //K2-確認、返回
- sbit K3 = P2^5; //K3-加
- sbit K4 = P2^6; //K4-減
- sbit K5 = P2^7; //K5-控制鬧鐘的打開與關閉,在"hw.h"中定義
- sbit K6 = P2^2; //背光控制
- sbit LED = P2^0; //背光燈
- /*---------------------函數聲明------------------------------*/
- void ds_w(void);
- void Conver_week(bit c,uchar year,uchar month,uchar day);
- /*-----------------------------定義全局變量------------------------------*/
- bit w=0; //調時標志位
- unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定義時間映射全局變量(專用寄存器)
- signed char address,item,item0,max,mini;
- unsigned char clk_ala[2]={0x05,0x2f};//鬧鐘數據存放初,始值為05:27
- unsigned char zwc=0,fwc=0,CKTIME_1=0,timp,timp0,timp1,timp2,hhh,mmm,sss;//用于校時
- unsigned char hour=0,minute=0,time=0;//用于鬧鈴的設置
- unsigned char gCount;
- /*-----------------------------調整界面設置函數-----------------------------*/
- void tiaozheng(void){
- yy = read_clock(0x8d);//調用1302時鐘數據中的年數據,從地址0x8d中
- mo = read_clock(0x89);//調用1302時鐘數據中的月數據,從地址0x89中
- dd = read_clock(0x87);//從1302芯片中讀取日數據,從地址0x87中
- week = read_clock(0x8b);//從1302芯片中讀取星期數據,從地址0x8b中
- //----------------------------------
- lcm_w_test(0,0x80);
- lcm_w_word("20");
- lcm_w_test(1,(yy/16)+0x30);
- lcm_w_test(1,yy%16+0x30);
- lcm_w_word("-");
- //----------------------------------
- lcm_w_test(1,(mo/16)+0x30);
- lcm_w_test(1,mo%16+0x30);
- lcm_w_word("-");
- //----------------------------------
- lcm_w_test(1,(dd/16)+0x30);
- lcm_w_test(1,dd%16+0x30);
- //----------------------------------
- if(read_clock(0x85) != hh){hh = read_clock(0x85);}
- lcm_w_test(0,0x88);
- lcm_w_test(1,(hh/16)+0x30);
- lcm_w_test(1,hh%16+0x30);
- lcm_w_word(":");
- //----------------------------------
- if(read_clock(0x83) != mm){mm = read_clock(0x83);}
- lcm_w_test(1,(mm/16)+0x30);//向液晶寫數據,顯示分鐘的十位數
- lcm_w_test(1,mm%16+0x30);//向液晶寫數據,顯示分鐘的個位數
- lcm_w_word(":");
- //----------------------------------
- if(read_clock(0x81) != ss){ss = read_clock(0x81);}
- lcm_w_test(1,(ss/16)+0x30);
- lcm_w_test(1,ss%16+0x30);
- //=========顯示設置鬧鐘的時間===================
- if(read_clock(0xc7) != hour){hour = read_clock(0xc7);}
- if(read_clock(0xc9) != minute){minute = read_clock(0xc9);}
- lcm_w_test(0,0x8d);
- lcm_w_test(1,(hour/16)+0x30);//顯示鬧鐘小時十位
- lcm_w_test(1,(hour%16)+0x30);//顯示鬧鐘小時個位
- lcm_w_word(":");
- lcm_w_test(1,(minute/16)+0x30);//顯示鬧鐘分鐘的十位
- lcm_w_test(1,(minute%16)+0x30);//顯示鬧鐘分鐘的個位
- //=========顯示設置時間校正===================
- if(read_clock(0xc5) != zwc){zwc = read_clock(0xc5);} //加減標志
- if(read_clock(0xc3) != fwc){fwc = read_clock(0xc3);} //調整多少秒
- lcm_w_test(0,0x90);
- lcm_w_word("每天零點時");
- lcm_w_test(0,0x95);
- if(zwc==0){lcm_w_word("加");}
- if(zwc==1){lcm_w_word("減");}
- lcm_w_test(0,0x96);
- lcm_w_test(1,(fwc/16)+0x30);
- lcm_w_test(1,(fwc%16)+0x30);
- lcm_w_test(0,0x97);
- lcm_w_word("秒");
- }
- void displayNaozh() //鬧鐘顯示
- {
- if(read_clock(0xc7) != hour){
- hour = read_clock(0xc7);
- }
- if(read_clock(0xc9) != minute){
- minute = read_clock(0xc9);
- }
- lcm_w_test(0,0x85);
- lcm_w_test(1,(hour/16)+0x30);//顯示小時十位
- lcm_w_test(1,(hour%16)+0x30);//顯示小時個位
- lcm_w_word(":");
- lcm_w_test(1,(minute/16)+0x30);//顯示分鐘的十位
- lcm_w_test(1,(minute%16)+0x30);//顯示分鐘的個位
- lcm_w_word(" ");
- }
- void ds_w(void) //被調數據加一或減一,并檢查數據范圍,寫入1302指定地址保存
- {
- item0=time;
- item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;//時間的調整
- if(K3 == 0||key_add==1){//如果按動上調鍵
- item++;//數加 1
- }
- if(K4 == 0||key_minish==1){//如果按動下調鍵
- item--;//數減 1
- }
- if(item>max) item=mini;//查看數值是否在有效范圍之內
- if(item<mini) item=max;//如果數值小于最小值,則自動等于最大值
- write_clock(0x8e,0x00);//允許寫1302芯片操作
- write_clock(address,(item/10)*16+item%10);//轉換成16進制寫入1302
- write_clock(0x8e,0x80);//寫保護,禁止寫操作
- time=item0;//調整后的時間重新賦值給time(Tt為Hh或Mm),這步很重要,沒有將無法更新鬧鐘數據
- }
- /**********************************************************************************************************/
- void Set_time(unsigned char sel){
- //根據選擇調整的相應項目加1并寫入DS1302,函數參數是按動設置鍵的次數
- write_com(0x30); write_com(0x06);
- lcm_w_test(0,0x98);
- lcm_w_word("調整>");//調用字符顯示函數,顯示 調整字樣
-
- //================================================================
- lcm_w_test(0,0x9c);
- if(sel==9) {lcm_w_word("調整多少");address=0xc2; max=29;mini=0;
- tiaozheng();
- ds_w();
- tiaozheng();
- } //按動10次顯示 調整多少秒
- if(sel==8) {lcm_w_word("加減調整");address=0xc4;max=1;mini=0;
- tiaozheng(); //顯示調整前的內容
- ds_w(); //設置鬧鐘
- tiaozheng(); //顯示調整后的內容
- } //按動9次顯示 快還是慢
- //================================================================
- lcm_w_test(0,0x9c);
- if(sel==7) {lcm_w_word("鬧鐘分鐘");address=0xc8;max=59;mini=0; //數據寫入1302芯片的寫入地址是0xc8,最大值是59,最小值是0
- tiaozheng(); //顯示調整前的內容
- ds_w(); //設置鬧鐘
- tiaozheng(); //顯示調整后的內容
- } //按動8次顯示 調整鬧鐘的分鐘部分
- if(sel==6) {lcm_w_word("鬧鐘小時");address=0xc6; max=23;mini=0;
- tiaozheng();
- ds_w();
- tiaozheng();
- } //按動7次顯示 調整鬧鐘的小時部分
- //================================================================
- if(sel==5) {lcm_w_word("調整秒鐘");address=0x80; max=59;mini=0;
- tiaozheng();
- ds_w();
- tiaozheng();
- }
- if(sel==4) {lcm_w_word("調整分鐘");address=0x82; max=59;mini=0;
- tiaozheng();
- ds_w();
- tiaozheng();
- }
- if(sel==3) {lcm_w_word("調整小時");address=0x84; max=23;mini=0;
-
- tiaozheng();
- ds_w();
- tiaozheng();
- }
- if(sel==2) {lcm_w_word("調整日期");address=0x86;
- mo = read_clock(0x89);//讀月數據
- moontemp1=mo/16;
- moontemp2=mo%16;
- mo=moontemp1*10+moontemp2;//轉換成10進制月份數據
- yy = read_clock(0x8d);//讀年數據
- moontemp1=yy/16;
- moontemp2=yy%16;
- yy=moontemp1*10+moontemp2;//轉換成10進制年份數據
- if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天
- if(mo==2&&yy%4==0){max=29;mini=1;}//閏年2月29天
- if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//31天的月份
- if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;}//30天的月份
- tiaozheng();
- ds_w();
- tiaozheng();
-
- }
- if(sel==1) {lcm_w_word("調整月份");address=0x88; max=12;mini=1;
- tiaozheng();
- ds_w();
- tiaozheng();
-
- }
- if(sel==0) {lcm_w_word("調整年份");address=0x8c; max=99; mini=0;
- tiaozheng();
- ds_w();
- tiaozheng();
- }
- }
- //------------------------------------------------------
- void BiasAmend() //時間修正函數
- {
- hhh = (read_clock(0x85)/16)*10+read_clock(0x85)%16;
- mmm = (read_clock(0x83)/16)*10+read_clock(0x83)%16;
- sss = (read_clock(0x81)/16)*10+read_clock(0x81)%16;
- timp0= 30+((fwc/16)*10+fwc%16);
- timp= 30-((fwc/16)*10+fwc%16);
- if((hhh==0)&&(mmm==1)&&(sss==0)){CKTIME_1=0;}
- if((hhh==0)&&(mmm==0)&&(sss==30)&&CKTIME_1==0)
- {
- if( zwc==0) //加調整
- {
- write_clock(0x8e,0x00); //允許寫操作
- write_clock(0x80,(timp0/10)*16+timp0%10); //對秒進行調整。
- write_clock(0x8e,0x80); //禁止寫操作
- CKTIME_1=1; //保證只調整一次
- }
- if( zwc==1) //減調整
- {
- write_clock(0x8e,0x00); //允許寫操作
- write_clock(0x80,(timp/10)*16+timp%10); //對秒進行調整
- write_clock(0x8e,0x80); //禁止寫操作
- CKTIME_1=1; //保證只調整一次
- }
- }
- }
- // -----------------------------------------------------
- void naozbiaoz() //鬧鐘標志函數
- {
- if(read_clock(0xcb) != ala_flag){ala_flag = read_clock(0xcb);} //鬧鐘標志
- if(ala_flag==1) //鬧鐘標志位
- {set1616pic(5,1,0,2);} //顯示"喇叭"
- else
- {set1616pic(5,1,0,1);} //關閉"喇叭"顯示
- }
- /*********************************************************************
- **********************************************************************
- ************** 主函數 ****************
- **********************************************************************
- /********************************************************************/
- void main()
- {
- unsigned char ala_flag=1,e=0,f=0;
-
- IE = 0x81; //允許總中斷中斷,使能 INT0 外部中斷
- TCON = 0x01; //觸發方式為脈沖負邊沿觸發
- IRIN=1; //IO口初始化
- BEEP=1;
- K1=1;K2=1;K3=1;K4=1;LED=0;
-
- Init_1302(); //時鐘芯片初始化
- lcm_init(); //液晶初始化
- welcome0(); //調用歡迎信息1
- DelayM(1000);//延時
- lcm_clr(); //清屏
- Clean_12864_GDRAM(); //清屏
- while(1)
- {
- if (w == 0) //正常走時
- {
- hhh = (read_clock(0x85)/16)*10+read_clock(0x85)%16;
- mmm = (read_clock(0x83)/16)*10+read_clock(0x83)%16;
- sss = (read_clock(0x81)/16)*10+read_clock(0x81)%16;
- clk_ala[0]=(read_clock(0xc7)/16)*10+read_clock(0xc7)%16;
- clk_ala[1]=(read_clock(0xc9)/16)*10+read_clock(0xc9)%16;
- if ((sss==1)||(sss==2)||(sss==5)||(sss==6)||(sss==9)||(sss==10)||(sss==13)||(sss==14)||(sss==17)||(sss==18)||(sss==21)||(sss==22)||(sss==25)||(sss==26)||(sss==29)||(sss==30)||(sss==33)||(sss==34)||(sss==37)||(sss==38)||(sss==41)||(sss==42)||(sss==45)||(sss==46)||(sss==49)||(sss==50)||(sss==53)||(sss==54)||(sss==57)||(sss==58))
- {displaydate(); displayJr(); displayNaozh(); } //顯示日期 顯示農歷 顯示鬧鐘
- if ((sss==3)||(sss==4)||(sss==7)||(sss==8)||(sss==11)||(sss==12)||(sss==15)||(sss==16)||(sss==19)||(sss==20)||(sss==23)||(sss==24)||(sss==27)||(sss==28)||(sss==31)||(sss==32)||(sss==35)||(sss==36)||(sss==39)||(sss==40)||(sss==43)||(sss==44)||(sss==47)||(sss==48)||(sss==51)||(sss==52)||(sss==55)||(sss==56)||(sss==59)||(sss==0))
- {displaynl(); displayGK();{read_temp(); ds1820disp(); } //顯示農歷 顯示高考 //讀取溫度 //顯示溫度
- displaytime(); //顯示時間
- naozbiaoz(); // 鬧鐘標志
- displayxq(); //顯示星期
- BiasAmend(); //時間校正函數
- }
- //=================以下是鬧鐘的相關處理===================
- if((clk_ala[0]==hhh)&&(clk_ala[1]==mmm)&&(sss<10)&&(ala_flag==1))
- { alarmbeep();DelayM(200);}
- //{ BEEP=0;}
- else BEEP=1;
-
- }
- else {} //========否則啟動調時=========================
-
-
- /*---------------按鍵及紅外遙控設置時間------------------------------*/
- if (K1 == 0||key_manue==1)
- {
-
- DelayM(8); //按鍵消抖
- /*當是調時狀態 本鍵用于調整下一項---------------------------------------------------*/
- if((K1 == 0 && w == 1)||(key_manue==1&&w==1)) //
- {
-
- e++;
- if (e >= 10 ) {e = 0;}
- while(! K1 ); //等待鍵松開
- key_manue=0;
- Set_time(e); beep(); //調整
- }
- /*當是正常狀態時就進入調時狀態---------------------------------------------------*/
- if((K1 == 0 && w == 0)||(key_manue==1&&w==0)) //
- {
- key_manue=0;
- lcm_clr();
- Clean_12864_GDRAM(); //清屏
- w=1; //進入調時
- Set_time(e);beep();
- }
- key_manue=0;
- while(K1 == 0); //等待鍵松開
- }
- /*當在調時狀態時就退出調時---------------------------------------------------*/
- if (K2 == 0||key_ok==1) //
- { beep();
- DelayM(8);
- if((K2 == 0 && w == 1)||(key_ok==1&&w==1))
- {
- w = 0; //退出調時
- e = 0; //"下一項"計數器清0
- lcm_clr(); //清屏
- Clean_12864_GDRAM(); //清屏
- }
- }
- /*加調整--------------------------------------------------------------------*/
- if ((K3 == 0 && w == 1)||(key_add==1&&w==1))
- {
- DelayM(8);
- if((K3 == 0 && w == 1)||(key_add==1&&w==1))
- {
- Set_time(e);
- beep();
- while(!K3);
- key_add=0;
- }
- key_add=0;
- while(! K3 );
- }
- /*減調整--------------------------------------------------------------------*/
- if ((K4 == 0 && w == 1)||(key_minish==1&&w==1))
- {
- DelayM(10);
- if((K4 == 0 && w == 1)||(key_minish==1&&w==1))
- {
- Set_time(e);
- beep();
- while(! K4 );
- key_minish=0;
- }
- key_minish=0;
- while(! K4 );
- }
- /*----------------------------------------------------------------*/
- if(K5 == 0 )//鬧鐘的開與關的設置標志位
- {
- DelayM(20);
- if(K5 == 0 )
- { beep();
- while(!K5);//松手檢測
- ala_flag=!ala_flag;
- if(ala_flag==0)
- {
- write_clock(0x8e,0x00);//允許寫1302芯片操作
- write_clock(0xca,0x00);//轉換成16進制寫入1302
- write_clock(0x8e,0x80);//寫保護,禁止寫操作
- }
- if(ala_flag==1)
- {
- write_clock(0x8e,0x00);//允許寫1302芯片操作
- write_clock(0xca,0x01);//轉換成16進制寫入1302
- write_clock(0x8e,0x80);//寫保護,禁止寫操作
- }
- }
- while(!K5);//松手檢測
- key_alarm=0;
- }
- /*----------------------------------------------------------------*/
- if(K6 == 0)
- {
- DelayM(20);
- if(K6 == 0 )
- { beep();
- while(!K6);//松手檢測
- LED=!LED;
- gCount = 0;
- }
- while(!K6);//松手檢測
- }
-
- }
-
- }
- /*結束----------------------------------------------------------------------*/
復制代碼
|
|