找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 27109|回復(fù): 76
收起左側(cè)

單片機(jī)萬年歷(程序,原理圖,PCB,元件清單都有)歡迎下載

  [復(fù)制鏈接]
ID:72399 發(fā)表于 2015-2-2 23:22 | 顯示全部樓層 |閱讀模式
歡迎下載萬年歷,不懂的可以問我
1.png
程序如下:
  1. /*********************功能比較齊全實(shí)用的萬年歷*********************************************


  2. 功  能:     顯示公歷年、月、日、時(shí)、分、秒
  3.                      農(nóng)歷月、日沒用阿拉伯?dāng)?shù)字符合國(guó)人習(xí)慣
  4.                          星期(星期不調(diào),用DS1302內(nèi)的數(shù)據(jù),而是根據(jù)公歷年月日推算的)
  5.                          溫度顯示(DS18B20)
  6.                          濕度顯示(DHT11)
  7.                          公歷重大節(jié)日顯示
  8.                          農(nóng)歷紀(jì)念日與節(jié)日(用于提醒農(nóng)歷生日非常實(shí)用)
  9. 注:1、當(dāng)農(nóng)歷紀(jì)念日與公歷紀(jì)念日碰到同一天,則按5秒的間隔輪流顯示
  10.      2、加入陽歷大小月和平閏年判斷,調(diào)日歷時(shí)自動(dòng)控制每個(gè)月份的天數(shù)
  11.          3、整點(diǎn)提醒等
  12.          4、單片機(jī)STC89C54RD+   晶振11.0592MHz
  13.          本程序參考了網(wǎng)上眾多高手的制作而來,在這里謝謝了!
  14. /*********************************************************************************************/
  15. //程序部分開始//
  16. /****************************************************************************/
  17. //頭文件
  18. #include <reg52.h>
  19. #include <string.h>
  20. #include "DHT11.h"
  21. #include "nongli.h"
  22. #define uchar unsigned char
  23. #define uint unsigned int
  24. #include <intrins.h>
  25. /*****************************************************************************/
  26. //定義PCB板的燈與揚(yáng)聲器定義
  27. sbit        led_back = P2^3;//背光控制(V2.1程序中加入了背光控制的硬件電路)
  28. //sbit        beep   = P2^6;//揚(yáng)聲器
  29. sbit    led_b=P1^4;//秒閃動(dòng)
  30. /*****************************************************************************/
  31. //定做PCB板溫度傳感器引腳定義
  32. /****************************************************************************/
  33. sbit DQ = P2 ^4 ;//ds18B20
  34. /*****************************************************************************/
  35. //鍵盤引腳定義
  36. sbit KEY_1 = P3^1;         //退出設(shè)置鍵
  37. sbit KEY_2 = P3^7;         //上調(diào)鍵
  38. sbit KEY_3 = P3^0;         //設(shè)置鍵
  39. sbit KEY_4 = P3^6;         //下調(diào)鍵
  40. sbit KEY_5 = P3^2;         //LED控制每次按動(dòng)改變背光開關(guān)
  41. /****************************************************************************/
  42. //LCD接口定義
  43. sbit RS = P1^1;//模式位,為0輸入指令,為1輸入數(shù)據(jù)
  44. sbit RW = P1^2;//讀寫位,為0讀,為1寫
  45. sbit E = P1^0;//使能位
  46. #define Lcd_Bus P0 //數(shù)據(jù)總線
  47. /*****************************************************************************/
  48. //定義DS1302時(shí)鐘接口
  49. sbit clock_clk = P2 ^ 0;//ds1302_clk(時(shí)鐘線)
  50. sbit clock_dat = P2 ^ 1;//ds1302_dat(數(shù)據(jù)線)
  51. sbit clock_Rst = P2 ^ 2;//ds1302_Rst(復(fù)位線)
  52. /*****************************************************************************/
  53. //定義累加器A中的各位
  54. sbit a0   = ACC ^ 0;
  55. sbit a1   = ACC ^ 1;
  56. sbit a2   = ACC ^ 2;
  57. sbit a3   = ACC ^ 3;
  58. sbit a4   = ACC ^ 4;
  59. sbit a5   = ACC ^ 5;
  60. sbit a6   = ACC ^ 6;
  61. sbit a7   = ACC ^ 7;
  62. /****************************************************************************/
  63. //定義全局變量
  64. unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定義時(shí)間映射全局變量(專用寄存器)
  65. bit w = 0; //調(diào)時(shí)標(biāo)志位,=0時(shí)為走時(shí)狀態(tài),=1時(shí)為調(diào)時(shí)狀態(tài)
  66. static unsigned char menu = 0;//定義靜態(tài)小時(shí)更新用數(shù)據(jù)變量
  67. static unsigned char keys = 0;//定義靜態(tài)小時(shí)更新用數(shù)據(jù)變量
  68. static unsigned char timecount = 0;//定義靜態(tài)軟件計(jì)數(shù)器變量
  69. signed char address,item,max,mini;
  70. /****************************************************************************/
  71. void DelayM(unsigned int a){//延時(shí)函數(shù) 1MS/次        
  72.                 unsigned char i;
  73.                 while( --a != 0){               
  74.                         for(i = 0; i < 125; i++);  //一個(gè) ; 表示空語句,CPU空轉(zhuǎn)。
  75.                 }                                      //i 從0加到125,CPU大概就耗時(shí)1毫秒
  76. }
  77. /******************************************************************************/
  78. //LCD驅(qū)動(dòng)(DY12864CBL液晶顯示屏并口驅(qū)動(dòng)程序)
  79. /******************************************************************************/
  80. void chk_busy(){//檢查忙位(底層)
  81.    RS=0;
  82.    RW=1;
  83.    E=1;
  84.    Lcd_Bus=0xff;
  85.    while((Lcd_Bus&0x80)==0x80);
  86.    E=0;
  87. }
  88. /******************************************************************************/
  89. void write_com(unsigned char cmdcode){//寫命令到LCD(底層)
  90.         chk_busy();
  91.         RS=0;
  92.         RW=0;
  93.         E=1;
  94.         Lcd_Bus=cmdcode;
  95.         E=0;
  96. }
  97. /******************************************************************************/
  98. void write_data(unsigned char Dispdata){         //寫數(shù)據(jù)到LCD(底層)
  99.         chk_busy();
  100.         RS=1;
  101.         RW=0;
  102.         E=1;
  103.         Lcd_Bus=Dispdata;
  104.         E=0;
  105. }
  106. /******************************************************************************/
  107. void lcm_init(){//初始化LCD屏(被調(diào)用層)
  108.    write_com(0x30);       //選擇8bit數(shù)據(jù)流
  109.    write_com(0x0c);       //開顯示(無游標(biāo)、不反白)
  110.    write_com(0x01);       //清除顯示,并且設(shè)定地址指針為00H
  111. }
  112. /*****************************************************************************/
  113. void lcm_w_word(unsigned char *s){//向LCM發(fā)送一個(gè)字符串,長(zhǎng)度64字符(一行)之內(nèi)。(被調(diào)用層)
  114.         while(*s>0){                                        //應(yīng)用:lcm_w_word("您好!"),直接顯示:您好!
  115.             write_data(*s);
  116.             s++;
  117.    }
  118. }
  119. /******************************************************************************/
  120. void lcm_w_test(bit i,unsigned char word){//寫指令或數(shù)據(jù)(被調(diào)用層)
  121.         if(i == 0){
  122.                 write_com(word);//寫指令或數(shù)據(jù)(0,指令)
  123.         }else{
  124.                 write_data(word);//寫指令或數(shù)據(jù)(1,數(shù)據(jù))
  125.         }
  126. }
  127. /******************************************************************************/
  128. void lcm_clr(void){//清屏函數(shù)
  129.         lcm_w_test(0,0x01);        
  130. }
  131. /******************************************************************************/
  132. void lcm_clr2(void){//清屏上面3行(用空格填滿要清顯示的地方,因?yàn)橐壕潦庆o態(tài)顯示的,所以這辦法常用)
  133.         lcm_w_test(0,0x80);//第一行
  134.         lcm_w_word("                ");
  135.             //標(biāo)尺("1234567812345678"應(yīng)該能夠顯示滿一行)
  136.    lcm_w_test(0,0x90);//第二行
  137.         lcm_w_word("                ");
  138.             //標(biāo)尺("1234567812345678"應(yīng)該能夠顯示滿一行)
  139.    lcm_w_test(0,0x88);//第一行
  140.         lcm_w_word("                ");
  141.             //標(biāo)尺("1234567812345678"應(yīng)該能夠顯示滿一行)
  142.    }
  143. /******************************************************************************/
  144. //DS18B20溫度傳感器驅(qū)動(dòng)(顯示0至60度,小數(shù)點(diǎn)后顯示一位)
  145. /******************************************************************************/
  146. void Delay1820(int num){//延時(shí)函數(shù)
  147.         while(num--) ;
  148. }        
  149. /******************************************************************************/
  150. void Init_DS18B20(void){//初始化ds1820
  151.         unsigned char x=0;
  152.         DQ = 1;    //DQ復(fù)位
  153.         Delay1820(8);  //稍做延時(shí)
  154.         DQ = 0;    //單片機(jī)將DQ拉低
  155.         Delay1820(80); //精確延時(shí) 大于 480us
  156.         DQ = 1;    //拉高總線
  157.         Delay1820(14);
  158.         x=DQ;      //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  159.         Delay1820(20);
  160. }
  161. /******************************************************************************/
  162. unsigned char ReadOneChar(void){//讀一個(gè)字節(jié)
  163.         unsigned char i=0;
  164.         unsigned char dat = 0;
  165.         for (i=8;i>0;i--){
  166.                 DQ = 0; // 給脈沖信號(hào)
  167.                 dat>>=1;
  168.                 DQ = 1; // 給脈沖信號(hào)
  169.                 if(DQ)
  170.                 dat|=0x80;
  171.                 Delay1820(4);
  172.         }
  173.         return(dat);
  174. }
  175. /******************************************************************************/
  176. void WriteOneChar(unsigned char dat){//寫一個(gè)字節(jié)
  177.         unsigned char i=0;
  178.         for (i=8; i>0; i--){
  179.                 DQ = 0;
  180.                 DQ = dat&0x01;
  181.                 Delay1820(5);
  182.                 DQ = 1;
  183.                 dat>>=1;
  184.         }
  185. }
  186. /******************************************************************************/
  187. unsigned int ReadTemperature(void){//讀取溫度,溫度值返回到此函數(shù)中,供調(diào)用
  188.         unsigned char a=0;
  189.         unsigned char b=0;
  190.         unsigned int t=0;
  191.         float tt=0;
  192.         Init_DS18B20();
  193.         WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作
  194.         WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  195.         Init_DS18B20();
  196.         WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
  197.         WriteOneChar(0xBE); //讀取溫度寄存器
  198.         a=ReadOneChar();  //讀低8位
  199.         b=ReadOneChar(); //讀高8位
  200.         t=b;
  201.         t<<=8;
  202.         t=t|a;
  203.         tt=t*0.0625;
  204.         t= tt*10+0.5; //放大10倍輸出并四舍五入
  205.         return(t);//t內(nèi)的溫度值,返回到子函數(shù)中,要將溫度傳輸?shù)絫emp變量,應(yīng)用temp=ReabTemperature()
  206. }
  207. /******************************************************************************/
  208. //后面會(huì)出現(xiàn)的函數(shù)聲明(當(dāng)各函數(shù)的排列適當(dāng)時(shí)可不用聲明,加入函數(shù)聲明就不用管各個(gè)子函數(shù)出現(xiàn)的位置先后了?)
  209. void lcm_w_ss(void);//向液晶LCM中寫秒數(shù)據(jù)
  210. void lcm_w_mm(void);//向液晶LCM中寫分?jǐn)?shù)據(jù)
  211. void lcm_w_hh(void);//向液晶LCM中寫小時(shí)數(shù)據(jù)
  212. void lcm_w_dd(void);//寫日數(shù)據(jù)
  213. void lcm_w_mo(void);//寫月數(shù)據(jù)
  214. void lcm_w_yy(void);//寫年數(shù)據(jù)
  215. void lcm_w_xq(void);//星期處理并送入LCM的指定區(qū)域
  216. unsigned char clock_in(void);//DS1302逐位寫入字節(jié)(底層協(xié)議)
  217. void clock_out(unsigned char dd);//1302驅(qū)動(dòng)程序逐位讀出字節(jié)(底層協(xié)議?
  218. void Init_1302(void);//-設(shè)置1302的初始時(shí)間(2007年1月1日00時(shí)00分00秒星期一)
  219. unsigned char read_clock(unsigned char ord);//DS1302讀數(shù)據(jù)(底層協(xié)議)
  220. void read_clockS(void);
  221. void Set_time(unsigned char sel);//根據(jù)選擇調(diào)整的相應(yīng)項(xiàng)目sel加1并寫入DS1302
  222. void write_clock(unsigned char ord, unsigned char dd);//DS1302寫數(shù)據(jù)(底層協(xié)議)
  223. void updata (void);        
  224. //void lcm_w_sd(void);//寫入濕度數(shù)據(jù)
  225. void lcm_w_nl(void);//顯示農(nóng)歷子函數(shù)
  226. void Conversion(bit c,unsigned char year,unsigned char month,unsigned char day); //農(nóng)歷年月日計(jì)算子函數(shù)
  227. void Conver_week(bit c,unsigned char year,unsigned char month,unsigned char day);//星期計(jì)算子函數(shù)
  228. void ds_w(void);

  229. /*****************************************************************************/
  230. //設(shè)置1302的初始時(shí)間(自動(dòng)初始化)
  231. void Init_1302(void){//-設(shè)置1302的初始時(shí)間(2007年1月1日00時(shí)00分00秒星期一)
  232.         unsigned char f;
  233.         if(read_clock(0xc1) != 0xaa){
  234.                 write_clock(0x8e,0x00);//允許寫操作
  235.                 write_clock(0x8c,0x11);//年
  236.                 write_clock(0x8a,0x00);//星期
  237.                 write_clock(0x88,0x05);//月
  238.                 write_clock(0x86,0x29);//日
  239.                 write_clock(0x84,0x19);//小時(shí)
  240.                 write_clock(0x82,0x55);//分鐘
  241.                 write_clock(0x80,0x23);//秒
  242.                 write_clock(0x90,0xa5);//充電        
  243.                 write_clock(0xc0,0xaa);//寫入初始化標(biāo)志RAM(第00個(gè)RAM位置)
  244.                 for(f=0;f<60;f=f+2){//清除鬧鐘RAM位為0
  245.                         write_clock(0xc2+f,0x00);
  246.                 }
  247.                 write_clock(0x8e,0x80);//禁止寫操作
  248.         }
  249. }
  250. /*****************************************************************************/
  251. //DS1302寫數(shù)據(jù)(底層協(xié)議)
  252. void write_clock(unsigned char ord, unsigned char dd){
  253.         clock_clk=0;
  254.         clock_Rst=0;
  255.         clock_Rst=1;
  256.         clock_out(ord);
  257.         clock_out(dd);
  258.         clock_Rst=0;
  259.         clock_clk=1;
  260. }
  261. /*****************************************************************************/
  262. //1302驅(qū)動(dòng)程序逐位讀出字節(jié)(底層協(xié)議)
  263. void clock_out(unsigned char dd){
  264.         ACC=dd;
  265.         clock_dat=a0; clock_clk=1; clock_clk=0;
  266.         clock_dat=a1; clock_clk=1; clock_clk=0;
  267.         clock_dat=a2; clock_clk=1; clock_clk=0;
  268.         clock_dat=a3; clock_clk=1; clock_clk=0;
  269.         clock_dat=a4; clock_clk=1; clock_clk=0;
  270.         clock_dat=a5; clock_clk=1; clock_clk=0;
  271.         clock_dat=a6; clock_clk=1; clock_clk=0;
  272.         clock_dat=a7; clock_clk=1; clock_clk=0;
  273. }
  274. /*****************************************************************************/
  275. //DS1302逐位寫入字節(jié)(底層協(xié)議)
  276. unsigned char clock_in(void){
  277.         clock_dat=1;
  278.         a0=clock_dat;
  279.         clock_clk=1; clock_clk=0; a1=clock_dat;
  280.         clock_clk=1; clock_clk=0; a2=clock_dat;
  281.         clock_clk=1; clock_clk=0; a3=clock_dat;
  282.         clock_clk=1; clock_clk=0; a4=clock_dat;
  283.         clock_clk=1; clock_clk=0; a5=clock_dat;
  284.         clock_clk=1; clock_clk=0; a6=clock_dat;
  285.         clock_clk=1; clock_clk=0; a7=clock_dat;
  286.         return(ACC);
  287. }
  288. /*****************************************************************************/
  289. //DS1302讀數(shù)據(jù)(底層協(xié)議)供調(diào)用時(shí)鐘數(shù)據(jù)
  290. unsigned char read_clock(unsigned char ord){
  291.         unsigned char dd=0;
  292.         clock_clk=0;
  293.         clock_Rst=0;
  294.         clock_Rst=1;
  295.         clock_out(ord);
  296.         dd=clock_in();
  297.         clock_Rst=0;
  298.         clock_clk=1;
  299.         return(dd);
  300. }

  301. /*****************************************************************************/
  302. //揚(yáng)聲器驅(qū)動(dòng)程序(鬧鐘音樂)
  303. /*****************************************************************************/        
  304. void Beep(void){//BELL-揚(yáng)聲器--整點(diǎn)報(bào)時(shí)
  305.         unsigned char a;//定義變量用于發(fā)聲的長(zhǎng)度設(shè)置
  306.         for(a=60;a>0;a--){//第一個(gè)聲音的長(zhǎng)度
  307.                 beep = ~beep;//取反揚(yáng)聲器驅(qū)動(dòng)口,以產(chǎn)生音頻
  308.                 Delay1820(100);//音調(diào)設(shè)置延時(shí)
  309.         }
  310.         for(a=100;a>0;a--){//同上
  311.                 beep = ~beep;
  312.                 Delay1820(80);//
  313.         }
  314.         for(a=100;a>0;a--){//同上
  315.                 beep = ~beep;
  316.                 Delay1820(30);//
  317.         }
  318.         beep = 0;//音樂結(jié)束后揚(yáng)聲器輸出0關(guān)閉,因?yàn)楹蠖擞?014驅(qū)動(dòng),所以控制輸出1時(shí)蜂鳴響
  319. }
  320. /*****************************************************************************/
  321. void Beep_set(void){//BELL -揚(yáng)聲器--確定設(shè)置
  322.         unsigned char a;//定義變量用于發(fā)聲的長(zhǎng)度設(shè)置
  323.         for(a=50;a>0;a--){//第一個(gè)聲音的長(zhǎng)度
  324.                 beep = ~beep;//取反揚(yáng)聲器驅(qū)動(dòng)口,以產(chǎn)生音頻
  325.                 Delay1820(100);//音調(diào)設(shè)置延時(shí)
  326.         }
  327.         for(a=100;a>0;a--){//同上
  328.                 beep = ~beep;
  329.                 Delay1820(50);//
  330.         }
  331.         for(a=50;a>0;a--){//同上
  332.                 beep = ~beep;
  333.                 Delay1820(100);//
  334.         }
  335.         beep = 0;//音樂結(jié)束后揚(yáng)聲器輸出0關(guān)閉,因?yàn)楹蠖擞?014反相驅(qū)動(dòng),所以控制輸出0時(shí)蜂鳴響
  336. }
  337. /*****************************************************************************/
  338. void Beep_key(void){//-揚(yáng)聲器--按鍵音
  339.         unsigned char a;//定義變量用于發(fā)聲的長(zhǎng)度設(shè)置
  340.         for(a=100;a>0;a--){//聲音的長(zhǎng)度
  341.                 beep = ~beep;
  342.                 Delay1820(50);//音調(diào)設(shè)置延時(shí)
  343.         }
  344.         beep = 0;//音樂結(jié)束后揚(yáng)聲器拉高關(guān)閉
  345. }               

  346. /******************************************************************************/
  347. //農(nóng)歷節(jié)日數(shù)據(jù)庫表,農(nóng)歷紀(jì)念日數(shù)據(jù)表,加上公歷的重大節(jié)日
  348. /******************************************************************************/



  349. void jie_nl(void){                    //

  350.         dd = read_clock(0x87);//日
  351.             mo = read_clock(0x89);//月
  352.         yy = read_clock(0x8d);//年
  353.         Conversion(0,yy,mo,dd);//調(diào)用公歷轉(zhuǎn)農(nóng)歷子函數(shù)
  354.   //調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀c_moon農(nóng)歷世紀(jì),year_moon農(nóng)歷年,month_moon,day_moon得出陰歷BCD數(shù)據(jù)        

  355.         
  356.       lcm_w_test(0,0x98);//在屏幕第四行顯示節(jié)日(下面的注釋行用坐標(biāo)尺,不要改動(dòng))
  357. //農(nóng)歷節(jié)日:
  358. //                                                                                                                   ----|----------------|標(biāo)尺,漢字不要對(duì)在空隙上
  359.           if ( month_moon == 0x12 && day_moon == 0x29 ){ lcm_w_word("  明天是春節(jié)!!"); }
  360.       if ( month_moon == 0x12 && day_moon == 0x30 ){ lcm_w_word("  今天是春節(jié)!"); }
  361.       if ( month_moon == 0x01 && day_moon == 0x01 ){ lcm_w_word("大年初一拜年啦  "); }
  362.       if ( month_moon == 0x01 && day_moon == 0x14 ){ lcm_w_word("  明天元宵節(jié)!  "); }
  363.       if ( month_moon == 0x01 && day_moon == 0x15 ){ lcm_w_word("  元宵節(jié)到啦!   "); }
  364.       if ( month_moon == 0x05 && day_moon == 0x04 ){ lcm_w_word("    明天端午    "); }
  365.           if ( month_moon == 0x05 && day_moon == 0x05 ){ lcm_w_word("    今天端午    "); }
  366.       if ( month_moon == 0x07 && day_moon == 0x06 ){ lcm_w_word("  明天七月七啦  "); }
  367.       if ( month_moon == 0x07 && day_moon == 0x07 ){ lcm_w_word("牛郎織女鵲橋相會(huì)"); }
  368.       if ( month_moon == 0x08 && day_moon == 0x14 ){ lcm_w_word("  明天仲秋節(jié)    "); }
  369.       if ( month_moon == 0x08 && day_moon == 0x15 ){ lcm_w_word("    仲秋佳節(jié)    "); }
  370.           if ( month_moon == 0x09 && day_moon == 0x08 ){ lcm_w_word("    明天重陽    "); }
  371.       if ( month_moon == 0x09 && day_moon == 0x09 ){ lcm_w_word("    今天重陽節(jié)  "); }
  372.           if ( month_moon == 0x12 && day_moon == 0x07 ){ lcm_w_word("    明天臘八    "); }
  373.           if ( month_moon == 0x12 && day_moon == 0x08 ){ lcm_w_word("    今天臘八    "); }
  374.           if ( month_moon == 0x12 && day_moon == 0x22 ){ lcm_w_word("    明日辭灶    "); }
  375.           if ( month_moon == 0x12 && day_moon == 0x23 ){ lcm_w_word("    今日辭灶    "); }

  376.           if ( month_moon == 0x10 && day_moon == 0x04 ){ lcm_w_word("    你的生日    "); }
  377.              if ( month_moon == 0x10 && day_moon == 0x05 ){ lcm_w_word("            生日"); }
  378.           if ( month_moon == 0x10 && day_moon == 0x11 ){ lcm_w_word("            生日"); }               
  379. }
  380. void jie_gl(void){  //

  381.          dd = read_clock(0x87);//日
  382.              mo = read_clock(0x89);//月
  383.          yy = read_clock(0x8d);//年
  384.         //Conversion(0,yy,mo,dd);//調(diào)用公歷轉(zhuǎn)農(nóng)歷子函數(shù)
  385.         //調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀c_moon農(nóng)歷世紀(jì),year_moon農(nóng)歷年,month_moon,day_moon得出陰歷BCD數(shù)據(jù)        

  386.          lcm_w_test(0,0x98);//在屏幕第四行顯示節(jié)日(下面的注釋行用坐標(biāo)尺,不要改動(dòng))

  387. //下面是公歷的,有些沒意思的,就不顯示了
  388.         if ( mo == 0x01 && dd == 0x01 ){ lcm_w_word("    歡度元旦"    ); }
  389.         if ( mo == 0x02 && dd == 0x13 ){ lcm_w_word("  明天情人節(jié)了  "); }               
  390.                 if ( mo == 0x02 && dd == 0x14 ){ lcm_w_word("  今天是情人節(jié)  "); }               
  391.                 if ( mo == 0x03 && dd == 0x08 ){ lcm_w_word("  女同胞高興了  "); }
  392.                 if ( mo == 0x03 && dd == 0x11 ){ lcm_w_word("  明天是植樹節(jié)  "); }
  393.                 if ( mo == 0x03 && dd == 0x12 ){ lcm_w_word("    植樹節(jié)      "); }
  394.             if ( mo == 0x03 && dd == 0x14 ){ lcm_w_word("明天消費(fèi)者權(quán)益日"); }        
  395.                 if ( mo == 0x03 && dd == 0x15 ){ lcm_w_word("  消費(fèi)者權(quán)益日  "); }                                
  396.                 if ( mo == 0x04 && dd == 0x01 ){ lcm_w_word("愚人節(jié)  小心上當(dāng)"); }               
  397.                 if ( mo == 0x04 && dd == 0x07 ){ lcm_w_word("  世界衛(wèi)生日    "); }               
  398.                 if ( mo == 0x04 && dd == 0x08 ){ lcm_w_word("    復(fù)活節(jié)      "); }               
  399.                 if ( mo == 0x04 && dd == 0x13 ){ lcm_w_word("  黑色星期五    "); }

  400.                 if ( mo == 0x05 && dd == 0x01 ){ lcm_w_word("  勞動(dòng)節(jié)  放假  "); }//5               
  401.             if ( mo == 0x05 && dd == 0x04 ){ lcm_w_word("    青年節(jié)      "); }               
  402.                 if ( mo == 0x05 && dd == 0x08 ){ lcm_w_word("  世界紅十字日  "); }               
  403.                 if ( mo == 0x05 && dd == 0x12 ){ lcm_w_word("  國(guó)際護(hù)士節(jié)    "); }               
  404.                 if ( mo == 0x05 && dd == 0x05 ){ lcm_w_word("近日注意母親節(jié)  "); }
  405.                 if ( mo == 0x05 && dd == 0x06 ){ lcm_w_word("近日注意母親節(jié)  "); }
  406.                 if ( mo == 0x05 && dd == 0x15 ){ lcm_w_word("  國(guó)際家庭日    "); }
  407.                 if ( mo == 0x05 && dd == 0x31 ){ lcm_w_word("  明天兒童節(jié)    "); }
  408.                                                                
  409.                 if ( mo == 0x06 && dd == 0x01 ){ lcm_w_word("月月兒童節(jié)快樂! "); }//6
  410.             if ( mo == 0x06 && dd == 0x05 ){ lcm_w_word("  世界環(huán)境日    "); }               
  411.                 if ( mo == 0x06 && dd == 0x26 ){ lcm_w_word("  國(guó)際禁毒日    "); }               
  412.                 if ( mo == 0x06 && dd == 0x06 ){ lcm_w_word("  全國(guó)愛眼日    "); }               
  413.                 if ( mo == 0x06 && dd == 0x13 ){ lcm_w_word("近日注意父親節(jié)  "); }
  414.                 if ( mo == 0x06 && dd == 0x15 ){ lcm_w_word("近日注意父親節(jié)  "); }
  415.                                 
  416.                 if ( mo == 0x07 && dd == 0x01 ){ lcm_w_word("香港回歸記念日  "); }//7
  417.                 if ( mo == 0x07 && dd == 0x07 ){ lcm_w_word("抗日戰(zhàn)爭(zhēng)記念日  "); }
  418.                 if ( mo == 0x07 && dd == 0x11 ){ lcm_w_word("  世界人口日    "); }

  419.                 if ( mo == 0x08 && dd == 0x01 ){ lcm_w_word("  八一建軍節(jié)    "); }//8
  420.             if ( mo == 0x08 && dd == 0x15 ){ lcm_w_word("抗戰(zhàn)勝利記念日  "); }
  421.         if ( mo == 0x09 && dd == 0x09 ){ lcm_w_word("  明天教師節(jié)    "); }

  422.                 if ( mo == 0x09 && dd == 0x10 ){ lcm_w_word("  中國(guó)教師節(jié)    "); }//9
  423.                 if ( mo == 0x09 && dd == 0x18 ){ lcm_w_word("九一八事變紀(jì)念  "); }
  424.                 if ( mo == 0x09 && dd == 0x20 ){ lcm_w_word("  國(guó)際愛牙日    "); }
  425.                 if ( mo == 0x09 && dd == 0x27 ){ lcm_w_word("  世界旅游日    "); }

  426.                 if ( mo == 0x10 && dd == 0x01 ){ lcm_w_word("  中國(guó)國(guó)慶節(jié)    "); }//10
  427.                if ( mo == 0x10 && dd == 0x04 ){ lcm_w_word("  世界動(dòng)物日    "); }
  428.                 if ( mo == 0x10 && dd == 0x24 ){ lcm_w_word("    聯(lián)合國(guó)日    "); }
  429.                 if ( mo == 0x10 && dd == 0x12 ){ lcm_w_word("明天國(guó)際教師節(jié)  "); }
  430.                 if ( mo == 0x10 && dd == 0x13 ){ lcm_w_word("  國(guó)際教師節(jié)    "); }

  431.                 if ( mo == 0x11 && dd == 0x10 ){ lcm_w_word("  世界青年節(jié)    "); }//11
  432.                if ( mo == 0x11 && dd == 0x17 ){ lcm_w_word("  世界學(xué)生節(jié)    "); }

  433.                    if ( mo == 0x12 && dd == 0x01 ){ lcm_w_word("  世界艾滋病日  "); }//12
  434.                 if ( mo == 0x12 && dd == 0x23 ){ lcm_w_word("  明晚平安夜    "); }
  435.                 if ( mo == 0x12 && dd == 0x24 ){ lcm_w_word("  今晚平安夜    "); }
  436.                 if ( mo == 0x12 && dd == 0x25 ){ lcm_w_word("  今天圣誕節(jié)    "); }
  437.                 if ( mo == 0x12 && dd == 0x31 ){ lcm_w_word("    明日元旦    "); }

  438.    else{//非節(jié)日時(shí)顯示時(shí)晨信息,判斷小時(shí)數(shù)據(jù)范圍,調(diào)取顯示
  439.                 if ( hh >= 0x04 && hh <  0x06 ){ lcm_w_word("  凌晨沉睡時(shí)間  "); }
  440.             if ( hh >= 0x06 && hh <  0x08 ){ lcm_w_word("不要睡懶覺早點(diǎn)起"); }
  441.                 if ( hh >= 0x08 && hh <  0x12 ){ lcm_w_word("上班是多么的無奈"); }
  442.                 if ( hh == 0x12)               { lcm_w_word("  做點(diǎn)好吃的補(bǔ)充"); }
  443.                 if ( hh >= 0x13 && hh <  0x18 ){ lcm_w_word("    睡個(gè)午覺    "); }
  444.                 if ( hh >= 0x18 && hh <  0x22 ){ lcm_w_word("  下班注意安全  "); }
  445.                 if ( hh >= 0x22 && hh <= 0x23 ){ lcm_w_word("  可以做個(gè)好夢(mèng)了"); }
  446.                    if ( hh >= 0x00 && hh <  0x04 ){ lcm_w_word("深夜、、、、、、"); }
  447.                  }
  448. }
  449. /*****************************************************************************/
  450. //電子鐘應(yīng)用層程序設(shè)計(jì)
  451. /*****************************************************************************/
  452. //向LCM中填寫 年 數(shù)據(jù)
  453. void lcm_w_yy(void){

  454.                 yy = read_clock(0x8d);//調(diào)用1302時(shí)鐘數(shù)據(jù)中的年數(shù)據(jù),從地址0x8d中
  455.                 lcm_w_test(0,0x80);
  456.                 lcm_w_word("20");//顯示內(nèi)容字符20
  457.                 lcm_w_test(1,(yy/16)+0x30);//函數(shù)參數(shù)1,代表本行寫數(shù)據(jù),YY/16+0X30得出年十位數(shù)字的顯示碼地址,送顯示        
  458.                 lcm_w_test(1,yy%16+0x30);//函數(shù)參數(shù)1,代表本行寫數(shù)據(jù),YY%得出年個(gè)位數(shù)字的顯示碼地址,送顯示
  459.                 //因?yàn)槟陻?shù)據(jù)兩位數(shù)字如果是09,C51默認(rèn)是16進(jìn)制數(shù)據(jù),所以要用16來分離十位、個(gè)位。     
  460. }

  461. void lcm_w_yy2(void){//調(diào)年時(shí)的顯示程序
  462.      yy = read_clock(0x8d);//調(diào)用1302時(shí)鐘數(shù)據(jù)中的年數(shù)據(jù),從地址0x8d中
  463.           lcm_w_test(0,0x93);
  464.           lcm_w_word("20");//顯示內(nèi)容字符20
  465.           lcm_w_test(1,(yy/16)+0x30);//函數(shù)參數(shù)1,代表本行寫數(shù)據(jù),YY/16+0X30得出年十位數(shù)字的顯示碼地址,送顯示        
  466.           lcm_w_test(1,yy%16+0x30);//函數(shù)?
  467.      lcm_w_word("  年");
  468.                  }

  469. /*****************************************************************************/
  470. //向LCM中填寫 月 數(shù)據(jù)
  471. void lcm_w_mo(void){
  472.                 mo = read_clock(0x89);//調(diào)用1302時(shí)鐘數(shù)據(jù)中的月數(shù)據(jù),從地址0x89中
  473.            lcm_w_test(0,0x82);
  474.       lcm_w_word("-");
  475.            lcm_w_test(1,(mo/16)+0x30);
  476.                 lcm_w_test(1,mo%16+0x30);//與16取余數(shù),得到月份的個(gè)位數(shù),加0x30得到該數(shù)字的液晶內(nèi)定顯示碼送顯示
  477.                 lcm_w_word("-");//調(diào)用字符顯示函數(shù),顯示文字 月
  478. }        


  479. //向LCM中填寫調(diào)月時(shí) 月 數(shù)據(jù)顯示格式(調(diào)月時(shí)調(diào)用顯示格式)
  480. void lcm_w_mo2(void){
  481.                 mo = read_clock(0x89);//調(diào)用1302時(shí)鐘數(shù)據(jù)中的月數(shù)據(jù),從地址0x89中
  482.       lcm_w_test(0,0x93);
  483.       lcm_w_word("  ");
  484.       lcm_w_test(1,(mo/16)+0x30);
  485.                 lcm_w_test(1,mo%16+0x30);//與16取余數(shù),得到月份的個(gè)位數(shù),加0x30得到該數(shù)字的液晶內(nèi)定顯示碼送顯示
  486.                 lcm_w_word("  月");//調(diào)用字符顯示函數(shù),顯示文字 月
  487. }        


  488. /*****************************************************************************/
  489. //向LCM中填寫 日 數(shù)據(jù)
  490. void lcm_w_dd(void){

  491.                 dd = read_clock(0x87);//從1302芯片中讀取日數(shù)據(jù),從地址0x87中
  492.                 lcm_w_test(0,0x84);        
  493.                 //if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);}        //如果十位數(shù)不是0,就換算顯示
  494.                 //else{lcm_w_test(1,0x20);}//如果十位數(shù)是0,則顯示個(gè)空格,不顯示數(shù)據(jù)
  495.            lcm_w_test(1,(dd/16)+0x30);
  496.                 lcm_w_test(1,dd%16+0x30);//第一個(gè)1參數(shù),表示本行寫數(shù)據(jù),日數(shù)據(jù)與16取余得個(gè)位數(shù),加0x30得到顯示碼
  497.                                 
  498. }        

  499. //向LCM中填寫調(diào)日期時(shí)的 日 數(shù)據(jù)顯示格式(調(diào)日時(shí)調(diào)用的顯示格式)
  500. void lcm_w_dd2(void){

  501.                 dd = read_clock(0x87);//從1302芯片中讀取日數(shù)據(jù),從地址0x87中
  502.            lcm_w_test(0,0x93);        
  503.                 lcm_w_word("  ");
  504.            lcm_w_test(1,(dd/16)+0x30);
  505.                 lcm_w_test(1,dd%16+0x30);//第一個(gè)1參數(shù),表示本行寫數(shù)據(jù),日數(shù)據(jù)與16取余得個(gè)位數(shù),加0x30得到顯示碼
  506.                 lcm_w_word("  日");//顯示字符 日
  507.                                 
  508. }        

  509. //}/*****************************************************************************/
  510. //星期處理并送入LCM的指定區(qū)域
  511. void lcm_w_xq(void){

  512.            unsigned char sel,dd,mo,yy;

  513.         dd = read_clock(0x87);//日
  514.              mo = read_clock(0x89);//月
  515.              yy = read_clock(0x8d);//年
  516.         Conver_week(0,yy,mo,dd);//調(diào)用公歷換算星期子函數(shù)
  517.    
  518.    sel=week;//week是公歷轉(zhuǎn)換星期子函數(shù)的運(yùn)行結(jié)果,結(jié)果為0-6,0是星期日
  519.         lcm_w_test(0,0x87);//顯示位置
  520.         if(sel==0)  {lcm_w_word("日");}    //0=星期日
  521.           if(sel==6)  {lcm_w_word("六");}    //
  522.           if(sel==5)  {lcm_w_word("五");}    //
  523.           if(sel==4)  {lcm_w_word("四");}    //
  524.    //if(sel==3)  {lcm_w_word("三");}經(jīng)調(diào)試發(fā)現(xiàn)液晶屏不認(rèn)這一句,只好用下一句顯示 三
  525.           if(sel==3)  {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因?yàn)椤叭钡膬?nèi)碼失效。
  526.           if(sel==2)  {lcm_w_word("二");}    //
  527.           if(sel==1)  {lcm_w_word("一");}    //星期一
  528.         lcm_w_test(0,0x85);
  529.         lcm_w_word("星期");//調(diào)用字符顯示子函數(shù),顯示 星期 兩個(gè)字

  530. }        
  531. /*****************************************************************************/
  532. //向LCM中填寫 小時(shí) 數(shù)據(jù)
  533. void lcm_w_hh(void){
  534.         if(read_clock(0x85) != hh){//如果程序中的小時(shí)與1302芯片中的不同,
  535.                 hh = read_clock(0x85);//刷新程序中的小時(shí)數(shù)據(jù)
  536.                         if (hh > 0x07 && hh < 0x22 && w == 0){ //整點(diǎn)判斷
  537.                                 Beep();//調(diào)用一次整點(diǎn)報(bào)時(shí)音
  538.                         }
  539.                 }
  540.                 lcm_w_test(0,0x88);//第一個(gè)參數(shù)0,表示本行寫入LCM的是指令,指定顯示位置88H(第三行左端)
  541.                 lcm_w_test(1,(hh/16)+0x30);//顯示十位
  542.                 lcm_w_test(1,hh%16+0x30);//顯示個(gè)位
  543.                                 
  544. }


  545. //向LCM中填寫 小時(shí) 數(shù)據(jù)(用于調(diào)整時(shí)間時(shí)調(diào)用)
  546. void lcm_w_hh2(void){
  547.         if(read_clock(0x85) != hh){//如果程序中的小時(shí)與1302芯片中的不同,
  548.                 hh = read_clock(0x85);//刷新程序中的小時(shí)數(shù)據(jù)
  549.                         if (hh > 0x07 && hh < 0x22 && w == 0){ //整點(diǎn)判斷
  550.                                 Beep();//調(diào)用一次整點(diǎn)報(bào)時(shí)音
  551.                         }
  552.                 }
  553.                 lcm_w_test(0,0x93);//第一個(gè)參數(shù)0,表示本行寫入LCM的是指令,指定顯示位置88H(第三行左端)
  554.       lcm_w_word("  ");
  555.                 lcm_w_test(1,(hh/16)+0x30);//顯示十位
  556.                 lcm_w_test(1,hh%16+0x30);//顯示個(gè)位
  557.       lcm_w_word("  時(shí)");
  558.                                 
  559. }
  560. /*****************************************************************************/
  561. //向LCM中填寫 分鐘 數(shù)據(jù)
  562. void lcm_w_mm(void){
  563.         if(read_clock(0x83) != mm){//如果1302芯片中的分鐘數(shù)據(jù)與程序中的分鐘變量不相等               
  564.                 mm = read_clock(0x83);//刷新程序中的分鐘數(shù)據(jù)
  565.         }
  566.                                        
  567.         lcm_w_test(0,0x89);//寫指令,指定顯示位置為89H(第二行的第二個(gè)字符)        
  568.         lcm_w_test(1,0x3a);          //":"寫數(shù)據(jù),顯示冒號(hào),采用直接指定冒號(hào)的液晶內(nèi)定顯示碼的方法
  569.         lcm_w_test(1,(mm/16)+0x30);//向液晶寫數(shù)據(jù),顯示分鐘的十位數(shù)
  570.         lcm_w_test(1,mm%16+0x30);//向液晶寫數(shù)據(jù),顯示分鐘的個(gè)位數(shù)
  571.    lcm_w_test(1,0x3a);          //":"寫數(shù)據(jù),顯示冒號(hào),采用直接指定冒號(hào)的液晶內(nèi)定顯示碼的方法
  572. }


  573. void lcm_w_mm2(void){
  574. if(read_clock(0x83) != mm){//如果1302芯片中的分鐘數(shù)據(jù)與程序中的分鐘變量不相等               
  575.                 mm = read_clock(0x83);//刷新程序中的分鐘數(shù)據(jù)
  576.         }
  577.         
  578.         lcm_w_test(0,0x9b);//寫指令,指定顯示位置為89H(第二行的第二個(gè)字符)        
  579.    lcm_w_word("  ");
  580.         lcm_w_test(1,(mm/16)+0x30);//向液晶寫數(shù)據(jù),顯示分鐘的十位數(shù)
  581.         lcm_w_test(1,mm%16+0x30);//向液晶寫數(shù)據(jù),顯示分鐘的個(gè)位數(shù)
  582.         lcm_w_word("  分");
  583. }

  584. /*****************************************************************************/
  585. //向LCM中填寫 秒 數(shù)據(jù) 和溫度數(shù)據(jù)
  586. void lcm_w_ss(void)
  587. {
  588.         unsigned int i=0;
  589.         unsigned char a=0,b=0,c=0;
  590.         if(read_clock(0x81) != ss)
  591.         {        //判斷是否需要更新,如果1302芯片中的秒數(shù)據(jù)與程序秒變量不同
  592.                 ss = read_clock(0x81);        //更新程序中的秒數(shù)據(jù)
  593.                 lcm_w_test(0,0x8b);                //指定秒值在LCM上的顯示位置是8BH
  594.                 lcm_w_test(1,(ss/16)+0x30);        //顯示秒十位               
  595.                 lcm_w_test(1,ss%16+0x30);        //顯示秒個(gè)位(除以16,取余數(shù))
  596.                 led_b = ~led_b;
  597.                 updata ();        //刷新數(shù)據(jù)子函數(shù)

  598.                 lcm_w_test(0,0x95);                //指定溫度在LCM上的顯示位置為8DH               
  599.                 i=ReadTemperature();//讀溫度并送顯,調(diào)用了18B20的讀取溫度函數(shù)返回值,共3位,含十分之一位數(shù)字
  600.                 a=i/100;//得到十位上的數(shù)字
  601.                 lcm_w_test(1,a+0x30);        //參數(shù)1,表示該行寫數(shù)據(jù),換算顯示溫度十位數(shù)字的顯示碼
  602.                 b=i/10-a*10;//處理得到第二位數(shù)字(個(gè)位)
  603.                 lcm_w_test(1,b+0x30);        //參數(shù)1,表示該行寫的是數(shù)據(jù),顯示溫度個(gè)位數(shù)字
  604.                 lcm_w_test(1,0x2e);         //"."參數(shù)1,表示該行寫的數(shù)據(jù),顯示一個(gè)小數(shù)點(diǎn)
  605.                 c=i-a*100-b*10;//取得溫度的第三位(最末尾,也就是小數(shù)點(diǎn)后的一位數(shù)字
  606.                 lcm_w_test(1,c+0x30); //換算小數(shù)點(diǎn)后的一位數(shù)字的顯示碼(加0x30),并顯示               
  607.                 lcm_w_word("℃");        //調(diào)用字符顯示函數(shù),顯示攝氏度的符號(hào)
  608.    }        
  609. }

  610. void jie(void)//公歷和農(nóng)歷節(jié)日按照一秒間隔輪換顯示(節(jié)日顯示)
  611. {
  612. unsigned char ss;
  613. ss = read_clock(0x81);
  614.     if(ss%16==0){jie_gl();}        //每隔5秒調(diào)用公歷節(jié)氣顯示子函數(shù)
  615.         if(ss%16==5){jie_nl();}        //每隔5秒調(diào)用農(nóng)歷顯示子函數(shù)
  616. }
  617. /******************************************************************************/

  618. /*****************************************************************************/
  619. //刷新數(shù)據(jù)子函數(shù),供調(diào)用,在這段程序之前已經(jīng)調(diào)用過
  620. void updata (void){

  621.                 lcm_w_mm();//刷新 分
  622.                 lcm_w_hh();//刷新 小時(shí)
  623.                 lcm_w_dd();//刷新 日
  624.                 lcm_w_xq();//更新星期值        
  625.                 lcm_w_mo();//刷新 月
  626.                 lcm_w_yy();//刷新 年
  627.         lcm_w_nl();//刷新農(nóng)歷
  628.         jie();//刷新節(jié)日顯示
  629.                 lcm_w_sd();        //刷新濕度

  630. }
  631. /*****************************************************************************/
  632. void welcome(void){//開機(jī)歡迎顯示內(nèi)容,標(biāo)尺不能改動(dòng),文字不要對(duì)準(zhǔn)橫線之間的空隙
  633.         lcm_w_word("   DIY溫濕度計(jì)  重要提醒節(jié)日生日   2013/01/16     QQ:380760010  ");//
  634.         //----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//標(biāo)尺
  635. }
  636. //標(biāo)尺能提示文字顯示的位置在哪一行,是否在中心

  637. /*****************************************************************************/
  638. //調(diào)整時(shí)間子函數(shù),設(shè)置鍵、數(shù)據(jù)范圍、上調(diào)加一,下調(diào)減一功能。
  639. void Set_time(unsigned char sel){ //根據(jù)選擇調(diào)整的相應(yīng)項(xiàng)目加1并寫入DS1302,函數(shù)參數(shù)是按動(dòng)設(shè)置鍵的次數(shù)
  640.   

  641.   lcm_w_test(0,0x9b);//第一參數(shù)0表示本行寫入指令,指定下面行的 調(diào)整 顯示起始位置為9AH
  642.   lcm_w_word("★調(diào)整");//調(diào)用字符顯示函數(shù),顯示 調(diào)整字樣
  643.   
  644.   //if(sel==6)  {lcm_w_word("秒鐘");address=0x80; max=0;mini=0;}     //秒7,沒有必要調(diào)了

  645.   if(sel==4)  {lcm_w_word("分鐘");address=0x82; max=59;mini=0;
  646.    lcm_w_mm2();
  647.    ds_w();
  648.    lcm_w_mm2();
  649.   
  650.   }    //分鐘6,按動(dòng)6次顯示 調(diào)整分鐘
  651.   //并指定分鐘數(shù)據(jù)寫入1302芯片的地址是0x82,分鐘數(shù)據(jù)的最大值是59,最小值是0


  652.   if(sel==3)  {lcm_w_word("小時(shí)");address=0x84; max=23;mini=0;
  653.   
  654.     lcm_w_hh2();
  655.     ds_w();
  656.     lcm_w_hh2();
  657.   
  658.   }    //小時(shí)5,按動(dòng)5次顯示 調(diào)整小時(shí)
  659.   //規(guī)定小時(shí)數(shù)據(jù)寫入1302芯片的位置是0x84,小時(shí)數(shù)據(jù)最大值23,最小值是0
  660.   

  661.                     if(sel==2)  {lcm_w_word("日期");
  662.                address=0x86;

  663.                mo = read_clock(0x89);//讀月
  664.                                         moontemp1=mo/16;
  665.                                         moontemp2=mo%16;
  666.                                         mo=moontemp1*10+moontemp2;//轉(zhuǎn)換成10進(jìn)制月份數(shù)據(jù)

  667.                yy = read_clock(0x8d);//讀年
  668.                moontemp1=yy/16;
  669.                                         moontemp2=yy%16;
  670.                                         yy=moontemp1*10+moontemp2;//轉(zhuǎn)換成10進(jìn)制年份數(shù)據(jù)

  671.                     if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天
  672.                                         if(mo==2&&yy%4==0){max=29;mini=1;}//閏年2月29天
  673.                                         if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//31天的月份
  674.                                         if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;}//30天的月份
  675.     lcm_w_dd2();
  676.     ds_w();
  677.     lcm_w_dd2();
  678.   }    //日3,按動(dòng)3次顯示 調(diào)整日期
  679.   //規(guī)定日期數(shù)據(jù)寫入2302的位置地址是0x86,日期最大值31,最小值是1



  680.                    if(sel==1)  {lcm_w_word("月份");address=0x88; max=12;mini=1;
  681.     lcm_w_mo2();
  682.          ds_w();
  683.     lcm_w_mo2();
  684.   
  685.       }    //月2,按動(dòng)2次顯示 調(diào)整月份
  686.   //規(guī)定月份寫入1302的位置地址是0x88,月份最大值12,最小值1


  687.                    if(sel==0)  {lcm_w_word("年份");address=0x8c; max=99; mini=0;
  688.      lcm_w_yy2();
  689.      ds_w();
  690.      lcm_w_yy2();

  691.      }    //年1,按動(dòng)1次顯示 調(diào)整年份,
  692.   //規(guī)定年份寫入1302的地址是0x8c,年份的最大值99,最小值0

  693. }
  694. /*****************************************************************************/
  695. //被調(diào)數(shù)據(jù)加一或減一,并檢查數(shù)據(jù)范圍,寫入1302指定地址保存
  696. void ds_w(void){

  697. item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  698.   if(KEY_2 == 0){//如果按動(dòng)上調(diào)鍵
  699.           item++;//數(shù)加 1  
  700.   }
  701.   if(KEY_4 == 0){//如果按動(dòng)下調(diào)鍵
  702.           item--;//數(shù)減 1
  703.   }
  704.   if(item>max) item=mini;//查看數(shù)值是否在有效范圍之內(nèi)   
  705.   if(item<mini) item=max;//如果數(shù)值小于最小值,則自動(dòng)等于最大值           
  706.   write_clock(0x8e,0x00);//允許寫1302芯片操作
  707.   write_clock(address,(item/10)*16+item%10);//轉(zhuǎn)換成16進(jìn)制寫入1302
  708.   write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
  709.   }

  710. /********************************************************************/
  711. //向LCM中填寫 農(nóng)歷年月日數(shù)據(jù)
  712. void lcm_w_nl(void){

  713.       dd = read_clock(0x87);//日
  714.            mo = read_clock(0x89);//月
  715.            yy = read_clock(0x8d);//年
  716.       Conversion(0,yy,mo,dd);//調(diào)用公歷轉(zhuǎn)農(nóng)歷子函數(shù)
  717.   //調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀c_moon農(nóng)歷世紀(jì),year_moon農(nóng)歷年,month_moon,day_moon得出陰歷BCD數(shù)據(jù)
  718.                 lcm_w_test(0,0x90);
  719.         if (month_moon==0x01) {lcm_w_test(1,0xd5);lcm_w_test(1,0xfd);} //正
  720.         if (month_moon==0x02) {lcm_w_word("二");}
  721.         if (month_moon==0x03) {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //三
  722.         if (month_moon==0x04) {lcm_w_word("四");}
  723.         if (month_moon==0x05) {lcm_w_word("五");}
  724.         if (month_moon==0x06) {lcm_w_word("六");}
  725.         if (month_moon==0x07) {lcm_w_word("七");}
  726.         if (month_moon==0x08) {lcm_w_word("八");}
  727.         if (month_moon==0x09) {lcm_w_word("九");}
  728.         if (month_moon==0x10) {lcm_w_word("十");}
  729.         if (month_moon==0x11) {lcm_w_word("冬");}
  730.         if (month_moon==0x12) {lcm_w_word("臘");}
  731.                            lcm_w_word("月");

  732.         if (day_moon==0x01)   {lcm_w_word("初一");}
  733.         if (day_moon==0x02)   {lcm_w_word("初二");}
  734.         if (day_moon==0x03)   {lcm_w_word("初");lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //“三”的代碼
  735.         if (day_moon==0x04)   {lcm_w_word("初四");}
  736.         if (day_moon==0x05)   {lcm_w_word("初五");}
  737.         if (day_moon==0x06)   {lcm_w_word("初六");}
  738.         if (day_moon==0x07)   {lcm_w_word("初七");}
  739.         if (day_moon==0x08)   {lcm_w_word("初八");}
  740.         if (day_moon==0x09)   {lcm_w_word("初九");}
  741.         if (day_moon==0x10)  {lcm_w_word("初十");}
  742.         if (day_moon==0x11)  {lcm_w_word("十一");}
  743.         if (day_moon==0x12)  {lcm_w_word("十二");}
  744.         if (day_moon==0x13)  {lcm_w_word("十");lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //十三
  745.         if (day_moon==0x14)  {lcm_w_word("十四");}
  746.         if (day_moon==0x15)  {lcm_w_word("十五");}
  747.         if (day_moon==0x16)  {lcm_w_word("十六");}
  748.         if (day_moon==0x17)  {lcm_w_word("十七");}
  749.         if (day_moon==0x18)  {lcm_w_word("十八");}
  750.         if (day_moon==0x19)  {lcm_w_word("十九");}
  751.         if (day_moon==0x20)  {lcm_w_word("二十");}
  752.         if (day_moon==0x21)  {lcm_w_word("廿一");}
  753.         if (day_moon==0x22)  {lcm_w_word("廿二");}
  754.         if (day_moon==0x23)  {lcm_w_word("廿");lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);}        //廿三
  755.         if (day_moon==0x24)  {lcm_w_word("廿四");}
  756.         if (day_moon==0x25)  {lcm_w_word("廿五");}
  757.         if (day_moon==0x26)  {lcm_w_word("廿六");}
  758.         if (day_moon==0x27)  {lcm_w_word("廿七");}
  759.         if (day_moon==0x28)  {lcm_w_word("廿八");}
  760.         if (day_moon==0x29)  {lcm_w_word("廿九");}
  761.         if (day_moon==0x30)  {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);lcm_w_word("十");}        //三十                        
  762. }        


  763. /*****************************************************************************/
  764. //---主程序---//
  765. /*****************************************************************************/
  766. main() {
  767.         unsigned char e=0;
  768.         //KEY_I = 1;

  769.         KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;KEY_5=1;//初始鍵盤
  770.         beep=0;//因?yàn)橛?014三極管驅(qū)動(dòng)蜂鳴器,所以beep=1時(shí),蜂鳴器響
  771.     led_back=0;
  772.         yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各數(shù)據(jù)刷新
  773.         Beep();//鳴響一聲        
  774.         Init_1302();//初始化1302時(shí)鐘芯片
  775.         lcm_init();//初始化液晶顯示器
  776.         lcm_clr();//清屏
  777.         welcome();//顯示歡迎信息,顯示歡迎函數(shù)內(nèi)設(shè)定的內(nèi)容
  778.         DelayM(6000); //歡迎信息顯示停留1秒
  779.    lcm_init();//
  780.    lcm_w_nl();//
  781.    lcm_w_sd();
  782.   
  783. /*****************************************************************************/
  784. while(1){//主循環(huán)
  785.                   
  786.                if (KEY_5 ==0) // 按下背光控制
  787.               {
  788.                        DelayM(20);//防抖
  789.                         
  790.                        if(KEY_5 == 0){                                
  791.                                 Beep_key();//確定按鍵音
  792.                            led_back =~led_back; //改變背光狀態(tài)
  793.                                  
  794.                                 }        
  795.                                         while(KEY_5 == 0);//等待鍵松開
  796.            }      



  797.                 if (w == 0){   //W為程序頭段規(guī)定的正常走時(shí)標(biāo)志位,=0時(shí)說明在正常走時(shí)
  798.                 lcm_w_ss();//刷新 秒
  799.                 }
  800.                 else {                //否則(W!=0的情況下就是調(diào)時(shí)狀態(tài))啟動(dòng)調(diào)時(shí)
  801.                 }
  802.                 //------------------------------------------------------------------
  803.                 if (KEY_3 == 0) // 按下設(shè)置鍵
  804.               {
  805.                        DelayM(20);           //去抖
  806.                 //        led_g3 = 0;led_r = 1;
  807.                         if(KEY_3 == 0 && w == 1)  //如果按下設(shè)置鍵時(shí),系統(tǒng)是調(diào)時(shí)狀態(tài) 本鍵用于調(diào)整下一項(xiàng)
  808.                         {
  809.                                 Beep_key();//按鍵音
  810.                                 e++;
  811.                                 if (e >= 6 ){e = 0;}
  812.                                 Set_time(e);//調(diào)用調(diào)整時(shí)間子函數(shù)                                
  813.                         }


  814.                         if(KEY_3 == 0 && w == 0)  //如果按下設(shè)置鍵時(shí),系統(tǒng)正在正常走時(shí)狀態(tài)時(shí)就進(jìn)入調(diào)時(shí)狀態(tài)
  815.                         {
  816.                                 Beep_set();//確定按鍵音
  817.                         //        led_b = 1;//
  818.                                 lcm_clr();//清屏
  819.             lcm_clr2();//清前三行屏幕顯示
  820.                                 w=1;          //進(jìn)入調(diào)時(shí),w是正常走時(shí)的標(biāo)志位,=1進(jìn)入調(diào)試狀態(tài),=0進(jìn)入正常走時(shí)狀態(tài)
  821.                                        
  822.                                 Set_time(e);//調(diào)用調(diào)整時(shí)間子函數(shù)
  823.                         }
  824.                        while(KEY_3 == 0);//等待鍵松開
  825.                
  826.               }
  827.                 //------------------------------------------------------------------
  828.                 if (KEY_1 == 0) // 按下退出鍵Esc,當(dāng)在調(diào)時(shí)狀態(tài)時(shí)就退出調(diào)時(shí)
  829.               {
  830.                        DelayM(20);
  831.                 //        led_g1 = 0;led_r = 1;
  832.                        if(KEY_1 == 0 && w == 1){        //如果w==1說明在調(diào)時(shí)狀態(tài),按動(dòng)這個(gè)鍵,退出調(diào)時(shí)                        
  833.                                 Beep_set();//確定按鍵音
  834.                                 w = 0;          //退出調(diào)時(shí),進(jìn)入正常走時(shí)狀體
  835.                                 e = 0;        //設(shè)置鍵功能循環(huán)中控制顯示 下一項(xiàng) 的參數(shù)歸0        
  836.                     lcm_w_nl();//刷新農(nóng)歷顯示
  837.                         
  838.                         }
  839.                         if(KEY_1 == 0 && w == 0){                                
  840.                                 lcm_clr();//清屏
  841.                                 lcm_w_test(0,0x80);
  842.                                 welcome();//顯示歡迎信息
  843.                                 while(KEY_1 == 0);//等待鍵松開  
  844.                         }
  845.                                 lcm_clr();//清屏
  846.                         
  847.                                 updata ();        //刷新數(shù)據(jù)
  848.                                 lcm_w_mm();//刷新 分

  849.             lcm_w_nl();//
  850.                
  851.                        while(KEY_1 == 0);//等待鍵松開  
  852.               }
  853.                 //------------------------------------------------------------------
  854.                 if (KEY_2 == 0 && w == 1){ // 加減調(diào)整,KEY_2為上調(diào)鍵,如果上調(diào)鍵按下,且系統(tǒng)在調(diào)時(shí)狀態(tài){
  855.                        DelayM(20); //延時(shí)消抖動(dòng)20毫秒
  856.                        if(KEY_2 == 0 && w == 1){        //確認(rèn)上調(diào)鍵是按下的                        
  857.                                 Beep_key();//按鍵音
  858.                                 Set_time(e);//調(diào)用調(diào)時(shí)子函數(shù)
  859.                
  860.                         }
  861.                        while(KEY_2 == 0);//等待鍵松開
  862.               }
  863.                 //------------------------------------------------------------------
  864.                 if (KEY_4 == 0 && w == 1){ // 加減調(diào)整,KEY_4為下調(diào)鍵,如果下調(diào)鍵按下而且系統(tǒng)在調(diào)時(shí)狀態(tài)              
  865.                        DelayM(20);        //延時(shí)消抖動(dòng)20毫秒
  866.                             if(KEY_4 == 0 && w == 1){        //確定下調(diào)鍵是按下的                        
  867.                                 Beep_key();//按鍵音
  868.                                 Set_time(e);//調(diào)用調(diào)時(shí)的子函數(shù)
  869.                         }
  870.                        while(KEY_4 == 0);//等待鍵松開
  871.               }
  872. }        }        
  873. /***************************************************************************/
復(fù)制代碼


萬年歷全部設(shè)計(jì)文件.rar

411.13 KB, 下載次數(shù): 697, 下載積分: 黑幣 -5

歡迎下載

評(píng)分

參與人數(shù) 8黑幣 +41 收起 理由
changhz + 5
qjzyx + 6 贊一個(gè)!
嬌1103 + 5 贊一個(gè)!
a416117858 + 5
zhaok2013 + 5 很給力!
sxencon + 5
ssfc + 5 贊一個(gè)!
madell + 5 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:73168 發(fā)表于 2015-2-5 19:16 | 顯示全部樓層
好啊,正好有用。

評(píng)分

參與人數(shù) 3黑幣 +12 收起 理由
zhouqiang + 5 共享資料的黑幣獎(jiǎng)勵(lì)!
唐131 + 2 贊一個(gè)!一直在找的程序
Fsy + 5

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:73617 發(fā)表于 2015-2-13 18:13 | 顯示全部樓層

好啊,正好有用。
回復(fù)

使用道具 舉報(bào)

ID:73617 發(fā)表于 2015-2-13 18:14 | 顯示全部樓層

好啊,正好
回復(fù)

使用道具 舉報(bào)

ID:67678 發(fā)表于 2015-2-14 19:44 | 顯示全部樓層
謝謝樓主分享。
回復(fù)

使用道具 舉報(bào)

ID:70614 發(fā)表于 2015-2-14 19:59 | 顯示全部樓層
有什么不會(huì)的問題真的可以問你嗎
回復(fù)

使用道具 舉報(bào)

ID:73870 發(fā)表于 2015-2-25 16:40 | 顯示全部樓層
不錯(cuò),想看看
回復(fù)

使用道具 舉報(bào)

ID:75864 發(fā)表于 2015-4-1 11:23 | 顯示全部樓層
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:74143 發(fā)表于 2015-4-3 14:45 | 顯示全部樓層
下載學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

ID:72399 發(fā)表于 2015-4-6 09:34 | 顯示全部樓層
下載來學(xué)習(xí)學(xué)習(xí)吧
回復(fù)

使用道具 舉報(bào)

ID:72399 發(fā)表于 2015-4-6 09:35 | 顯示全部樓層
星星一眨眼 發(fā)表于 2015-2-14 19:59
有什么不會(huì)的問題真的可以問你嗎

可以的啊
回復(fù)

使用道具 舉報(bào)

ID:73962 發(fā)表于 2015-4-6 12:17 | 顯示全部樓層

RE: 歡迎下載萬年歷


什么型式的萬年歷?
點(diǎn)陣屏的,還是數(shù)碼管的?
回復(fù)

使用道具 舉報(bào)

ID:73962 發(fā)表于 2015-4-6 12:18 | 顯示全部樓層
有配套電路圖,和源程序嗎?
回復(fù)

使用道具 舉報(bào)

ID:72399 發(fā)表于 2015-4-6 20:21 | 顯示全部樓層
有啊里面沒有電路圖不過看程序也會(huì)畫了的
回復(fù)

使用道具 舉報(bào)

ID:77945 發(fā)表于 2015-4-28 19:00 | 顯示全部樓層
怎么 都不上仿真
回復(fù)

使用道具 舉報(bào)

ID:81190 發(fā)表于 2015-5-26 16:18 | 顯示全部樓層
有效果圖片沒有呢
回復(fù)

使用道具 舉報(bào)

ID:81407 發(fā)表于 2015-5-28 21:49 | 顯示全部樓層
大哥,PCB 圖呢
回復(fù)

使用道具 舉報(bào)

ID:81407 發(fā)表于 2015-5-28 21:50 | 顯示全部樓層
哥,急求源pcb圖,在線等,加q,1903436056.
回復(fù)

使用道具 舉報(bào)

ID:92810 發(fā)表于 2015-12-9 13:32 | 顯示全部樓層
正好需要這個(gè)的。。。
回復(fù)

使用道具 舉報(bào)

ID:99009 發(fā)表于 2015-12-9 17:46 | 顯示全部樓層
有仿真圖嗎?
回復(fù)

使用道具 舉報(bào)

ID:108622 發(fā)表于 2016-3-25 06:49 來自手機(jī) | 顯示全部樓層
電路圖呢
回復(fù)

使用道具 舉報(bào)

ID:108143 發(fā)表于 2016-3-29 00:08 | 顯示全部樓層
看下資料,估計(jì)能用上
回復(fù)

使用道具 舉報(bào)

ID:91691 發(fā)表于 2016-3-29 11:50 | 顯示全部樓層
謝謝樓主分享。
回復(fù)

使用道具 舉報(bào)

ID:106211 發(fā)表于 2016-4-20 10:29 | 顯示全部樓層
先下了看看
回復(fù)

使用道具 舉報(bào)

ID:106211 發(fā)表于 2016-4-20 10:53 | 顯示全部樓層
謝謝樓主分享。正好用上
回復(fù)

使用道具 舉報(bào)

ID:106211 發(fā)表于 2016-4-20 10:55 | 顯示全部樓層
不知道還能帶20P大點(diǎn)的屏嗎
回復(fù)

使用道具 舉報(bào)

ID:115455 發(fā)表于 2016-4-20 15:30 | 顯示全部樓層
謝謝樓主分享。正好用上
回復(fù)

使用道具 舉報(bào)

ID:114284 發(fā)表于 2016-4-24 09:36 | 顯示全部樓層
請(qǐng)問樓主,怎么復(fù)制進(jìn)工程,編譯時(shí)提示錯(cuò)誤呢
回復(fù)

使用道具 舉報(bào)

ID:109731 發(fā)表于 2016-4-24 16:06 | 顯示全部樓層
有PCB圖嗎?
回復(fù)

使用道具 舉報(bào)

ID:116890 發(fā)表于 2016-4-26 19:52 | 顯示全部樓層
有用,支持一下,期待新作品
回復(fù)

使用道具 舉報(bào)

ID:116894 發(fā)表于 2016-4-26 20:15 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:117047 發(fā)表于 2016-5-1 16:34 | 顯示全部樓層
感謝分享!。!
回復(fù)

使用道具 舉報(bào)

ID:71115 發(fā)表于 2016-5-6 21:16 | 顯示全部樓層
真是好東西,真好學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

ID:63646 發(fā)表于 2016-5-7 00:32 | 顯示全部樓層
真是好東西,真好學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

ID:119032 發(fā)表于 2016-5-7 12:10 | 顯示全部樓層
黑筆不夠下載不了。。
回復(fù)

使用道具 舉報(bào)

ID:119119 發(fā)表于 2016-5-7 19:01 | 顯示全部樓層
是想要的
回復(fù)

使用道具 舉報(bào)

ID:121641 發(fā)表于 2016-5-18 10:10 | 顯示全部樓層
樓主好人,學(xué)習(xí)了。。。。
回復(fù)

使用道具 舉報(bào)

ID:123297 發(fā)表于 2016-5-26 11:12 | 顯示全部樓層
。。。。下載
回復(fù)

使用道具 舉報(bào)

ID:123315 發(fā)表于 2016-5-26 20:16 | 顯示全部樓層
我做的和你不一樣 我遇到問題了 麻煩樓主解答一下我的 東西焊出來 顯示都正常 但是時(shí)間日期不走怎么回事啊樓主
627145707149422281.jpg
回復(fù)

使用道具 舉報(bào)

ID:124587 發(fā)表于 2016-6-2 12:32 | 顯示全部樓層
樓主好人!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表