久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 26954|回復: 76
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
ID:72399 發表于 2015-2-2 23:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
歡迎下載萬年歷,不懂的可以問我

程序如下:
  1. /*********************功能比較齊全實用的萬年歷*********************************************


  2. 功  能:     顯示公歷年、月、日、時、分、秒
  3.                      農歷月、日沒用阿拉伯數字符合國人習慣
  4.                          星期(星期不調,用DS1302內的數據,而是根據公歷年月日推算的)
  5.                          溫度顯示(DS18B20)
  6.                          濕度顯示(DHT11)
  7.                          公歷重大節日顯示
  8.                          農歷紀念日與節日(用于提醒農歷生日非常實用)
  9. 注:1、當農歷紀念日與公歷紀念日碰到同一天,則按5秒的間隔輪流顯示
  10.      2、加入陽歷大小月和平閏年判斷,調日歷時自動控制每個月份的天數
  11.          3、整點提醒等
  12.          4、單片機STC89C54RD+   晶振11.0592MHz
  13.          本程序參考了網上眾多高手的制作而來,在這里謝謝了!
  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板的燈與揚聲器定義
  27. sbit        led_back = P2^3;//背光控制(V2.1程序中加入了背光控制的硬件電路)
  28. //sbit        beep   = P2^6;//揚聲器
  29. sbit    led_b=P1^4;//秒閃動
  30. /*****************************************************************************/
  31. //定做PCB板溫度傳感器引腳定義
  32. /****************************************************************************/
  33. sbit DQ = P2 ^4 ;//ds18B20
  34. /*****************************************************************************/
  35. //鍵盤引腳定義
  36. sbit KEY_1 = P3^1;         //退出設置鍵
  37. sbit KEY_2 = P3^7;         //上調鍵
  38. sbit KEY_3 = P3^0;         //設置鍵
  39. sbit KEY_4 = P3^6;         //下調鍵
  40. sbit KEY_5 = P3^2;         //LED控制每次按動改變背光開關
  41. /****************************************************************************/
  42. //LCD接口定義
  43. sbit RS = P1^1;//模式位,為0輸入指令,為1輸入數據
  44. sbit RW = P1^2;//讀寫位,為0讀,為1寫
  45. sbit E = P1^0;//使能位
  46. #define Lcd_Bus P0 //數據總線
  47. /*****************************************************************************/
  48. //定義DS1302時鐘接口
  49. sbit clock_clk = P2 ^ 0;//ds1302_clk(時鐘線)
  50. sbit clock_dat = P2 ^ 1;//ds1302_dat(數據線)
  51. sbit clock_Rst = P2 ^ 2;//ds1302_Rst(復位線)
  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;//定義時間映射全局變量(專用寄存器)
  65. bit w = 0; //調時標志位,=0時為走時狀態,=1時為調時狀態
  66. static unsigned char menu = 0;//定義靜態小時更新用數據變量
  67. static unsigned char keys = 0;//定義靜態小時更新用數據變量
  68. static unsigned char timecount = 0;//定義靜態軟件計數器變量
  69. signed char address,item,max,mini;
  70. /****************************************************************************/
  71. void DelayM(unsigned int a){//延時函數 1MS/次        
  72.                 unsigned char i;
  73.                 while( --a != 0){               
  74.                         for(i = 0; i < 125; i++);  //一個 ; 表示空語句,CPU空轉。
  75.                 }                                      //i 從0加到125,CPU大概就耗時1毫秒
  76. }
  77. /******************************************************************************/
  78. //LCD驅動(DY12864CBL液晶顯示屏并口驅動程序)
  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){         //寫數據到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屏(被調用層)
  108.    write_com(0x30);       //選擇8bit數據流
  109.    write_com(0x0c);       //開顯示(無游標、不反白)
  110.    write_com(0x01);       //清除顯示,并且設定地址指針為00H
  111. }
  112. /*****************************************************************************/
  113. void lcm_w_word(unsigned char *s){//向LCM發送一個字符串,長度64字符(一行)之內。(被調用層)
  114.         while(*s>0){                                        //應用:lcm_w_word("您好!"),直接顯示:您好!
  115.             write_data(*s);
  116.             s++;
  117.    }
  118. }
  119. /******************************************************************************/
  120. void lcm_w_test(bit i,unsigned char word){//寫指令或數據(被調用層)
  121.         if(i == 0){
  122.                 write_com(word);//寫指令或數據(0,指令)
  123.         }else{
  124.                 write_data(word);//寫指令或數據(1,數據)
  125.         }
  126. }
  127. /******************************************************************************/
  128. void lcm_clr(void){//清屏函數
  129.         lcm_w_test(0,0x01);        
  130. }
  131. /******************************************************************************/
  132. void lcm_clr2(void){//清屏上面3行(用空格填滿要清顯示的地方,因為液晶屏是靜態顯示的,所以這辦法常用)
  133.         lcm_w_test(0,0x80);//第一行
  134.         lcm_w_word("                ");
  135.             //標尺("1234567812345678"應該能夠顯示滿一行)
  136.    lcm_w_test(0,0x90);//第二行
  137.         lcm_w_word("                ");
  138.             //標尺("1234567812345678"應該能夠顯示滿一行)
  139.    lcm_w_test(0,0x88);//第一行
  140.         lcm_w_word("                ");
  141.             //標尺("1234567812345678"應該能夠顯示滿一行)
  142.    }
  143. /******************************************************************************/
  144. //DS18B20溫度傳感器驅動(顯示0至60度,小數點后顯示一位)
  145. /******************************************************************************/
  146. void Delay1820(int num){//延時函數
  147.         while(num--) ;
  148. }        
  149. /******************************************************************************/
  150. void Init_DS18B20(void){//初始化ds1820
  151.         unsigned char x=0;
  152.         DQ = 1;    //DQ復位
  153.         Delay1820(8);  //稍做延時
  154.         DQ = 0;    //單片機將DQ拉低
  155.         Delay1820(80); //精確延時 大于 480us
  156.         DQ = 1;    //拉高總線
  157.         Delay1820(14);
  158.         x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  159.         Delay1820(20);
  160. }
  161. /******************************************************************************/
  162. unsigned char ReadOneChar(void){//讀一個字節
  163.         unsigned char i=0;
  164.         unsigned char dat = 0;
  165.         for (i=8;i>0;i--){
  166.                 DQ = 0; // 給脈沖信號
  167.                 dat>>=1;
  168.                 DQ = 1; // 給脈沖信號
  169.                 if(DQ)
  170.                 dat|=0x80;
  171.                 Delay1820(4);
  172.         }
  173.         return(dat);
  174. }
  175. /******************************************************************************/
  176. void WriteOneChar(unsigned char dat){//寫一個字節
  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){//讀取溫度,溫度值返回到此函數中,供調用
  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); // 跳過讀序號列號的操作
  194.         WriteOneChar(0x44); // 啟動溫度轉換
  195.         Init_DS18B20();
  196.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  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內的溫度值,返回到子函數中,要將溫度傳輸到temp變量,應用temp=ReabTemperature()
  206. }
  207. /******************************************************************************/
  208. //后面會出現的函數聲明(當各函數的排列適當時可不用聲明,加入函數聲明就不用管各個子函數出現的位置先后了?)
  209. void lcm_w_ss(void);//向液晶LCM中寫秒數據
  210. void lcm_w_mm(void);//向液晶LCM中寫分數據
  211. void lcm_w_hh(void);//向液晶LCM中寫小時數據
  212. void lcm_w_dd(void);//寫日數據
  213. void lcm_w_mo(void);//寫月數據
  214. void lcm_w_yy(void);//寫年數據
  215. void lcm_w_xq(void);//星期處理并送入LCM的指定區域
  216. unsigned char clock_in(void);//DS1302逐位寫入字節(底層協議)
  217. void clock_out(unsigned char dd);//1302驅動程序逐位讀出字節(底層協議?
  218. void Init_1302(void);//-設置1302的初始時間(2007年1月1日00時00分00秒星期一)
  219. unsigned char read_clock(unsigned char ord);//DS1302讀數據(底層協議)
  220. void read_clockS(void);
  221. void Set_time(unsigned char sel);//根據選擇調整的相應項目sel加1并寫入DS1302
  222. void write_clock(unsigned char ord, unsigned char dd);//DS1302寫數據(底層協議)
  223. void updata (void);        
  224. //void lcm_w_sd(void);//寫入濕度數據
  225. void lcm_w_nl(void);//顯示農歷子函數
  226. void Conversion(bit c,unsigned char year,unsigned char month,unsigned char day); //農歷年月日計算子函數
  227. void Conver_week(bit c,unsigned char year,unsigned char month,unsigned char day);//星期計算子函數
  228. void ds_w(void);

  229. /*****************************************************************************/
  230. //設置1302的初始時間(自動初始化)
  231. void Init_1302(void){//-設置1302的初始時間(2007年1月1日00時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);//小時
  240.                 write_clock(0x82,0x55);//分鐘
  241.                 write_clock(0x80,0x23);//秒
  242.                 write_clock(0x90,0xa5);//充電        
  243.                 write_clock(0xc0,0xaa);//寫入初始化標志RAM(第00個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寫數據(底層協議)
  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驅動程序逐位讀出字節(底層協議)
  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逐位寫入字節(底層協議)
  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讀數據(底層協議)供調用時鐘數據
  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. //揚聲器驅動程序(鬧鐘音樂)
  303. /*****************************************************************************/        
  304. void Beep(void){//BELL-揚聲器--整點報時
  305.         unsigned char a;//定義變量用于發聲的長度設置
  306.         for(a=60;a>0;a--){//第一個聲音的長度
  307.                 beep = ~beep;//取反揚聲器驅動口,以產生音頻
  308.                 Delay1820(100);//音調設置延時
  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;//音樂結束后揚聲器輸出0關閉,因為后端用9014驅動,所以控制輸出1時蜂鳴響
  319. }
  320. /*****************************************************************************/
  321. void Beep_set(void){//BELL -揚聲器--確定設置
  322.         unsigned char a;//定義變量用于發聲的長度設置
  323.         for(a=50;a>0;a--){//第一個聲音的長度
  324.                 beep = ~beep;//取反揚聲器驅動口,以產生音頻
  325.                 Delay1820(100);//音調設置延時
  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;//音樂結束后揚聲器輸出0關閉,因為后端用9014反相驅動,所以控制輸出0時蜂鳴響
  336. }
  337. /*****************************************************************************/
  338. void Beep_key(void){//-揚聲器--按鍵音
  339.         unsigned char a;//定義變量用于發聲的長度設置
  340.         for(a=100;a>0;a--){//聲音的長度
  341.                 beep = ~beep;
  342.                 Delay1820(50);//音調設置延時
  343.         }
  344.         beep = 0;//音樂結束后揚聲器拉高關閉
  345. }               

  346. /******************************************************************************/
  347. //農歷節日數據庫表,農歷紀念日數據表,加上公歷的重大節日
  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);//調用公歷轉農歷子函數
  354.   //調用函數后,原有數據不變,讀c_moon農歷世紀,year_moon農歷年,month_moon,day_moon得出陰歷BCD數據        

  355.         
  356.       lcm_w_test(0,0x98);//在屏幕第四行顯示節日(下面的注釋行用坐標尺,不要改動)
  357. //農歷節日:
  358. //                                                                                                                   ----|----------------|標尺,漢字不要對在空隙上
  359.           if ( month_moon == 0x12 && day_moon == 0x29 ){ lcm_w_word("  明天是春節!!"); }
  360.       if ( month_moon == 0x12 && day_moon == 0x30 ){ lcm_w_word("  今天是春節!!"); }
  361.       if ( month_moon == 0x01 && day_moon == 0x01 ){ lcm_w_word("大年初一拜年啦  "); }
  362.       if ( month_moon == 0x01 && day_moon == 0x14 ){ lcm_w_word("  明天元宵節!  "); }
  363.       if ( month_moon == 0x01 && day_moon == 0x15 ){ lcm_w_word("  元宵節到啦!   "); }
  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("牛郎織女鵲橋相會"); }
  368.       if ( month_moon == 0x08 && day_moon == 0x14 ){ lcm_w_word("  明天仲秋節    "); }
  369.       if ( month_moon == 0x08 && day_moon == 0x15 ){ lcm_w_word("    仲秋佳節    "); }
  370.           if ( month_moon == 0x09 && day_moon == 0x08 ){ lcm_w_word("    明天重陽    "); }
  371.       if ( month_moon == 0x09 && day_moon == 0x09 ){ lcm_w_word("    今天重陽節  "); }
  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);//調用公歷轉農歷子函數
  385.         //調用函數后,原有數據不變,讀c_moon農歷世紀,year_moon農歷年,month_moon,day_moon得出陰歷BCD數據        

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

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

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

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

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

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

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

  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("  今天圣誕節    "); }
  437.                 if ( mo == 0x12 && dd == 0x31 ){ lcm_w_word("    明日元旦    "); }

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

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

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

  469. /*****************************************************************************/
  470. //向LCM中填寫 月 數據
  471. void lcm_w_mo(void){
  472.                 mo = read_clock(0x89);//調用1302時鐘數據中的月數據,從地址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取余數,得到月份的個位數,加0x30得到該數字的液晶內定顯示碼送顯示
  477.                 lcm_w_word("-");//調用字符顯示函數,顯示文字 月
  478. }        


  479. //向LCM中填寫調月時 月 數據顯示格式(調月時調用顯示格式)
  480. void lcm_w_mo2(void){
  481.                 mo = read_clock(0x89);//調用1302時鐘數據中的月數據,從地址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取余數,得到月份的個位數,加0x30得到該數字的液晶內定顯示碼送顯示
  486.                 lcm_w_word("  月");//調用字符顯示函數,顯示文字 月
  487. }        


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

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

  499. //向LCM中填寫調日期時的 日 數據顯示格式(調日時調用的顯示格式)
  500. void lcm_w_dd2(void){

  501.                 dd = read_clock(0x87);//從1302芯片中讀取日數據,從地址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);//第一個1參數,表示本行寫數據,日數據與16取余得個位數,加0x30得到顯示碼
  506.                 lcm_w_word("  日");//顯示字符 日
  507.                                 
  508. }        

  509. //}/*****************************************************************************/
  510. //星期處理并送入LCM的指定區域
  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);//調用公歷換算星期子函數
  517.    
  518.    sel=week;//week是公歷轉換星期子函數的運行結果,結果為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("三");}經調試發現液晶屏不認這一句,只好用下一句顯示 三
  525.           if(sel==3)  {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因為“三”的內碼失效。
  526.           if(sel==2)  {lcm_w_word("二");}    //
  527.           if(sel==1)  {lcm_w_word("一");}    //星期一
  528.         lcm_w_test(0,0x85);
  529.         lcm_w_word("星期");//調用字符顯示子函數,顯示 星期 兩個字

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


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


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

  584. /*****************************************************************************/
  585. //向LCM中填寫 秒 數據 和溫度數據
  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芯片中的秒數據與程序秒變量不同
  592.                 ss = read_clock(0x81);        //更新程序中的秒數據
  593.                 lcm_w_test(0,0x8b);                //指定秒值在LCM上的顯示位置是8BH
  594.                 lcm_w_test(1,(ss/16)+0x30);        //顯示秒十位               
  595.                 lcm_w_test(1,ss%16+0x30);        //顯示秒個位(除以16,取余數)
  596.                 led_b = ~led_b;
  597.                 updata ();        //刷新數據子函數

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

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

  618. /*****************************************************************************/
  619. //刷新數據子函數,供調用,在這段程序之前已經調用過
  620. void updata (void){

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

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

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

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

  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,按動6次顯示 調整分鐘
  651.   //并指定分鐘數據寫入1302芯片的地址是0x82,分鐘數據的最大值是59,最小值是0


  652.   if(sel==3)  {lcm_w_word("小時");address=0x84; max=23;mini=0;
  653.   
  654.     lcm_w_hh2();
  655.     ds_w();
  656.     lcm_w_hh2();
  657.   
  658.   }    //小時5,按動5次顯示 調整小時
  659.   //規定小時數據寫入1302芯片的位置是0x84,小時數據最大值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;//轉換成10進制月份數據

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

  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,按動3次顯示 調整日期
  679.   //規定日期數據寫入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,按動2次顯示 調整月份
  686.   //規定月份寫入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,按動1次顯示 調整年份,
  692.   //規定年份寫入1302的地址是0x8c,年份的最大值99,最小值0

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

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

  710. /********************************************************************/
  711. //向LCM中填寫 農歷年月日數據
  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);//調用公歷轉農歷子函數
  717.   //調用函數后,原有數據不變,讀c_moon農歷世紀,year_moon農歷年,month_moon,day_moon得出陰歷BCD數據
  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;//因為用9014三極管驅動蜂鳴器,所以beep=1時,蜂鳴器響
  771.     led_back=0;
  772.         yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各數據刷新
  773.         Beep();//鳴響一聲        
  774.         Init_1302();//初始化1302時鐘芯片
  775.         lcm_init();//初始化液晶顯示器
  776.         lcm_clr();//清屏
  777.         welcome();//顯示歡迎信息,顯示歡迎函數內設定的內容
  778.         DelayM(6000); //歡迎信息顯示停留1秒
  779.    lcm_init();//
  780.    lcm_w_nl();//
  781.    lcm_w_sd();
  782.   
  783. /*****************************************************************************/
  784. while(1){//主循環
  785.                   
  786.                if (KEY_5 ==0) // 按下背光控制
  787.               {
  788.                        DelayM(20);//防抖
  789.                         
  790.                        if(KEY_5 == 0){                                
  791.                                 Beep_key();//確定按鍵音
  792.                            led_back =~led_back; //改變背光狀態
  793.                                  
  794.                                 }        
  795.                                         while(KEY_5 == 0);//等待鍵松開
  796.            }      



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


  814.                         if(KEY_3 == 0 && w == 0)  //如果按下設置鍵時,系統正在正常走時狀態時就進入調時狀態
  815.                         {
  816.                                 Beep_set();//確定按鍵音
  817.                         //        led_b = 1;//
  818.                                 lcm_clr();//清屏
  819.             lcm_clr2();//清前三行屏幕顯示
  820.                                 w=1;          //進入調時,w是正常走時的標志位,=1進入調試狀態,=0進入正常走時狀態
  821.                                        
  822.                                 Set_time(e);//調用調整時間子函數
  823.                         }
  824.                        while(KEY_3 == 0);//等待鍵松開
  825.                
  826.               }
  827.                 //------------------------------------------------------------------
  828.                 if (KEY_1 == 0) // 按下退出鍵Esc,當在調時狀態時就退出調時
  829.               {
  830.                        DelayM(20);
  831.                 //        led_g1 = 0;led_r = 1;
  832.                        if(KEY_1 == 0 && w == 1){        //如果w==1說明在調時狀態,按動這個鍵,退出調時                        
  833.                                 Beep_set();//確定按鍵音
  834.                                 w = 0;          //退出調時,進入正常走時狀體
  835.                                 e = 0;        //設置鍵功能循環中控制顯示 下一項 的參數歸0        
  836.                     lcm_w_nl();//刷新農歷顯示
  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 ();        //刷新數據
  848.                                 lcm_w_mm();//刷新 分

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


萬年歷全部設計文件.rar

411.13 KB, 下載次數: 697, 下載積分: 黑幣 -5

歡迎下載

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏26 分享淘帖 頂6 踩
回復

使用道具 舉報

沙發
ID:73168 發表于 2015-2-5 19:16 | 只看該作者
好啊,正好有用。

評分

參與人數 3黑幣 +12 收起 理由
zhouqiang + 5 共享資料的黑幣獎勵!
唐131 + 2 贊一個!一直在找的程序
Fsy + 5

查看全部評分

回復

使用道具 舉報

板凳
ID:73617 發表于 2015-2-13 18:13 | 只看該作者

好啊,正好有用。
回復

使用道具 舉報

地板
ID:73617 發表于 2015-2-13 18:14 | 只看該作者

好啊,正好
回復

使用道具 舉報

5#
ID:67678 發表于 2015-2-14 19:44 | 只看該作者
謝謝樓主分享。
回復

使用道具 舉報

6#
ID:70614 發表于 2015-2-14 19:59 | 只看該作者
有什么不會的問題真的可以問你嗎
回復

使用道具 舉報

7#
ID:73870 發表于 2015-2-25 16:40 | 只看該作者
不錯,想看看
回復

使用道具 舉報

8#
ID:75864 發表于 2015-4-1 11:23 | 只看該作者
學習一下
回復

使用道具 舉報

9#
ID:74143 發表于 2015-4-3 14:45 | 只看該作者
下載學習了。
回復

使用道具 舉報

10#
ID:72399 發表于 2015-4-6 09:34 | 只看該作者
下載來學習學習吧
回復

使用道具 舉報

11#
ID:72399 發表于 2015-4-6 09:35 | 只看該作者
星星一眨眼 發表于 2015-2-14 19:59
有什么不會的問題真的可以問你嗎

可以的啊
回復

使用道具 舉報

12#
ID:73962 發表于 2015-4-6 12:17 | 只看該作者

RE: 歡迎下載萬年歷


什么型式的萬年歷?
點陣屏的,還是數碼管的?
回復

使用道具 舉報

13#
ID:73962 發表于 2015-4-6 12:18 | 只看該作者
有配套電路圖,和源程序嗎?
回復

使用道具 舉報

14#
ID:72399 發表于 2015-4-6 20:21 | 只看該作者
有啊里面沒有電路圖不過看程序也會畫了的
回復

使用道具 舉報

15#
ID:77945 發表于 2015-4-28 19:00 | 只看該作者
怎么 都不上仿真
回復

使用道具 舉報

16#
ID:81190 發表于 2015-5-26 16:18 | 只看該作者
有效果圖片沒有呢
回復

使用道具 舉報

17#
ID:81407 發表于 2015-5-28 21:49 | 只看該作者
大哥,PCB 圖呢
回復

使用道具 舉報

18#
ID:81407 發表于 2015-5-28 21:50 | 只看該作者
哥,急求源pcb圖,在線等,加q,1903436056.
回復

使用道具 舉報

19#
ID:92810 發表于 2015-12-9 13:32 | 只看該作者
正好需要這個的。。。
回復

使用道具 舉報

20#
ID:99009 發表于 2015-12-9 17:46 | 只看該作者
有仿真圖嗎?
回復

使用道具 舉報

21#
ID:108622 發表于 2016-3-25 06:49 來自手機 | 只看該作者
電路圖呢
回復

使用道具 舉報

22#
ID:108143 發表于 2016-3-29 00:08 | 只看該作者
看下資料,估計能用上
回復

使用道具 舉報

23#
ID:91691 發表于 2016-3-29 11:50 | 只看該作者
謝謝樓主分享。
回復

使用道具 舉報

24#
ID:106211 發表于 2016-4-20 10:29 | 只看該作者
先下了看看
回復

使用道具 舉報

25#
ID:106211 發表于 2016-4-20 10:53 | 只看該作者
謝謝樓主分享。正好用上
回復

使用道具 舉報

26#
ID:106211 發表于 2016-4-20 10:55 | 只看該作者
不知道還能帶20P大點的屏嗎
回復

使用道具 舉報

27#
ID:115455 發表于 2016-4-20 15:30 | 只看該作者
謝謝樓主分享。正好用上
回復

使用道具 舉報

28#
ID:114284 發表于 2016-4-24 09:36 | 只看該作者
請問樓主,怎么復制進工程,編譯時提示錯誤呢
回復

使用道具 舉報

29#
ID:109731 發表于 2016-4-24 16:06 | 只看該作者
有PCB圖嗎?
回復

使用道具 舉報

30#
ID:116890 發表于 2016-4-26 19:52 | 只看該作者
有用,支持一下,期待新作品
回復

使用道具 舉報

31#
ID:116894 發表于 2016-4-26 20:15 | 只看該作者
謝謝分享
回復

使用道具 舉報

32#
ID:117047 發表于 2016-5-1 16:34 | 只看該作者
感謝分享。。!
回復

使用道具 舉報

33#
ID:71115 發表于 2016-5-6 21:16 | 只看該作者
真是好東西,真好學習下
回復

使用道具 舉報

34#
ID:63646 發表于 2016-5-7 00:32 | 只看該作者
真是好東西,真好學習下
回復

使用道具 舉報

35#
ID:119032 發表于 2016-5-7 12:10 | 只看該作者
黑筆不夠下載不了。。
回復

使用道具 舉報

36#
ID:119119 發表于 2016-5-7 19:01 | 只看該作者
是想要的
回復

使用道具 舉報

37#
ID:121641 發表于 2016-5-18 10:10 | 只看該作者
樓主好人,學習了。。。。
回復

使用道具 舉報

38#
ID:123297 發表于 2016-5-26 11:12 | 只看該作者
。。。。下載
回復

使用道具 舉報

39#
ID:123315 發表于 2016-5-26 20:16 | 只看該作者
我做的和你不一樣 我遇到問題了 麻煩樓主解答一下我的 東西焊出來 顯示都正常 但是時間日期不走怎么回事啊樓主

627145707149422281.jpg (63.87 KB, 下載次數: 133)

627145707149422281.jpg
回復

使用道具 舉報

40#
ID:124587 發表于 2016-6-2 12:32 | 只看該作者
樓主好人。。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人久久久 | 另类视频在线 | 91香蕉| 欧美久久久久久 | 亚洲人成人一区二区在线观看 | 国产小网站 | 欧美九九九| 夜夜久久 | 一级毛片大全免费播放 | 欧美精品久久一区 | 自拍偷拍亚洲视频 | www.久 | 日韩手机在线看片 | 国产伦精品一区二区三区在线 | 日本一区二区不卡视频 | 久久久亚洲一区 | 99久久精品免费看国产四区 | 99re国产| 精品久久久久久国产 | 日韩一级欧美一级 | 日韩一区中文字幕 | 色综合久 | 玖玖玖在线| 亚洲日韩中文字幕一区 | 一区二区三区不卡视频 | 国产日韩欧美在线 | 欧美 日韩 亚洲91麻豆精品 | 色播99 | 亚洲精品视频免费看 | 精品乱码一区二区三四区 | 91色视频在线观看 | 久久久久亚洲精品 | 国产在线视频一区 | 中文字幕日韩一区 | 欧美久久一区 | 日本aa毛片a级毛片免费观看 | 中文一区二区 | 欧美精品91 | 免费观看一级黄色录像 | 久久婷婷香蕉热狠狠综合 | 久久精品久久久久久 |