找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7668|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

片盲很久以前做的萬年歷

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:159269 發(fā)表于 2017-1-1 22:35 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本人是個片盲,撿到幾塊lcd12864  顯示屏,在論壇上看了一下資料,很多用來做萬年歷,果斷也想想做個萬年歷,資料都是在論壇里收的,我也忘了在那個大神哪兒下載的了。。。純屬  依葫蘆畫瓢 在此感謝這位大神的資料。   
上圖


買的成品stc89c52       這個才   9塊9
  

在一塊老板子上找到  NYM13027 看了看旁邊電路和1302 是一樣的


過程就不多說了,本來就是依葫蘆畫瓢



修改的生日提醒,一家人的全部添加進(jìn)去了,提前一天通知,有了它,爸媽在也不怕我忘掉他們生日了。




  1. /*********************************************************************************************

  2. 程序名:        帶字庫12864LCC電子鐘程序

  3. 器  件:        STC89C52,LCD12864(內(nèi)置漢字字庫),18B20溫度芯片,1302時鐘芯片        MCU晶振:12MHZ

  4. 設(shè)  計:     中國機(jī)器 (仿造杜洋萬年歷程序并增加了農(nóng)歷功能)

  5. 功  能:     顯示公歷年月日
  6.                      農(nóng)歷年月日
  7.                          星期(星期不調(diào)用DS1302內(nèi)的數(shù)據(jù),二十根據(jù)公歷年月日推算的)
  8.                          溫度
  9.                          時分秒
  10.                          公歷重大節(jié)日
  11.                          農(nóng)歷紀(jì)念日與節(jié)日(用于提醒農(nóng)歷生日非常實用)
  12. 注:1、當(dāng)農(nóng)歷紀(jì)念日與公歷紀(jì)念日碰到同一天,則按一秒的間隔輪流顯示
  13.      2、20100226加入陽歷大小月和平閏年判斷,調(diào)日歷時自動控制每個月份的天數(shù)
  14. /*********************************************************************************************

  15. /*********************************************************************************************/

  16. //程序部分開始//
  17. /****************************************************************************/
  18. //頭文件
  19. #include <AT89X52.h>
  20. #include <string.h>
  21. /*****************************************************************************/


  22. //定做PCB板的燈與揚(yáng)聲器定義
  23. sbit        led_back = P2^7;//背光控制(V2.1程序中加入了背光控制的硬件電路)
  24. sbit        beep   = P3^1;//揚(yáng)聲器

  25. /*****************************************************************************/

  26. //定做PCB板溫度傳感器引腳定義
  27. sbit DQ = P2 ^0 ;//ds18B20*/
  28. /*****************************************************************************/

  29. //鍵盤引腳定義
  30. sbit KEY_1 = P1^7;         //退出設(shè)置鍵,顯示版本信息鍵
  31. sbit KEY_2 = P1^6;         //上調(diào)鍵
  32. sbit KEY_3 = P1^5;         //設(shè)置鍵
  33. sbit KEY_4 = P1^4;         //減,下調(diào)鍵
  34. sbit KEY_5 = P1^3;         //LED控制每次按動改變背光開關(guān)

  35. /****************************************************************************/

  36. //LCD接口定義
  37. sbit RS = P1^0;//模式位,為0輸入指令,為1輸入數(shù)據(jù)
  38. sbit RW = P1^1;//讀寫位,為0讀,為1寫
  39. sbit E = P1^2;//使能位
  40. #define Lcd_Bus P0 //數(shù)據(jù)總線
  41. /*****************************************************************************/

  42. //定義DS1302時鐘接口
  43. sbit clock_clk = P3 ^ 0;//ds1302_clk(時鐘線)
  44. sbit clock_dat = P3 ^ 6;//ds1302_dat(數(shù)據(jù)線)
  45. sbit clock_Rst = P3 ^ 7;//ds1302_Rst(復(fù)位線)
  46. /*****************************************************************************/
  47. //定義累加器A中的各位
  48. sbit a0   = ACC ^ 0;
  49. sbit a1   = ACC ^ 1;
  50. sbit a2   = ACC ^ 2;
  51. sbit a3   = ACC ^ 3;
  52. sbit a4   = ACC ^ 4;
  53. sbit a5   = ACC ^ 5;
  54. sbit a6   = ACC ^ 6;
  55. sbit a7   = ACC ^ 7;
  56. /****************************************************************************/
  57. //定義全局變量
  58. unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定義時間映射全局變量(專用寄存器)
  59. bit w = 0; //調(diào)時標(biāo)志位,=0時為走時狀態(tài),=1時為調(diào)時狀態(tài)
  60. static unsigned char menu = 0;//定義靜態(tài)小時更新用數(shù)據(jù)變量
  61. static unsigned char keys = 0;//定義靜態(tài)小時更新用數(shù)據(jù)變量
  62. static unsigned char timecount = 0;//定義靜態(tài)軟件計數(shù)器變量

  63. signed char address,item,max,mini;

  64. /****************************************************************************/
  65. void DelayM(unsigned int a){//延時函數(shù) 1MS/次        
  66.                 unsigned char i;
  67.                 while( --a != 0){               
  68.                         for(i = 0; i < 125; i++);  //一個 ; 表示空語句,CPU空轉(zhuǎn)。
  69.                 }                                      //i 從0加到125,CPU大概就耗時1毫秒
  70. }
  71. /****************************************************************************/

  72. /******************************************************************************/
  73. //LCD驅(qū)動(DY12864CBL液晶顯示屏并口驅(qū)動程序)
  74. /******************************************************************************/
  75. void chk_busy(){//檢查忙位(底層)
  76.    RS=0;
  77.    RW=1;
  78.    E=1;
  79.    Lcd_Bus=0xff;
  80.    while((Lcd_Bus&0x80)==0x80);
  81.    E=0;
  82. }
  83. /******************************************************************************/
  84. void write_com(unsigned char cmdcode){//寫命令到LCD(底層)
  85.         chk_busy();
  86.         RS=0;
  87.         RW=0;
  88.         E=1;
  89.         Lcd_Bus=cmdcode;
  90.         E=0;
  91. }
  92. /******************************************************************************/
  93. void write_data(unsigned char Dispdata){         //寫數(shù)據(jù)到LCD(底層)
  94.         chk_busy();
  95.         RS=1;
  96.         RW=0;
  97.         E=1;
  98.         Lcd_Bus=Dispdata;
  99.         E=0;
  100. }
  101. /******************************************************************************/
  102. void lcm_init(){//初始化LCD屏(被調(diào)用層)
  103.    write_com(0x30);       //選擇8bit數(shù)據(jù)流
  104.    write_com(0x0c);       //開顯示(無游標(biāo)、不反白)
  105.    write_com(0x01);       //清除顯示,并且設(shè)定地址指針為00H
  106. }
  107. /*****************************************************************************/
  108. void lcm_w_word(unsigned char *s){//向LCM發(fā)送一個字符串,長度64字符(一行)之內(nèi)。(被調(diào)用層)
  109.         while(*s>0){                                        //應(yīng)用:lcm_w_word("您好!"),直接顯示:您好!
  110.             write_data(*s);
  111.             s++;
  112.    }
  113. }
  114. /******************************************************************************/
  115. void lcm_w_test(bit i,unsigned char word){//寫指令或數(shù)據(jù)(被調(diào)用層)
  116.         if(i == 0){
  117.                 write_com(word);//寫指令或數(shù)據(jù)(0,指令)
  118.         }else{
  119.                 write_data(word);//寫指令或數(shù)據(jù)(1,數(shù)據(jù))
  120.         }
  121. }
  122. /******************************************************************************/
  123. void lcm_clr(void){//清屏函數(shù)
  124.         lcm_w_test(0,0x01);        
  125. }
  126. /******************************************************************************/

  127. void lcm_clr2(void){//清屏上面3行(用空格填滿要清顯示的地方,因為液晶屏是靜態(tài)顯示的,所以這辦法常用)
  128.         lcm_w_test(0,0x80);//第一行
  129.         lcm_w_word("                ");
  130.             //標(biāo)尺("1234567812345678"應(yīng)該能夠顯示滿一行)
  131.    lcm_w_test(0,0x90);//第二行
  132.         lcm_w_word("                ");
  133.             //標(biāo)尺("1234567812345678"應(yīng)該能夠顯示滿一行)
  134.    lcm_w_test(0,0x88);//第一行
  135.         lcm_w_word("                ");
  136.             //標(biāo)尺("1234567812345678"應(yīng)該能夠顯示滿一行)
  137.    }

  138. /******************************************************************************/
  139. //DS18B20溫度傳感器驅(qū)動(顯示0至60度,小數(shù)點后顯示一位)
  140. /******************************************************************************/
  141. void Delay(int num){//延時函數(shù)
  142.         while(num--) ;
  143. }        
  144. /******************************************************************************/
  145. void Init_DS18B20(void){//初始化ds1820
  146.         unsigned char x=0;
  147.         DQ = 1;    //DQ復(fù)位
  148.         Delay(8);  //稍做延時
  149.         DQ = 0;    //單片機(jī)將DQ拉低
  150.         Delay(80); //精確延時 大于 480us
  151.         DQ = 1;    //拉高總線
  152.         Delay(14);
  153.         x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  154.         Delay(20);
  155. }
  156. /******************************************************************************/
  157. unsigned char ReadOneChar(void){//讀一個字節(jié)
  158.         unsigned char i=0;
  159.         unsigned char dat = 0;
  160.         for (i=8;i>0;i--){
  161.                 DQ = 0; // 給脈沖信號
  162.                 dat>>=1;
  163.                 DQ = 1; // 給脈沖信號
  164.                 if(DQ)
  165.                 dat|=0x80;
  166.                 Delay(4);
  167.         }
  168.         return(dat);
  169. }
  170. /******************************************************************************/
  171. void WriteOneChar(unsigned char dat){//寫一個字節(jié)
  172.         unsigned char i=0;
  173.         for (i=8; i>0; i--){
  174.                 DQ = 0;
  175.                 DQ = dat&0x01;
  176.                 Delay(5);
  177.                 DQ = 1;
  178.                 dat>>=1;
  179.         }
  180. }
  181. /******************************************************************************/
  182. unsigned int ReadTemperature(void){//讀取溫度,溫度值返回到此函數(shù)中,供調(diào)用
  183.         unsigned char a=0;
  184.         unsigned char b=0;
  185.         unsigned int t=0;
  186.         float tt=0;
  187.         Init_DS18B20();
  188.         WriteOneChar(0xCC); // 跳過讀序號列號的操作
  189.         WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換
  190.         Init_DS18B20();
  191.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  192.         WriteOneChar(0xBE); //讀取溫度寄存器
  193.         a=ReadOneChar();  //讀低8位
  194.         b=ReadOneChar(); //讀高8位
  195.         t=b;
  196.         t<<=8;
  197.         t=t|a;
  198.         tt=t*0.0625;
  199.         t= tt*10+0.5; //放大10倍輸出并四舍五入
  200.         return(t);//t內(nèi)的溫度值,返回到子函數(shù)中,要將溫度傳輸?shù)絫emp變量,應(yīng)用temp=ReabTemperature()
  201. }
  202. /*****************************************************************************/
  203. //后面會出現(xiàn)的函數(shù)聲明(當(dāng)各函數(shù)的排列適當(dāng)時可不用聲明,加入函數(shù)聲明就不用管各個子函數(shù)出現(xiàn)的位置先后了?)
  204. void lcm_w_ss(void);//向液晶LCM中寫秒數(shù)據(jù)
  205. void lcm_w_mm(void);//向液晶LCM中寫分?jǐn)?shù)據(jù)
  206. void lcm_w_hh(void);//向液晶LCM中寫小時數(shù)據(jù)
  207. void lcm_w_dd(void);//寫日數(shù)據(jù)
  208. void lcm_w_mo(void);//寫月數(shù)據(jù)
  209. void lcm_w_yy(void);//寫年數(shù)據(jù)
  210. void lcm_w_xq(void);//星期處理并送入LCM的指定區(qū)域
  211. unsigned char clock_in(void);//DS1302逐位寫入字節(jié)(底層協(xié)議)
  212. void clock_out(unsigned char dd);//1302驅(qū)動程序逐位讀出字節(jié)(底層協(xié)議?
  213. void Init_1302(void);//-設(shè)置1302的初始時間(2007年1月1日00時00分00秒星期一)
  214. unsigned char read_clock(unsigned char ord);//DS1302讀數(shù)據(jù)(底層協(xié)議)
  215. void read_clockS(void);
  216. void Set_time(unsigned char sel);//根據(jù)選擇調(diào)整的相應(yīng)項目sel加1并寫入DS1302
  217. void write_clock(unsigned char ord, unsigned char dd);//DS1302寫數(shù)據(jù)(底層協(xié)議)
  218. void updata (void);

  219. void lcm_w_nl(void);//顯示農(nóng)歷子函數(shù)
  220. void Conversion(bit c,unsigned char year,unsigned char month,unsigned char day); //農(nóng)歷年月日計算子函數(shù)
  221. void Conver_week(bit c,unsigned char year,unsigned char month,unsigned char day);//星期計算子函數(shù)
  222. void ds_w(void);

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

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

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



  343. void jie_nl(void){                    //

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

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

  371.       if ( month_moon == 0x01 && day_moon == 0x03 ){ lcm_w_word("明天月月媽媽生日"); }
  372.       
  373.               if ( month_moon == 0x10 && day_moon == 0x11 ){ lcm_w_word("  明天三姨生日  "); }
  374.            if ( month_moon == 0x10 && day_moon == 0x11 ){ lcm_w_word("今天三姨生日!  "); }
  375.            
  376.          
  377. */
  378.                
  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)尺,不要改動)

  387. //下面是公歷的,有些沒意思的,就不顯示了
  388.       if ( mo == 0x01 && dd == 0x01 ){ lcm_w_word(" Happy new year!"); }
  389.     // ( mo == 0x01 && dd == 0x22 ){ lcm_w_word("    節(jié)日實驗    "); }//2010-01-22是農(nóng)歷臘八節(jié),用于實驗輪流顯示
  390.                 if ( mo == 0x02 && dd == 0x13 ){ lcm_w_word("  明天情人節(jié)了  "); }               
  391.                 if ( mo == 0x02 && dd == 0x14 ){ lcm_w_word("  今天是情人節(jié)  "); }               
  392.                 if ( mo == 0x03 && dd == 0x08 ){ lcm_w_word("   3.8婦女節(jié)    "); }
  393.                 if ( mo == 0x03 && dd == 0x11 ){ lcm_w_word("  明天是植樹節(jié)  "); }
  394.                 if ( mo == 0x03 && dd == 0x12 ){ lcm_w_word("    植樹節(jié)      "); }
  395.            if ( mo == 0x03 && dd == 0x14 ){ lcm_w_word("明天消費(fèi)者權(quán)益日"); }        
  396.                 if ( mo == 0x03 && dd == 0x15 ){ lcm_w_word("  消費(fèi)者權(quán)益日  "); }                                
  397.                 if ( mo == 0x04 && dd == 0x01 ){ lcm_w_word("愚人節(jié)  小心上當(dāng)"); }               
  398.                 //if ( mo == 0x04 && dd == 0x07 ){ lcm_w_word("  世界衛(wèi)生日    "); }               
  399.                 if ( mo == 0x04 && dd == 0x08 ){ lcm_w_word("    復(fù)活節(jié)      "); }               
  400.                 //if ( mo == 0x04 && dd == 0x13 ){ lcm_w_word("  黑色星期五    "); }
  401.                                 
  402.                 if ( mo == 0x05 && dd == 0x01 ){ lcm_w_word("  勞動節(jié)  放假  "); }//5               
  403.            if ( mo == 0x05 && dd == 0x04 ){ lcm_w_word("    青年節(jié)      "); }               
  404.                 if ( mo == 0x05 && dd == 0x08 ){ lcm_w_word("  世界紅十字日  "); }               
  405.                 if ( mo == 0x05 && dd == 0x12 ){ lcm_w_word("  國際護(hù)士節(jié)    "); }               
  406.                 if ( mo == 0x05 && dd == 0x05 ){ lcm_w_word("近日注意母親節(jié)  "); }
  407.                 if ( mo == 0x05 && dd == 0x06 ){ lcm_w_word("近日注意母親節(jié)  "); }
  408.                 //if ( mo == 0x05 && dd == 0x15 ){ lcm_w_word("  國際家庭日    "); }
  409.                 if ( mo == 0x05 && dd == 0x31 ){ lcm_w_word("  明天兒童節(jié)    "); }               
  410.                                 
  411.                 if ( mo == 0x06 && dd == 0x01 ){ lcm_w_word("月月兒童節(jié)快樂! "); }//6
  412.            if ( mo == 0x06 && dd == 0x05 ){ lcm_w_word("  世界環(huán)境日    "); }               
  413.                 //if ( mo == 0x06 && dd == 0x26 ){ lcm_w_word("  國際禁毒日    "); }               
  414.                 //if ( mo == 0x06 && dd == 0x06 ){ lcm_w_word("  全國愛眼日    "); }               
  415.                 if ( mo == 0x06 && dd == 0x13 ){ lcm_w_word("近日注意父親節(jié)  "); }
  416.                 if ( mo == 0x06 && dd == 0x15 ){ lcm_w_word("近日注意父親節(jié)  "); }
  417.                                 
  418.                 if ( mo == 0x07 && dd == 0x01 ){ lcm_w_word("香港回歸記念日  "); }//7
  419.                 //if ( mo == 0x07 && dd == 0x07 ){ lcm_w_word("抗日戰(zhàn)爭記念日  "); }
  420.                 //if ( mo == 0x07 && dd == 0x11 ){ lcm_w_word("  世界人口日    "); }

  421.                 if ( mo == 0x08 && dd == 0x01 ){ lcm_w_word("  八一建軍節(jié)    "); }//8
  422.         //        if ( mo == 0x08 && dd == 0x08 ){ lcm_w_word("  中國男子節(jié)    "); }
  423.            if ( mo == 0x08 && dd == 0x15 ){ lcm_w_word("抗戰(zhàn)勝利記念日  "); }
  424.       if ( mo == 0x09 && dd == 0x09 ){ lcm_w_word("  明天教師節(jié)    "); }
  425.                 if ( mo == 0x09 && dd == 0x10 ){ lcm_w_word("  中國教師節(jié)    "); }//9
  426.                 if ( mo == 0x09 && dd == 0x18 ){ lcm_w_word("九一八事變紀(jì)念  "); }
  427.                 if ( mo == 0x09 && dd == 0x20 ){ lcm_w_word("  國際愛牙日    "); }
  428.                 if ( mo == 0x09 && dd == 0x27 ){ lcm_w_word("  世界旅游日    "); }

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

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

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

  441.         else{//非節(jié)日時顯示時晨信息,判斷小時數(shù)據(jù)范圍,調(diào)取顯示
  442.                      if ( hh >= 0x04 && hh <  0x06 ){ lcm_w_word("★★__▲▲__凌晨"); }
  443.                           if ( hh >= 0x06 && hh <  0x08 ){ lcm_w_word("☆○__▲△__早晨"); }
  444.                           if ( hh >= 0x08 && hh <  0x12 ){ lcm_w_word("__●__▲▲__上午"); }
  445.                           if ( hh == 0x12)               { lcm_w_word("____▲●▲__中午"); }
  446.                           if ( hh >= 0x13 && hh <  0x18 ){ lcm_w_word("__▲▲__●__下午"); }
  447.                           if ( hh >= 0x18 && hh <  0x22 ){ lcm_w_word("△▲__●☆__晚上"); }
  448.                           if ( hh >= 0x22 && hh <= 0x23 ){ lcm_w_word("△▲__★☆__夜里"); }
  449.                           if ( hh >= 0x00 && hh <  0x04 ){ lcm_w_word("__★▲▲★__深夜"); }
  450.                  }
  451. }
  452. /*****************************************************************************/
  453. //電子鐘應(yīng)用層程序設(shè)計
  454. /*****************************************************************************/
  455. //向LCM中填寫 年 數(shù)據(jù)
  456. void lcm_w_yy(void){

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

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

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


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


  491. /*****************************************************************************/
  492. //向LCM中填寫 日 數(shù)據(jù)
  493. void lcm_w_dd(void){

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

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

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

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

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

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

  533.    
  534.    
  535.    

  536. }        




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


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


  583. void lcm_w_mm2(void){
  584. if(read_clock(0x83) != mm){//如果1302芯片中的分鐘數(shù)據(jù)與程序中的分鐘變量不相等               
  585.                 mm = read_clock(0x83);//刷新程序中的分鐘數(shù)據(jù)
  586.         }
  587.         
  588.         lcm_w_test(0,0x93);//寫指令,指定顯示位置為89H(第二行的第二個字符)        
  589.    lcm_w_word("  ");
  590.         lcm_w_test(1,(mm/16)+0x30);//向液晶寫數(shù)據(jù),顯示分鐘的十位數(shù)
  591.         lcm_w_test(1,mm%16+0x30);//向液晶寫數(shù)據(jù),顯示分鐘的個位數(shù)
  592.         lcm_w_word("  分");
  593. }

  594. /*****************************************************************************/
  595. //向LCM中填寫 秒 數(shù)據(jù) 和溫度數(shù)據(jù)
  596. void lcm_w_ss(void)
  597. {
  598.         unsigned int i=0;
  599.         unsigned char a=0,b=0,c=0;
  600.         if(read_clock(0x81) != ss)
  601.         {        //判斷是否需要更新,如果1302芯片中的秒數(shù)據(jù)與程序秒變量不同
  602.                 ss = read_clock(0x81);        //更新程序中的秒數(shù)據(jù)
  603.                 lcm_w_test(0,0x93);                //指定秒值在LCM上的顯示位置是8BH
  604.                 lcm_w_test(1,(ss/16)+0x30);        //顯示秒十位               
  605.                 lcm_w_test(1,ss%16+0x30);        //顯示秒個位(除以16,取余數(shù))

  606.                 updata ();        //刷新數(shù)據(jù)子函數(shù)

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

  619. void jie(void)//公歷和農(nóng)歷節(jié)日按照一秒間隔輪換顯示(節(jié)日顯示)
  620. {
  621. ss = read_clock(0x81);
  622. if(ss%16==1|ss%16==3|ss%16==5|ss%16==7|ss%16==9){jie_nl();}//秒是奇數(shù)調(diào)用農(nóng)歷節(jié)日顯示子函數(shù)
  623. if(ss%16==2|ss%16==4|ss%16==6|ss%16==8|ss%16==0){jie_gl();}//秒是偶數(shù)數(shù),調(diào)用公歷節(jié)日顯示子函數(shù)
  624. }

  625. /*****************************************************************************/
  626. //刷新數(shù)據(jù)子函數(shù),供調(diào)用,在這段程序之前已經(jīng)調(diào)用過
  627. void updata (void){
  628.                 lcm_w_mm();//刷新 分
  629.                 lcm_w_hh();//刷新 小時
  630.                 lcm_w_dd();//刷新 日
  631.                 lcm_w_xq();//更新星期值        
  632.                 lcm_w_mo();//刷新 月
  633.                 lcm_w_yy();//刷新 年
  634.       lcm_w_nl();//刷新農(nóng)歷
  635.       jie();//刷新節(jié)日顯示


  636. }
  637. /*****************************************************************************/
  638. void welcome(void){//開機(jī)歡迎顯示內(nèi)容,標(biāo)尺不能改動,文字不要對準(zhǔn)橫線之間的空隙

  639.          lcm_w_word(" K3:設(shè)置         K4:加 K2:減     K5:退出         K1:背光");//
  640.         //----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//標(biāo)尺
  641. }
  642. //標(biāo)尺能提示文字顯示的位置在哪一行,是否在中心

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

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

  651.   if(sel==4)  {lcm_w_word("分鐘");address=0x82; max=59;mini=0;
  652.    lcm_w_mm2();
  653.    ds_w();
  654.    lcm_w_mm2();
  655.   
  656.   }    //分鐘6,按動6次顯示 調(diào)整分鐘
  657.   //并指定分鐘數(shù)據(jù)寫入1302芯片的地址是0x82,分鐘數(shù)據(jù)的最大值是59,最小值是0


  658.   if(sel==3)  {lcm_w_word("小時");address=0x84; max=23;mini=0;
  659.   
  660.     lcm_w_hh2();
  661.     ds_w();
  662.     lcm_w_hh2();
  663.   
  664.   }    //小時5,按動5次顯示 調(diào)整小時
  665.   //規(guī)定小時數(shù)據(jù)寫入1302芯片的位置是0x84,小時數(shù)據(jù)最大值23,最小值是0
  666.   

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

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

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

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



  686.   if(sel==1)  {lcm_w_word("月份");address=0x88; max=12;mini=1;
  687.     lcm_w_mo2();
  688.          ds_w();
  689.     lcm_w_mo2();
  690.   
  691.       }    //月2,按動2次顯示 調(diào)整月份
  692.   //規(guī)定月份寫入1302的位置地址是0x88,月份最大值12,最小值1


  693.   if(sel==0)  {lcm_w_word("年份");address=0x8c; max=99; mini=0;
  694.      lcm_w_yy2();
  695.      ds_w();
  696.      lcm_w_yy2();

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

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

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

  716. /*********************************************************************
  717. 農(nóng)歷有關(guān)程序:

  718. **********************************************************************
  719. ********************************************************************/
  720. //C51寫的公歷轉(zhuǎn)農(nóng)歷和星期
  721. #define uchar unsigned char
  722. #define uint unsigned int
  723. #include <intrins.h>
  724. /*
  725. 公歷年對應(yīng)的農(nóng)歷數(shù)據(jù),每年三字節(jié),
  726. 格式第一字節(jié)BIT7-4 位表示閏月月份,值為0 為無閏月,BIT3-0 對應(yīng)農(nóng)歷第1-4 月的大小
  727. 第二字節(jié)BIT7-0 對應(yīng)農(nóng)歷第5-12 月大小,第三字節(jié)BIT7 表示農(nóng)歷第13 個月大小
  728. 月份對應(yīng)的位為1 表示本農(nóng)歷月大(30 天),為0 表示小(29 天)
  729. 第三字節(jié)BIT6-5 表示春節(jié)的公歷月份,BIT4-0 表示春節(jié)的公歷日期
  730. */
  731. code uchar year_code[597] = {

  732. 0x04,0xAe,0x53, //1901 0
  733. 0x0A,0x57,0x48, //1902 3
  734. 0x55,0x26,0xBd, //1903 6
  735. 0x0d,0x26,0x50, //1904 9
  736. 0x0d,0x95,0x44, //1905 12
  737. 0x46,0xAA,0xB9, //1906 15
  738. 0x05,0x6A,0x4d, //1907 18
  739. 0x09,0xAd,0x42, //1908 21
  740. 0x24,0xAe,0xB6, //1909
  741. 0x04,0xAe,0x4A, //1910
  742. 0x6A,0x4d,0xBe, //1911
  743. 0x0A,0x4d,0x52, //1912
  744. 0x0d,0x25,0x46, //1913
  745. 0x5d,0x52,0xBA, //1914
  746. 0x0B,0x54,0x4e, //1915
  747. 0x0d,0x6A,0x43, //1916
  748. 0x29,0x6d,0x37, //1917
  749. 0x09,0x5B,0x4B, //1918
  750. 0x74,0x9B,0xC1, //1919
  751. 0x04,0x97,0x54, //1920
  752. 0x0A,0x4B,0x48, //1921
  753. 0x5B,0x25,0xBC, //1922
  754. 0x06,0xA5,0x50, //1923
  755. 0x06,0xd4,0x45, //1924
  756. 0x4A,0xdA,0xB8, //1925
  757. 0x02,0xB6,0x4d, //1926
  758. 0x09,0x57,0x42, //1927
  759. 0x24,0x97,0xB7, //1928
  760. 0x04,0x97,0x4A, //1929
  761. 0x66,0x4B,0x3e, //1930
  762. 0x0d,0x4A,0x51, //1931
  763. 0x0e,0xA5,0x46, //1932
  764. 0x56,0xd4,0xBA, //1933
  765. 0x05,0xAd,0x4e, //1934
  766. 0x02,0xB6,0x44, //1935
  767. 0x39,0x37,0x38, //1936
  768. 0x09,0x2e,0x4B, //1937
  769. 0x7C,0x96,0xBf, //1938
  770. 0x0C,0x95,0x53, //1939
  771. 0x0d,0x4A,0x48, //1940
  772. 0x6d,0xA5,0x3B, //1941
  773. 0x0B,0x55,0x4f, //1942
  774. 0x05,0x6A,0x45, //1943
  775. 0x4A,0xAd,0xB9, //1944
  776. 0x02,0x5d,0x4d, //1945
  777. 0x09,0x2d,0x42, //1946
  778. 0x2C,0x95,0xB6, //1947
  779. 0x0A,0x95,0x4A, //1948
  780. 0x7B,0x4A,0xBd, //1949
  781. 0x06,0xCA,0x51, //1950
  782. 0x0B,0x55,0x46, //1951
  783. 0x55,0x5A,0xBB, //1952
  784. 0x04,0xdA,0x4e, //1953
  785. 0x0A,0x5B,0x43, //1954
  786. 0x35,0x2B,0xB8, //1955
  787. 0x05,0x2B,0x4C, //1956
  788. 0x8A,0x95,0x3f, //1957
  789. 0x0e,0x95,0x52, //1958
  790. 0x06,0xAA,0x48, //1959
  791. 0x7A,0xd5,0x3C, //1960
  792. 0x0A,0xB5,0x4f, //1961
  793. 0x04,0xB6,0x45, //1962
  794. 0x4A,0x57,0x39, //1963
  795. 0x0A,0x57,0x4d, //1964
  796. 0x05,0x26,0x42, //1965
  797. 0x3e,0x93,0x35, //1966
  798. 0x0d,0x95,0x49, //1967
  799. 0x75,0xAA,0xBe, //1968
  800. 0x05,0x6A,0x51, //1969
  801. 0x09,0x6d,0x46, //1970
  802. 0x54,0xAe,0xBB, //1971
  803. 0x04,0xAd,0x4f, //1972
  804. 0x0A,0x4d,0x43, //1973
  805. 0x4d,0x26,0xB7, //1974
  806. 0x0d,0x25,0x4B, //1975
  807. 0x8d,0x52,0xBf, //1976
  808. 0x0B,0x54,0x52, //1977
  809. 0x0B,0x6A,0x47, //1978
  810. 0x69,0x6d,0x3C, //1979
  811. 0x09,0x5B,0x50, //1980
  812. 0x04,0x9B,0x45, //1981
  813. 0x4A,0x4B,0xB9, //1982
  814. 0x0A,0x4B,0x4d, //1983
  815. 0xAB,0x25,0xC2, //1984
  816. 0x06,0xA5,0x54, //1985
  817. 0x06,0xd4,0x49, //1986
  818. 0x6A,0xdA,0x3d, //1987
  819. 0x0A,0xB6,0x51, //1988
  820. 0x09,0x37,0x46, //1989
  821. 0x54,0x97,0xBB, //1990
  822. 0x04,0x97,0x4f, //1991
  823. 0x06,0x4B,0x44, //1992
  824. 0x36,0xA5,0x37, //1993
  825. 0x0e,0xA5,0x4A, //1994
  826. 0x86,0xB2,0xBf, //1995
  827. 0x05,0xAC,0x53, //1996
  828. 0x0A,0xB6,0x47, //1997
  829. 0x59,0x36,0xBC, //1998
  830. 0x09,0x2e,0x50, //1999 294
  831. 0x0C,0x96,0x45, //2000 297
  832. 0x4d,0x4A,0xB8, //2001
  833. 0x0d,0x4A,0x4C, //2002
  834. 0x0d,0xA5,0x41, //2003
  835. 0x25,0xAA,0xB6, //2004
  836. 0x05,0x6A,0x49, //2005
  837. 0x7A,0xAd,0xBd, //2006
  838. 0x02,0x5d,0x52, //2007
  839. 0x09,0x2d,0x47, //2008
  840. 0x5C,0x95,0xBA, //2009
  841. 0x0A,0x95,0x4e, //2010
  842. 0x0B,0x4A,0x43, //2011
  843. 0x4B,0x55,0x37, //2012
  844. 0x0A,0xd5,0x4A, //2013
  845. 0x95,0x5A,0xBf, //2014
  846. 0x04,0xBA,0x53, //2015
  847. 0x0A,0x5B,0x48, //2016
  848. 0x65,0x2B,0xBC, //2017
  849. 0x05,0x2B,0x50, //2018
  850. 0x0A,0x93,0x45, //2019
  851. 0x47,0x4A,0xB9, //2020
  852. 0x06,0xAA,0x4C, //2021
  853. 0x0A,0xd5,0x41, //2022
  854. 0x24,0xdA,0xB6, //2023
  855. 0x04,0xB6,0x4A, //2024
  856. 0x69,0x57,0x3d, //2025
  857. 0x0A,0x4e,0x51, //2026
  858. 0x0d,0x26,0x46, //2027
  859. 0x5e,0x93,0x3A, //2028
  860. 0x0d,0x53,0x4d, //2029
  861. 0x05,0xAA,0x43, //2030
  862. 0x36,0xB5,0x37, //2031
  863. 0x09,0x6d,0x4B, //2032
  864. 0xB4,0xAe,0xBf, //2033
  865. 0x04,0xAd,0x53, //2034
  866. 0x0A,0x4d,0x48, //2035
  867. 0x6d,0x25,0xBC, //2036
  868. 0x0d,0x25,0x4f, //2037
  869. 0x0d,0x52,0x44, //2038
  870. 0x5d,0xAA,0x38, //2039
  871. 0x0B,0x5A,0x4C, //2040
  872. 0x05,0x6d,0x41, //2041
  873. 0x24,0xAd,0xB6, //2042
  874. 0x04,0x9B,0x4A, //2043
  875. 0x7A,0x4B,0xBe, //2044
  876. 0x0A,0x4B,0x51, //2045
  877. 0x0A,0xA5,0x46, //2046
  878. 0x5B,0x52,0xBA, //2047
  879. 0x06,0xd2,0x4e, //2048
  880. 0x0A,0xdA,0x42, //2049
  881. 0x35,0x5B,0x37, //2050
  882. 0x09,0x37,0x4B, //2051
  883. 0x84,0x97,0xC1, //2052
  884. 0x04,0x97,0x53, //2053
  885. 0x06,0x4B,0x48, //2054
  886. 0x66,0xA5,0x3C, //2055
  887. 0x0e,0xA5,0x4f, //2056
  888. 0x06,0xB2,0x44, //2057
  889. 0x4A,0xB6,0x38, //2058
  890. 0x0A,0xAe,0x4C, //2059
  891. 0x09,0x2e,0x42, //2060
  892. 0x3C,0x97,0x35, //2061
  893. 0x0C,0x96,0x49, //2062
  894. 0x7d,0x4A,0xBd, //2063
  895. 0x0d,0x4A,0x51, //2064
  896. 0x0d,0xA5,0x45, //2065
  897. 0x55,0xAA,0xBA, //2066
  898. 0x05,0x6A,0x4e, //2067
  899. 0x0A,0x6d,0x43, //2068
  900. 0x45,0x2e,0xB7, //2069
  901. 0x05,0x2d,0x4B, //2070
  902. 0x8A,0x95,0xBf, //2071
  903. 0x0A,0x95,0x53, //2072
  904. 0x0B,0x4A,0x47, //2073
  905. 0x6B,0x55,0x3B, //2074
  906. 0x0A,0xd5,0x4f, //2075
  907. 0x05,0x5A,0x45, //2076
  908. 0x4A,0x5d,0x38, //2077
  909. 0x0A,0x5B,0x4C, //2078
  910. 0x05,0x2B,0x42, //2079
  911. 0x3A,0x93,0xB6, //2080
  912. 0x06,0x93,0x49, //2081
  913. 0x77,0x29,0xBd, //2082
  914. 0x06,0xAA,0x51, //2083
  915. 0x0A,0xd5,0x46, //2084
  916. 0x54,0xdA,0xBA, //2085
  917. 0x04,0xB6,0x4e, //2086
  918. 0x0A,0x57,0x43, //2087
  919. 0x45,0x27,0x38, //2088
  920. 0x0d,0x26,0x4A, //2089
  921. 0x8e,0x93,0x3e, //2090
  922. 0x0d,0x52,0x52, //2091
  923. 0x0d,0xAA,0x47, //2092
  924. 0x66,0xB5,0x3B, //2093
  925. 0x05,0x6d,0x4f, //2094
  926. 0x04,0xAe,0x45, //2095
  927. 0x4A,0x4e,0xB9, //2096
  928. 0x0A,0x4d,0x4C, //2097
  929. 0x0d,0x15,0x41, //2098
  930. 0x2d,0x92,0xB5, //2099
  931. };
  932. ///月份數(shù)據(jù)表
  933. code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
  934. code uint day_code2[3]={0x111,0x130,0x14e};
  935. /*
  936. 函數(shù)功能:輸入BCD陽歷數(shù)據(jù),輸出BCD陰歷數(shù)據(jù)(只允許1901-2099年)
  937. 調(diào)用函數(shù)示例:Conversion(c_sun,year_sun,month_sun,day_sun)
  938. 如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);
  939. c_sun,year_sun,month_sun,day_sun均為BCD數(shù)據(jù),c_sun為世紀(jì)標(biāo)志位,c_sun=0為21世
  940. 紀(jì),c_sun=1為19世紀(jì)
  941. 調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀c_moon,year_moon,month_moon,day_moon得出陰歷BCD數(shù)據(jù)
  942. */
  943. bit c_moon;
  944. data uchar year_moon,month_moon,day_moon,week;
  945. /*子函數(shù),用于讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月為大返回1,為小返回0*/
  946. bit get_moon_day(uchar month_p,uint table_addr)
  947. {
  948. uchar temp;
  949. switch (month_p)
  950. {
  951. case 1:{temp=year_code[table_addr]&0x08;
  952. if (temp==0)return(0);else return(1);}
  953. case 2:{temp=year_code[table_addr]&0x04;
  954. if (temp==0)return(0);else return(1);}
  955. case 3:{temp=year_code[table_addr]&0x02;
  956. if (temp==0)return(0);else return(1);}
  957. case 4:{temp=year_code[table_addr]&0x01;
  958. if (temp==0)return(0);else return(1);}
  959. case 5:{temp=year_code[table_addr+1]&0x80;
  960. if (temp==0) return(0);else return(1);}
  961. case 6:{temp=year_code[table_addr+1]&0x40;
  962. if (temp==0)return(0);else return(1);}
  963. case 7:{temp=year_code[table_addr+1]&0x20;
  964. if (temp==0)return(0);else return(1);}
  965. case 8:{temp=year_code[table_addr+1]&0x10;
  966. if (temp==0)return(0);else return(1);}
  967. case 9:{temp=year_code[table_addr+1]&0x08;
  968. if (temp==0)return(0);else return(1);}
  969. case 10:{temp=year_code[table_addr+1]&0x04;
  970. if (temp==0)return(0);else return(1);}
  971. case 11:{temp=year_code[table_addr+1]&0x02;
  972. if (temp==0)return(0);else return(1);}
  973. case 12:{temp=year_code[table_addr+1]&0x01;
  974. if (temp==0)return(0);else return(1);}
  975. case 13:{temp=year_code[table_addr+2]&0x80;
  976. if (temp==0)return(0);else return(1);}
  977. }
  978. }
  979. /*
  980. 函數(shù)功能:輸入BCD陽歷數(shù)據(jù),輸出BCD陰歷數(shù)據(jù)(只允許1901-2099年)
  981. 調(diào)用函數(shù)示例:Conversion(c_sun,year_sun,month_sun,day_sun)
  982. 如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);
  983. c_sun,year_sun,month_sun,day_sun均為BCD數(shù)據(jù),c_sun為世紀(jì)標(biāo)志位,c_sun=0為21世
  984. 紀(jì),c_sun=1為19世紀(jì)
  985. 調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀c_moon,year_moon,month_moon,day_moon得出陰歷BCD數(shù)據(jù)
  986. */
  987. void Conversion(bit c,uchar year,uchar month,uchar day)
  988. { //c=0 為21世紀(jì),c=1 為19世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
  989. uchar temp1,temp2,temp3,month_p;
  990. uint temp4,table_addr;
  991. bit flag2,flag_y;
  992. temp1=year/16; //BCD->hex 先把數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制
  993. temp2=year%16;
  994. year=temp1*10+temp2;
  995. temp1=month/16;
  996. temp2=month%16;
  997. month=temp1*10+temp2;
  998. temp1=day/16;
  999. temp2=day%16;
  1000. day=temp1*10+temp2;
  1001. //定位數(shù)據(jù)表地址
  1002. if(c==0)
  1003. {
  1004. table_addr=(year+0x64-1)*0x3;
  1005. }
  1006. else
  1007. {
  1008. table_addr=(year-1)*0x3;
  1009. }
  1010. //定位數(shù)據(jù)表地址完成
  1011. //取當(dāng)年春節(jié)所在的公歷月份
  1012. temp1=year_code[table_addr+2]&0x60;
  1013. temp1=_cror_(temp1,5);
  1014. //取當(dāng)年春節(jié)所在的公歷月份完成
  1015. //取當(dāng)年春節(jié)所在的公歷日
  1016. temp2=year_code[table_addr+2]&0x1f;
  1017. //取當(dāng)年春節(jié)所在的公歷日完成
  1018. // 計算當(dāng)年春年離當(dāng)年元旦的天數(shù),春節(jié)只會在公歷1月或2月
  1019. if(temp1==0x1)
  1020. {
  1021. temp3=temp2-1;
  1022. }
  1023. else
  1024. {
  1025. temp3=temp2+0x1f-1;
  1026. }
  1027. // 計算當(dāng)年春年離當(dāng)年元旦的天數(shù)完成
  1028. //計算公歷日離當(dāng)年元旦的天數(shù),為了減少運(yùn)算,用了兩個表
  1029. //day_code1[9],day_code2[3]
  1030. //如果公歷月在九月或前,天數(shù)會少于0xff,用表day_code1[9],
  1031. //在九月后,天數(shù)大于0xff,用表day_code2[3]
  1032. //如輸入公歷日為8月10日,則公歷日離元旦天數(shù)為day_code1[8-1]+10-1
  1033. //如輸入公歷日為11月10日,則公歷日離元旦天數(shù)為day_code2[11-10]+10-1
  1034. if (month<10)
  1035. {
  1036. temp4=day_code1[month-1]+day-1;
  1037. }
  1038. else
  1039. {
  1040. temp4=day_code2[month-10]+day-1;
  1041. }
  1042. if ((month>0x2)&&(year%0x4==0))
  1043. { //如果公歷月大于2月并且該年的2月為閏月,天數(shù)加1
  1044. temp4+=1;
  1045. }
  1046. //計算公歷日離當(dāng)年元旦的天數(shù)完成
  1047. //判斷公歷日在春節(jié)前還是春節(jié)后
  1048. if (temp4>=temp3)
  1049. { //公歷日在春節(jié)后或就是春節(jié)當(dāng)日使用下面代碼進(jìn)行運(yùn)算
  1050. temp4-=temp3;
  1051. month=0x1;
  1052. month_p=0x1; //month_p為月份指向,公歷日在春節(jié)前或就是春節(jié)當(dāng)日month_p指向首月
  1053. flag2=get_moon_day(month_p,table_addr);
  1054. //檢查該農(nóng)歷月為大小還是小月,大月返回1,小月返回0
  1055. flag_y=0;
  1056. if(flag2==0)temp1=0x1d; //小月29天
  1057. else temp1=0x1e; //大小30天
  1058. temp2=year_code[table_addr]&0xf0;
  1059. temp2=_cror_(temp2,4); //從數(shù)據(jù)表中取該年的閏月月份,如為0則該年無閏月
  1060. while(temp4>=temp1)
  1061. {
  1062. temp4-=temp1;
  1063. month_p+=1;
  1064. if(month==temp2)
  1065. {
  1066. flag_y=~flag_y;
  1067. if(flag_y==0)
  1068. month+=1;
  1069. }
  1070. else month+=1;
  1071. flag2=get_moon_day(month_p,table_addr);
  1072. if(flag2==0)temp1=0x1d;
  1073. else temp1=0x1e;
  1074. }
  1075. day=temp4+1;
  1076. }
  1077. else
  1078. { //公歷日在春節(jié)前使用下面代碼進(jìn)行運(yùn)算
  1079. temp3-=temp4;
  1080. if (year==0x0)
  1081. {
  1082. year=0x63;c=1;
  1083. }
  1084. else year-=1;
  1085. table_addr-=0x3;
  1086. month=0xc;
  1087. temp2=year_code[table_addr]&0xf0;
  1088. temp2=_cror_(temp2,4);
  1089. if (temp2==0)
  1090. month_p=0xc;
  1091. else
  1092. month_p=0xd; //
  1093. /*month_p為月份指向,如果當(dāng)年有閏月,一年有十三個月,月指向13,無閏月指向12*/
  1094. flag_y=0;
  1095. flag2=get_moon_day(month_p,table_addr);
  1096. if(flag2==0)temp1=0x1d;
  1097. else temp1=0x1e;
  1098. while(temp3>temp1)
  1099. {
  1100. temp3-=temp1;
  1101. month_p-=1;
  1102. if(flag_y==0)month-=1;
  1103. if(month==temp2)flag_y=~flag_y;
  1104. flag2=get_moon_day(month_p,table_addr);
  1105. if(flag2==0)temp1=0x1d;
  1106. else temp1=0x1e;
  1107. }
  1108. day=temp1-temp3+1;
  1109. }
  1110. c_moon=c; //HEX->BCD ,運(yùn)算結(jié)束后,把數(shù)據(jù)轉(zhuǎn)換為BCD數(shù)據(jù)
  1111. temp1=year/10;
  1112. temp1=_crol_(temp1,4);
  1113. temp2=year%10;
  1114. year_moon=temp1|temp2;
  1115. temp1=month/10;
  1116. temp1=_crol_(temp1,4);
  1117. temp2=month%10;
  1118. month_moon=temp1|temp2;
  1119. temp1=day/10;
  1120. temp1=_crol_(temp1,4);
  1121. temp2=day%10;
  1122. day_moon=temp1|temp2;
  1123. }

  1124. /*************************************************************************
  1125. /*函數(shù)功能:輸入BCD陽歷數(shù)據(jù),輸出BCD星期數(shù)據(jù)(只允許1901-2099年)
  1126. 調(diào)用函數(shù)示例:Conver_week(c_sun,year_sun,month_sun,day_sun)
  1127. 如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);
  1128. c_sun,year_sun,month_sun,day_sun均為BCD數(shù)據(jù),c_sun為世紀(jì)標(biāo)志位,c_sun=0為21世
  1129. 紀(jì),c_sun=1為19世紀(jì)
  1130. 調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀week得出陰歷BCD數(shù)據(jù)
  1131. */
  1132. code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數(shù)據(jù)表
  1133. /*
  1134. 算法:日期+年份+所過閏年數(shù)+月較正數(shù)之和除7 的余數(shù)就是星期但如果是在
  1135. 閏年又不到3 月份上述之和要減一天再除7
  1136. 星期數(shù)為0
  1137. */

  1138. void Conver_week(bit c,uchar year,uchar month,uchar day)
  1139. {//c=0 為21世紀(jì),c=1 為19世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
  1140. uchar temp1,temp2;
  1141. temp1=year/16; //BCD->hex 先把數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制
  1142. temp2=year%16;
  1143. year=temp1*10+temp2;
  1144. temp1=month/16;
  1145. temp2=month%16;
  1146. month=temp1*10+temp2;
  1147. temp1=day/16;
  1148. temp2=day%16;
  1149. day=temp1*10+temp2;
  1150. if (c==0){year+=0x64;} //如果為21世紀(jì),年份數(shù)加100
  1151. temp1=year/0x4; //所過閏年數(shù)只算1900年之后的
  1152. temp2=year+temp1;
  1153. temp2=temp2%0x7; //為節(jié)省資源,先進(jìn)行一次取余,避免數(shù)大于0xff,避免使用整型數(shù)據(jù)
  1154. temp2=temp2+day+table_week[month-1];
  1155. if (year%0x4==0&&month<3)temp2-=1;
  1156. week=temp2%0x7;
  1157. }



  1158. /******************************************
  1159. 顯示農(nóng)歷年月日

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

  1163.       dd = read_clock(0x87);//日
  1164.            mo = read_clock(0x89);//月
  1165.            yy = read_clock(0x8d);//年
  1166.       Conversion(0,yy,mo,dd);//調(diào)用公歷轉(zhuǎn)農(nóng)歷子函數(shù)
  1167.   //調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀c_moon農(nóng)歷世紀(jì),year_moon農(nóng)歷年,month_moon,day_moon得出陰歷BCD數(shù)據(jù)
  1168.                 lcm_w_test(0,0x88);
  1169.                 lcm_w_word("農(nóng)歷20");//顯示內(nèi)容字符20
  1170.                
  1171.                 lcm_w_test(1,(year_moon/16)+0x30);//函數(shù)參數(shù)1,代表本行寫數(shù)據(jù),YY/16+0X30得出年十位數(shù)字的顯示碼地址,送顯示        
  1172.                 lcm_w_test(1,year_moon%16+0x30);//函數(shù)參數(shù)1,代表本行寫數(shù)據(jù),YY%得出年個位數(shù)字的顯示碼地址,送顯示
  1173.                
  1174.       lcm_w_word("-");
  1175.                
  1176.       lcm_w_test(1,(month_moon/16)+0x30);
  1177.                 lcm_w_test(1,month_moon%16+0x30);//與16取余數(shù),得到月份的個位數(shù),加0x30得到該數(shù)字的液晶內(nèi)定顯示碼送顯示
  1178.                
  1179.                 lcm_w_word("-");//調(diào)用字符顯示函數(shù),顯示文字 月

  1180.                   lcm_w_test(1,(day_moon/16)+0x30);
  1181.                 lcm_w_test(1,day_moon%16+0x30);//第一個1參數(shù),表示本行寫數(shù)據(jù),日數(shù)據(jù)與16取余得個位數(shù),加0x30得到顯示碼
  1182.                
  1183.                                 
  1184. }        


  1185. /*****************************************************************************/
  1186. //---主程序---//
  1187. /*****************************************************************************/
  1188. main() {
  1189.         unsigned char e=0;
  1190.         //KEY_I = 0;
  1191.         KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;KEY_5=1;//初始鍵盤
  1192.         beep=0;//因為用9014三極管驅(qū)動蜂鳴器,所以beep=1時,蜂鳴器響
  1193.    led_back=1;
  1194.         yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各數(shù)據(jù)刷新
  1195.         Beep();//鳴響一聲        
  1196.         Init_1302();//初始化1302時鐘芯片
  1197.         lcm_init();//初始化液晶顯示器
  1198.         lcm_clr();//清屏
  1199.         welcome();//顯示歡迎信息,顯示歡迎函數(shù)內(nèi)設(shè)定的內(nèi)容
  1200.         DelayM(3000); //歡迎信息顯示停留1秒
  1201.    lcm_init();//
  1202.    lcm_w_nl();//
  1203. /*****************************************************************************/
  1204. while(1){//主循環(huán)

  1205.                if (KEY_5 == 0) // 按下背光控制
  1206.               {
  1207.                        DelayM(20);//防抖
  1208.                         
  1209.                        if(KEY_5 == 0){                                
  1210.                                 Beep_key();//確定按鍵音
  1211.                            led_back =~led_back; //改變背光狀態(tài)
  1212.                                  
  1213.                                 }        
  1214.                                         while(KEY_5 == 0);//等待鍵松開
  1215.            }      



  1216.                 if (w == 0){   //W為程序頭段規(guī)定的正常走時標(biāo)志位,=0時說明在正常走時
  1217.                 lcm_w_ss();//刷新 秒
  1218.                 }
  1219.                 else {                //否則(W!=0的情況下就是調(diào)時狀態(tài))啟動調(diào)時
  1220.                 }
  1221.                 //------------------------------------------------------------------
  1222.                 if (KEY_3 == 0) // 按下設(shè)置鍵
  1223.               {
  1224.                        DelayM(20);           //去抖
  1225.                         //led_g3 = 0;led_r = 1;
  1226.                         if(KEY_3 == 0 && w == 1)  //如果按下設(shè)置鍵時,系統(tǒng)是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項
  1227.                         {
  1228.                                 Beep_key();//按鍵音
  1229.                                 e++;
  1230.                                 if (e >= 6 ){e = 0;}
  1231.                                 Set_time(e);//調(diào)用調(diào)整時間子函數(shù)                                
  1232.                         }


  1233.                         if(KEY_3 == 0 && w == 0)  //如果按下設(shè)置鍵時,系統(tǒng)正在正常走時狀態(tài)時就進(jìn)入調(diào)時狀態(tài)
  1234.                         {
  1235.                                 Beep_set();//確定按鍵音
  1236.                                 //led_b = 1;//
  1237.                                 lcm_clr();//清屏
  1238.             lcm_clr2();//清前三行屏幕顯示
  1239.                                 w=1;          //進(jìn)入調(diào)時,w是正常走時的標(biāo)志位,=1進(jìn)入調(diào)試狀態(tài),=0進(jìn)入正常走時狀態(tài)
  1240.                         
  1241.                                 lcm_w_test(0,0x80);
  1242.                                 lcm_w_word("Esc");
  1243.             lcm_w_test(0,0x90);//指定顯示位置
  1244.                                 lcm_w_word("[+]");//在上一行指定位置顯示引號內(nèi)的字符
  1245.             lcm_w_test(0,0x88);
  1246.                                 lcm_w_word("Sel");
  1247.                       lcm_w_test(0,0x98);//函數(shù)第一參數(shù)是0,表示本很寫入液晶指令,指定顯示位置98H
  1248.                                 lcm_w_word("[-]");//在上一行指定的位置顯示 引號內(nèi)的字符                                
  1249.                                 Set_time(e);//調(diào)用調(diào)整時間子函數(shù)
  1250.                         }
  1251.                        while(KEY_3 == 0);//等待鍵松開
  1252.                
  1253.               }
  1254.                 //------------------------------------------------------------------
  1255.                 if (KEY_1 == 0) // 按下退出鍵Esc,當(dāng)在調(diào)時狀態(tài)時就退出調(diào)時
  1256.               {
  1257.                        DelayM(20);
  1258.                         //led_g1 = 0;led_r = 1;
  1259.                        if(KEY_1 == 0 && w == 1){        //如果w==1說明在調(diào)時狀態(tài),按動這個鍵,退出調(diào)時                        
  1260.                                 Beep_set();//確定按鍵音
  1261.                                 w = 0;          //退出調(diào)時,進(jìn)入正常走時狀體
  1262.                                 e = 0;        //設(shè)置鍵功能循環(huán)中控制顯示 下一項 的參數(shù)歸0        
  1263.                     lcm_w_nl();//刷新農(nóng)歷顯示
  1264.                         }
  1265.                         if(KEY_1 == 0 && w == 0){                                
  1266.                                 lcm_clr();//清屏
  1267.                                 lcm_w_test(0,0x80);
  1268.                                 welcome();//顯示歡迎信息
  1269.                                 while(KEY_1 == 0);//等待鍵松開  
  1270.                         }
  1271.                                 lcm_clr();//清屏
  1272.                                 updata ();        //刷新數(shù)據(jù)
  1273.                                 lcm_w_mm();//刷新 分
  1274.             lcm_w_nl();//
  1275.                        while(KEY_1 == 0);//等待鍵松開  
  1276.               }
  1277.                 //------------------------------------------------------------------
  1278.                 if (KEY_2 == 0 && w == 1){ // 加減調(diào)整,KEY_2為上調(diào)鍵,如果上調(diào)鍵按下,且系統(tǒng)在調(diào)時狀態(tài){
  1279.                        DelayM(20); //延時消抖動20毫秒
  1280.                        if(KEY_2 == 0 && w == 1){        //確認(rèn)上調(diào)鍵是按下的                        
  1281.                                 Beep_key();//按鍵音
  1282.                                 Set_time(e);//調(diào)用調(diào)時子函數(shù)
  1283.                
  1284.                         }
  1285.                        while(KEY_2 == 0);//等待鍵松開
  1286.               }
  1287.                 //------------------------------------------------------------------
  1288.                 if (KEY_4 == 0 && w == 1){ // 加減調(diào)整,KEY_4為下調(diào)鍵,如果下調(diào)鍵按下而且系統(tǒng)在調(diào)時狀態(tài)              
  1289.                        DelayM(20);        //延時消抖動20毫秒
  1290.                             if(KEY_4 == 0 && w == 1){        //確定下調(diào)鍵是按下的                        
  1291.                                 Beep_key();//按鍵音
  1292.                                 Set_time(e);//調(diào)用調(diào)時的子函數(shù)
  1293.                         }
  1294.                        while(KEY_4 == 0);//等待鍵松開
  1295.               }
  1296. }        }        

復(fù)制代碼


所有資料打包下載(包含源程序 pcb 原理圖等):
LCD12864帶農(nóng)歷和農(nóng)歷紀(jì)念日(有字庫)調(diào)時界面星期自動紀(jì)念日輪顯萬年歷適合定做PCB(.zip (143.62 KB, 下載次數(shù): 66)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏11 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:159269 發(fā)表于 2017-1-1 22:41 | 只看該作者
怎么看通過沒?
回復(fù)

使用道具 舉報

板凳
ID:83510 發(fā)表于 2017-1-3 17:32 | 只看該作者
多謝分享
回復(fù)

使用道具 舉報

地板
ID:83510 發(fā)表于 2017-1-3 17:33 | 只看該作者
多謝分享
回復(fù)

使用道具 舉報

5#
ID:201672 發(fā)表于 2017-5-29 15:32 | 只看該作者
樓主牛人!多謝分享
回復(fù)

使用道具 舉報

6#
ID:202586 發(fā)表于 2017-7-19 00:02 | 只看該作者
NB 謝謝分享 好長啊  這個程序多大?要多大的單片存得下,2051可以不   也想做一個
回復(fù)

使用道具 舉報

7#
ID:229752 發(fā)表于 2019-5-17 14:54 | 只看該作者
頂頂更健康
回復(fù)

使用道具 舉報

8#
ID:517951 發(fā)表于 2020-11-15 14:59 | 只看該作者
收藏學(xué)習(xí)代碼
回復(fù)

使用道具 舉報

9#
ID:846386 發(fā)表于 2020-12-2 23:17 | 只看該作者
代碼不錯,先學(xué)習(xí)了
回復(fù)

使用道具 舉報

10#
ID:357153 發(fā)表于 2020-12-28 14:40 | 只看該作者
感謝樓主的分享。收藏、值得學(xué)習(xí)
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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