找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7864|回复: 8
打印 上一主题 下一主题
收起左侧

基于单片机的智能万年历设计(生日、节日、节气、农历)含电路,源代码与PCB文件

  [复制链接]
跳转到指定楼层
楼主
多功能菜单、多风格主界面,生日、节日、节气、农历时段多功能提示,闹钟、音乐、温度、屏幕自检
一、电源电压4.8V—5.2V,可以直接用电脑USB供电。
二、程序修改说明
1、如果你编译通不过,就是你用的KEIL库文件不全,请换个完整版本的KEIL,或到我店铺购买,本程序是完全编译通过,且没有1个警告;
2、本程序由于农历,节气等数据很占空间,编译后有19K多,请使用程序存储器20K以上的51单片机,比如STC89C55STC89C58STC89C516,AT89C55,AT89S54,SST89C58等;
3、如果你的汉字显示不全或乱码,比如“三“显示不了,那是你的KEIL没有打补丁,并不是程序问题,至于什么补丁你可以网上搜或向我索要;
4、在修改位定义的时候需要将Soundplay.h文件下的sbit    BeepIO  = P3^7; sbit KEY_1 = P2^7;一起修改;
5、蜂鸣器请最好使用无源蜂鸣器或小喇叭,这样音质会很好。
三、生日、节气和节日提示说明
1、本万年历的各种提示会在主界面第四行交替显示,其中生日和节气优先显示。

电路原理图如下:



Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. /*****************************************************************************/
  2. //12864液晶万年历 时钟2010年最新 V5.2版
  3. //设计: 杨黎民     QQ: 379663387
  4. //程序部分开始
  5. //更新日期:2010年9月3
  6. //主要特点:多功能菜单、多风格主界面,生日、节日、节气、农历时段多功能提示,闹钟、音乐、温度、屏幕自检
  7. //5.1增加了调整时间反白和闹钟设置反白显示
  8. //5.2调整了生日和节气优先显示
  9. /****************************************************************************/
  10. //头文件
  11. #include <AT89X52.h>
  12. #include <string.h>
  13. #include <intrins.h>
  14. #include "SoundPlay.h"//音乐文件
  15. #define uchar unsigned char
  16. #define uint unsigned int
  17. /*****************************************************************************/
  18. //扬声器定义
  19. sbit        beep   = P3^7;//扬声器
  20. /*****************************************************************************/
  21. //温度传感器定义
  22. sbit DQ = P2 ^ 0;//ds18B20
  23. uint tvalue;//温度值
  24. uchar tflag,flagdat,t,hh1;//温度正负标志
  25. /*****************************************************************************/
  26. //键盘引脚定义
  27. //sbit KEY_1 = P2^7;  //左上,在音乐文件SoundPlay.h中已定义
  28. sbit KEY_2 = P2^6;         //左下
  29. sbit KEY_3 = P2^5;         //右上
  30. sbit KEY_4 = P2^4;         //右下
  31. /****************************************************************************/
  32. //定义DS1302时钟接口
  33. sbit clock_clk = P2 ^ 1;//ds1302_clk(时钟线)
  34. sbit clock_dat = P2 ^ 2;//ds1302_dat(数据线)
  35. sbit clock_Rst = P2 ^ 3;//ds1302_Rst(复位线)
  36. //定义累加器A中的各位
  37. sbit a0   = ACC ^ 0;
  38. sbit a1   = ACC ^ 1;
  39. sbit a2   = ACC ^ 2;
  40. sbit a3   = ACC ^ 3;
  41. sbit a4   = ACC ^ 4;
  42. sbit a5   = ACC ^ 5;
  43. sbit a6   = ACC ^ 6;
  44. sbit a7   = ACC ^ 7;
  45. /****************************************************************************/
  46. //定义全局变量
  47. unsigned char yy,mo,dd,xq,hh,year,year1;//定义时间映射全局变量(专用寄存器)
  48. unsigned char shi,ge,sec_temp,min_temp,hour_temp,secl,selx,e=0,hh1,mm1,k,mm,ss,n;
  49. char n1,n2;
  50. bit w = 0; //调时标志位
  51. static unsigned char menu = 0;//定义静态小时更新用数据变量
  52. static unsigned char keys = 0;//定义静态小时更新用数据变量
  53. static unsigned char timecount = 0;//定义静态软件计数器变量
  54. /****************************************************************************/
  55. //-----------------------------------------------
  56. //TS12864并口相关设定//
  57. #define        BUSY_FLAG        P0_7                                                //液晶模块忙标志
  58. #define        MPU_RS_CH        P1_5                                                //寄存器选择输入
  59. #define        MPU_RW_CH        P1_6                                                //读写控制
  60. #define        MPU_ENABLE        P1_7                                                //使能控制
  61. #define        LCD_DATA        P0                                                        //液晶数据口
  62. //-----------------------------------------------
  63. #define LOW                        0                                                        //低电平
  64. #define        HIGH                1                                                        //高电平
  65. #define        OFF                        0                                                        //逻辑关
  66. #define        ON                        1                                                        //逻辑开
  67. //-----------------------------------------------
  68. //液晶模块指令集定义
  69. #define        cClearDisplay        0x01                                        //清显示指令
  70. #define        cEntryModeSet        0x06                                        //设置输入模式
  71. #define        cDisplayOnCtrl        0x0c                                        //设置开显控制
  72. #define        cFunctionSetB        0x30                                        //功能设定(基本指令)
  73. #define        cFunctionSetE        0x34                                        //功能设定(扩充指令)
  74. #define        cFuncDrawOn                0x36                                        //设置绘图功能
  75. //-----------------------------------------------
  76. uchar xdata lcdPosX, lcdPosY;                                                        //X,Y坐标
  77. uchar xdata halfScr, halfLineCnt, basicBlock;                        //半屏,半屏行数,N*8块
  78. //-----------------------------------------------
  79. //子程序声明和用法
  80. bit scanKey1 (void);
  81. //按键1检测
  82. void procKey (void);
  83. //按键处理子程序
  84. void lcdInit (void);
  85. //初始化LCD子程序
  86. void lcdClear (void);
  87. //清除LCD文本屏幕子程序
  88. void lcdWriteCommand (uchar Command);
  89. //写入控制命令到LCD子程序
  90. //输入参数:LCD控制指令
  91. void lcdWriteData (uchar Data);
  92. //写入显示数据到LCD子程序
  93. //输入参数:显示数据
  94. void checkLcdBusy (void);
  95. //检测LCD忙碌子程序
  96. void displayPhoto (uchar *bmp, uchar bmpCls);
  97. //全屏显示图形子程序
  98. //输入参数:*bmp=图形数据
  99. //bmpCls=清除图形屏幕选项(OFF为不清屏,即显示图形,ON为清屏)
  100. void convertChar (uchar CX, CY, width);
  101. //字符反白显示
  102. //输入参数:CX=要反白字符的行(0-3)
  103. //CY=要反白字符的列(0-7)
  104. //width=要反白字符的长度(1-16)
  105. void wrPosition (void);
  106. //坐标写入子程序
  107. void dispString (uchar X, Y, speed, uchar *msg);
  108. //显示字符串子程序
  109. //输入参数:X=行(0-3), Y=列(0-7), speed=显示速度(毫秒), msg=字符数据
  110. void beepBl (void);
  111. //蜂鸣器响一声子程序
  112. void delayMs (uchar ms);
  113. //延时(毫秒)子程序
  114. //输入参数:毫秒数
  115. void delaySec (uchar sec);
  116. //延时(秒)子程序
  117. //输入参数:秒数
  118. void init_dz();
  119. void clear_img();
  120. //===============================================
  121. //12864液晶驱动
  122. //===============================================
  123. void lcdInit (void)
  124. {
  125.         lcdWriteCommand(cFunctionSetE);
  126.         lcdWriteCommand(cFunctionSetB);
  127.         lcdClear();
  128.         lcdWriteCommand(cEntryModeSet);
  129.         lcdWriteCommand(cDisplayOnCtrl);
  130.         if(k==1){clear_img();lcdClear();
  131.         }
  132.         if(k==0){lcdClear(); clear_img();init_dz();
  133.         }
  134. }
  135. //===============================================
  136. void lcdClear (void)
  137. {
  138.         lcdWriteCommand(cClearDisplay);
  139. }
  140. //===============================================
  141. void lcdWriteCommand (uchar Command)
  142. {
  143.         checkLcdBusy();
  144.         MPU_RS_CH = LOW;
  145.         MPU_RW_CH = LOW;
  146.         LCD_DATA = Command;
  147.         MPU_ENABLE = HIGH;
  148.         delayMs(1);
  149.         MPU_ENABLE = LOW;
  150. }

  151. //===============================================
  152. void lcdWriteData (uchar Data)
  153. {
  154.         checkLcdBusy();
  155.         MPU_RS_CH = HIGH;
  156.         MPU_RW_CH = LOW;
  157.         LCD_DATA = Data;
  158.         MPU_ENABLE = HIGH;
  159.         delayMs(1);
  160.         MPU_ENABLE = LOW;
  161. }
  162. //===============================================
  163. void checkLcdBusy (void)
  164. {
  165.         LCD_DATA = 0xff;
  166.         MPU_RS_CH = LOW;
  167.         MPU_RW_CH = HIGH;
  168.         MPU_ENABLE = HIGH;
  169.         while (BUSY_FLAG);
  170.         MPU_ENABLE = LOW;
  171. }
  172. //===============================================
  173. void displayPhoto (uchar *bmp, uchar bmpCls)
  174. {
  175.         lcdPosX = 0x80;
  176.         halfScr = 2;
  177.        
  178.         for (;halfScr != 0; halfScr--)
  179.         {
  180.                 lcdPosY = 0x80;
  181.                 halfLineCnt = 32;
  182.                
  183.                 for (;halfLineCnt != 0; halfLineCnt--)
  184.                 {
  185.                         basicBlock = 16;
  186.                         wrPosition ();
  187.                        
  188.                         for (; basicBlock != 0; basicBlock--)
  189.                         {
  190.                                 if (bmpCls == OFF)
  191.                                 {
  192.                                         lcdWriteData (*bmp++);
  193.                                 }
  194.                                 else if (bmpCls == ON)
  195.                                 {
  196.                                         lcdWriteData (0x00);
  197.                                 }
  198.                         }
  199.                         lcdPosY++;
  200.                 }
  201.                 lcdPosX = 0x88;
  202.         }
  203.         lcdWriteCommand(cFuncDrawOn);
  204.         lcdWriteCommand(cFunctionSetB);
  205. }
  206. //===============================================
  207. void convertChar (uchar CX, CY, width)
  208. {
  209.         displayPhoto(OFF,ON);
  210.         lcdPosY = 0x80;

  211.         if (CX == 0)
  212.         {
  213.                 CX = 0x80;
  214.                 halfLineCnt = 16;
  215.         }
  216.         else if (CX == 1)
  217.         {
  218.                 CX = 0x80;
  219.                 halfLineCnt = 32;
  220.         }
  221.         else if (CX == 2)
  222.         {
  223.                 CX = 0x88;
  224.                 halfLineCnt = 16;
  225.         }
  226.         else if (CX == 3)
  227.         {
  228.                 CX = 0x88;
  229.                 halfLineCnt = 32;
  230.         }
  231.         lcdPosX = CX + CY;
  232.        
  233.     for (; halfLineCnt != 0; halfLineCnt--)
  234.         {
  235.                 basicBlock = width;
  236.                 wrPosition();
  237.        
  238.                 for (;basicBlock != 0; basicBlock--)
  239.                 {
  240.                         if (halfLineCnt > 16)
  241.                         {
  242.                                 lcdWriteData(0x00);
  243.                         }
  244.                         else
  245.                         {
  246.                                 lcdWriteData (0xff);
  247.                         }
  248.                 }
  249.                 lcdPosY++;
  250.         }

  251.         lcdWriteCommand(cFuncDrawOn);
  252.         lcdWriteCommand(cFunctionSetB);
  253. }
  254. //===============================================
  255. void wrPosition (void)
  256. {
  257.         lcdWriteCommand(cFunctionSetE);
  258.         lcdWriteCommand(lcdPosY);
  259.         lcdWriteCommand(lcdPosX);
  260.         lcdWriteCommand(cFunctionSetB);
  261. }
  262. //===============================================
  263. void dispString (uchar X, Y, speed, uchar *msg)
  264. {
  265.         if (X == 0)
  266.         {
  267.                 X = 0x80;
  268.         }
  269.         else if (X == 1)
  270.         {
  271.                 X = 0x90;
  272.         }
  273.         else if (X == 2)
  274.         {
  275.                 X = 0x88;
  276.         }
  277.         else if (X == 3)
  278.         {
  279.                 X = 0x98;
  280.         }
  281.         Y = X + Y;
  282.         lcdWriteCommand(Y);
  283.         while (*msg)
  284.         {
  285.                 lcdWriteData(*msg++);
  286.                 delayMs(speed);
  287.         }
  288. }
  289. //===============================================
  290. void delayMs (uchar ms)
  291. {
  292.         uchar i;
  293.         while (--ms)
  294.         {
  295.                 for (i = 0; i < 125; i++);
  296.         }
  297. }
  298. /********************************************************************************************************
  299. 清理图片缓冲区
  300. ********************************************************************************************************/
  301. void clear_img()
  302. {
  303.         uchar i,j;
  304.         for(i=0;i<32;i++)       
  305.         {
  306.                 lcdWriteCommand(0x80+i);
  307.                 lcdWriteCommand(0x80);                                                                             
  308.                 for(j=0;j<16;j++)
  309.                 {
  310.                         lcdWriteData(0x00);
  311.                 }               
  312.         }
  313.         for(i=0;i<32;i++)
  314.         {
  315.                 lcdWriteCommand(0x80+i);
  316.                 lcdWriteCommand(0x88);
  317.                 for(j=0;j<16;j++)
  318.                 {
  319.                         lcdWriteData(0x00);
  320.                 }               
  321.         }
  322. }
  323. /******************************************************************************/
  324. uchar code powerOnPhoto []={
  325. /*--  一幅图像 KISS- 正向取模,字节正序*/     
  326. /*--  宽度x高度=128x64  --*/   
  327. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  328. …………
  329. …………
  330. …………限于本文篇幅 余下代码请从51黑下载附件…………
  331.          {// 图片" "
  332.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  333.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  334.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  335.      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  336. };  

  337. /******************************************************************************/
  338. /*
  339. 公历年对应的农历数据,每年三字节,
  340. 格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小
  341. 第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小
  342. 月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)
  343. 第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期
  344. */
  345. code uchar year_code[] = {
  346. 0x0C,0x96,0x45, //2000
  347. 0x4d,0x4A,0xB8, //2001
  348. 0x0d,0x4A,0x4C, //2002
  349. 0x0d,0xA5,0x41, //2003
  350. 0x25,0xAA,0xB6, //2004
  351. 0x05,0x6A,0x49, //2005
  352. 0x7A,0xAd,0xBd, //2006
  353. 0x02,0x5d,0x52, //2007
  354. 0x09,0x2d,0x47, //2008
  355. 0x5C,0x95,0xBA, //2009
  356. 0x0A,0x95,0x4e, //2010
  357. 0x0B,0x4A,0x43, //2011
  358. 0x4B,0x55,0x37, //2012
  359. 0x0A,0xd5,0x4A, //2013
  360. 0x95,0x5A,0xBf, //2014
  361. 0x04,0xBA,0x53, //2015
  362. 0x0A,0x5B,0x48, //2016
  363. 0x65,0x2B,0xBC, //2017
  364. 0x05,0x2B,0x50, //2018
  365. 0x0A,0x93,0x45, //2019
  366. 0x47,0x4A,0xB9, //2020
  367. 0x06,0xAA,0x4C, //2021
  368. 0x0A,0xd5,0x41, //2022
  369. 0x24,0xdA,0xB6, //2023
  370. 0x04,0xB6,0x4A, //2024
  371. 0x69,0x57,0x3d, //2025
  372. 0x0A,0x4e,0x51, //2026
  373. 0x0d,0x26,0x46, //2027
  374. 0x5e,0x93,0x3A, //2028
  375. 0x0d,0x53,0x4d, //2029
  376. 0x05,0xAA,0x43, //2030
  377. 0x36,0xB5,0x37, //2031
  378. 0x09,0x6d,0x4B, //2032
  379. 0xB4,0xAe,0xBf, //2033
  380. 0x04,0xAd,0x53, //2034
  381. 0x0A,0x4d,0x48, //2035
  382. 0x6d,0x25,0xBC, //2036
  383. 0x0d,0x25,0x4f, //2037
  384. 0x0d,0x52,0x44, //2038
  385. 0x5d,0xAA,0x38, //2039
  386. 0x0B,0x5A,0x4C, //2040
  387. 0x05,0x6d,0x41, //2041
  388. 0x24,0xAd,0xB6, //2042
  389. 0x04,0x9B,0x4A, //2043
  390. 0x7A,0x4B,0xBe, //2044
  391. 0x0A,0x4B,0x51, //2045
  392. 0x0A,0xA5,0x46, //2046
  393. 0x5B,0x52,0xBA, //2047
  394. 0x06,0xd2,0x4e, //2048
  395. 0x0A,0xdA,0x42, //2049
  396. 0x35,0x5B,0x37, //2050
  397. 0x09,0x37,0x4B, //2051
  398. 0x84,0x97,0xC1, //2052
  399. 0x04,0x97,0x53, //2053
  400. 0x06,0x4B,0x48, //2054
  401. 0x66,0xA5,0x3C, //2055
  402. 0x0e,0xA5,0x4f, //2056
  403. 0x06,0xB2,0x44, //2057
  404. 0x4A,0xB6,0x38, //2058
  405. 0x0A,0xAe,0x4C, //2059
  406. 0x09,0x2e,0x42, //2060
  407. 0x3C,0x97,0x35, //2061
  408. 0x0C,0x96,0x49, //2062
  409. 0x7d,0x4A,0xBd, //2063
  410. 0x0d,0x4A,0x51, //2064
  411. 0x0d,0xA5,0x45, //2065
  412. 0x55,0xAA,0xBA, //2066
  413. 0x05,0x6A,0x4e, //2067
  414. 0x0A,0x6d,0x43, //2068
  415. 0x45,0x2e,0xB7, //2069
  416. 0x05,0x2d,0x4B, //2070
  417. 0x8A,0x95,0xBf, //2071
  418. 0x0A,0x95,0x53, //2072
  419. 0x0B,0x4A,0x47, //2073
  420. 0x6B,0x55,0x3B, //2074
  421. 0x0A,0xd5,0x4f, //2075
  422. 0x05,0x5A,0x45, //2076
  423. 0x4A,0x5d,0x38, //2077
  424. 0x0A,0x5B,0x4C, //2078
  425. 0x05,0x2B,0x42, //2079
  426. 0x3A,0x93,0xB6, //2080
  427. 0x06,0x93,0x49, //2081
  428. 0x77,0x29,0xBd, //2082
  429. 0x06,0xAA,0x51, //2083
  430. 0x0A,0xd5,0x46, //2084
  431. 0x54,0xdA,0xBA, //2085
  432. 0x04,0xB6,0x4e, //2086
  433. 0x0A,0x57,0x43, //2087
  434. 0x45,0x27,0x38, //2088
  435. 0x0d,0x26,0x4A, //2089
  436. 0x8e,0x93,0x3e, //2090
  437. 0x0d,0x52,0x52, //2091
  438. 0x0d,0xAA,0x47, //2092
  439. 0x66,0xB5,0x3B, //2093
  440. 0x05,0x6d,0x4f, //2094
  441. 0x04,0xAe,0x45, //2095
  442. 0x4A,0x4e,0xB9, //2096
  443. 0x0A,0x4d,0x4C, //2097
  444. 0x0d,0x15,0x41, //2098
  445. 0x2d,0x92,0xB5, //2099
  446. };
  447. ///月份数据表
  448. code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
  449. code uint day_code2[3]={0x111,0x130,0x14e};
  450. /*
  451. 函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
  452. 调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
  453. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
  454. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
  455. 纪,c_sun=1为19世纪
  456. 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
  457. */
  458. bit c_moon;
  459. data uchar year_moon,month_moon,day_moon,week;
  460. /*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/
  461. bit get_moon_day(uchar month_p,uint table_addr)
  462. {
  463. uchar temp;
  464. switch (month_p)
  465. {
  466. case 1:{temp=year_code[table_addr]&0x08;
  467. if (temp==0)return(0);else return(1);}
  468. case 2:{temp=year_code[table_addr]&0x04;
  469. if (temp==0)return(0);else return(1);}
  470. case 3:{temp=year_code[table_addr]&0x02;
  471. if (temp==0)return(0);else return(1);}
  472. case 4:{temp=year_code[table_addr]&0x01;
  473. if (temp==0)return(0);else return(1);}
  474. case 5:{temp=year_code[table_addr+1]&0x80;
  475. if (temp==0) return(0);else return(1);}
  476. case 6:{temp=year_code[table_addr+1]&0x40;
  477. if (temp==0)return(0);else return(1);}
  478. case 7:{temp=year_code[table_addr+1]&0x20;
  479. if (temp==0)return(0);else return(1);}
  480. case 8:{temp=year_code[table_addr+1]&0x10;
  481. if (temp==0)return(0);else return(1);}
  482. case 9:{temp=year_code[table_addr+1]&0x08;
  483. if (temp==0)return(0);else return(1);}
  484. case 10:{temp=year_code[table_addr+1]&0x04;
  485. if (temp==0)return(0);else return(1);}
  486. case 11:{temp=year_code[table_addr+1]&0x02;
  487. if (temp==0)return(0);else return(1);}
  488. case 12:{temp=year_code[table_addr+1]&0x01;
  489. if (temp==0)return(0);else return(1);}
  490. case 13:{temp=year_code[table_addr+2]&0x80;
  491. if (temp==0)return(0);else return(1);}
  492. }
  493. }
  494. /*
  495. 函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
  496. 调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
  497. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
  498. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
  499. 纪,c_sun=1为19世纪
  500. 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
  501. */
  502. void Conversion(bit c,uchar year,uchar month,uchar day)
  503. { //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
  504. uchar temp1,temp2,temp3,month_p;
  505. uint temp4,table_addr;
  506. bit flag2,flag_y;
  507. temp1=year/16; //BCD->hex 先把数据转换为十六进制
  508. temp2=year%16;
  509. year=temp1*10+temp2;
  510. temp1=month/16;
  511. temp2=month%16;
  512. month=temp1*10+temp2;
  513. temp1=day/16;
  514. temp2=day%16;
  515. day=temp1*10+temp2;
  516. //定位数据表地址
  517. if(c==0)
  518. {
  519. table_addr=(year)*0x3;
  520. }
  521. //else
  522. //{
  523. //table_addr=(year-1)*0x3;
  524. //}
  525. //定位数据表地址完成
  526. //取当年春节所在的公历月份
  527. temp1=year_code[table_addr+2]&0x60;
  528. temp1=_cror_(temp1,5);
  529. //取当年春节所在的公历月份完成
  530. //取当年春节所在的公历日
  531. temp2=year_code[table_addr+2]&0x1f;
  532. //取当年春节所在的公历日完成
  533. // 计算当年春年离当年元旦的天数,春节只会在公历1月或2月
  534. if(temp1==0x1)
  535. {
  536. temp3=temp2-1;
  537. }
  538. else
  539. {
  540. temp3=temp2+0x1f-1;
  541. }
  542. // 计算当年春年离当年元旦的天数完成
  543. //计算公历日离当年元旦的天数,为了减少运算,用了两个表
  544. //day_code1[9],day_code2[3]
  545. //如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
  546. //在九月后,天数大于0xff,用表day_code2[3]
  547. //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1
  548. //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1
  549. if (month<10)
  550. {
  551. temp4=day_code1[month-1]+day-1;
  552. }
  553. else
  554. {
  555. temp4=day_code2[month-10]+day-1;
  556. }
  557. if ((month>0x2)&&(year%0x4==0))
  558. { //如果公历月大于2月并且该年的2月为闰月,天数加1
  559. temp4+=1;
  560. }
  561. //计算公历日离当年元旦的天数完成
  562. //判断公历日在春节前还是春节后
  563. if (temp4>=temp3)
  564. { //公历日在春节后或就是春节当日使用下面代码进行运算
  565. temp4-=temp3;
  566. month=0x1;
  567. month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
  568. flag2=get_moon_day(month_p,table_addr);
  569. //检查该农历月为大小还是小月,大月返回1,小月返回0
  570. flag_y=0;
  571. if(flag2==0)temp1=0x1d; //小月29天
  572. else temp1=0x1e; //大小30天
  573. temp2=year_code[table_addr]&0xf0;
  574. temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月
  575. while(temp4>=temp1)
  576. {
  577. temp4-=temp1;
  578. month_p+=1;
  579. if(month==temp2)
  580. {
  581. flag_y=~flag_y;
  582. if(flag_y==0)
  583. month+=1;
  584. }
  585. else month+=1;
  586. flag2=get_moon_day(month_p,table_addr);
  587. if(flag2==0)temp1=0x1d;
  588. else temp1=0x1e;
  589. }
  590. day=temp4+1;
  591. }
  592. else
  593. { //公历日在春节前使用下面代码进行运算
  594. temp3-=temp4;
  595. if (year==0x0)
  596. {
  597. year=0x63;c=1;
  598. }
  599. else year-=1;
  600. table_addr-=0x3;
  601. month=0xc;
  602. temp2=year_code[table_addr]&0xf0;
  603. temp2=_cror_(temp2,4);
  604. if (temp2==0)
  605. month_p=0xc;
  606. else
  607. month_p=0xd; //
  608. /*month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12*/
  609. flag_y=0;
  610. flag2=get_moon_day(month_p,table_addr);
  611. if(flag2==0)temp1=0x1d;
  612. else temp1=0x1e;
  613. while(temp3>temp1)
  614. {
  615. temp3-=temp1;
  616. month_p-=1;
  617. if(flag_y==0)month-=1;
  618. if(month==temp2)flag_y=~flag_y;
  619. flag2=get_moon_day(month_p,table_addr);
  620. if(flag2==0)temp1=0x1d;
  621. else temp1=0x1e;
  622. }
  623. day=temp1-temp3+1;
  624. }
  625. c_moon=c; //HEX->BCD ,运算结束后,把数据转换为BCD数据
  626. temp1=year/10;
  627. temp1=_crol_(temp1,4);
  628. temp2=year%10;
  629. year_moon=temp1|temp2;
  630. temp1=month/10;
  631. temp1=_crol_(temp1,4);
  632. temp2=month%10;
  633. month_moon=temp1|temp2;
  634. temp1=day/10;
  635. temp1=_crol_(temp1,4);
  636. temp2=day%10;
  637. day_moon=temp1|temp2;
  638. }
  639. /*函数功能:输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)
  640. 调用函数示例:Conver_week(c_sun,year_sun,month_sun,day_sun)
  641. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
  642. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
  643. 纪,c_sun=1为19世纪
  644. 调用函数后,原有数据不变,读week得出阴历BCD数据
  645. */
  646. code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
  647. /*
  648. 算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在
  649. 闰年又不到3 月份上述之和要减一天再除7
  650. 星期数为0
  651. */
  652. /*void Conver_week(bit c,uchar year,uchar month,uchar day)
  653. {//c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
  654. uchar temp1,temp2;
  655. temp1=year/16; //BCD->hex 先把数据转换为十六进制
  656. temp2=year%16;
  657. year=temp1*10+temp2;
  658. temp1=month/16;
  659. temp2=month%16;
  660. month=temp1*10+temp2;
  661. temp1=day/16;
  662. temp2=day%16;
  663. day=temp1*10+temp2;
  664. if (c==0){year+=0x64;} //如果为21世纪,年份数加100
  665. temp1=year/0x4; //所过闰年数只算1900年之后的
  666. temp2=year+temp1;
  667. temp2=temp2%0x7; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据
  668. temp2=temp2+day+table_week[month-1];
  669. if (year%0x4==0&&month<3)temp2-=1;
  670. week=temp2%0x7;
  671. }*/
  672. //test
  673. uchar c_sun,year_sun,month_sun,day_sun;
  674. /****************************************************************************************************************************
  675. 函数功能: 二十四节气数据库
  676. 入口参数: unsigned char(yy,mo,dd) 对应 年月日
  677. 出口参数: unsigned char(0-24) 1-24对应二十四节气
  678. 作者    : TOTOP
  679. 二十四节气数据库(1901--2050)
  680. 数据格式说明:   
  681. 如1901年的节气为   
  682.      1月    2月     3月     4月       5月      6月    7月     8月      9月    10月   11月    12月   
  683. [ 6,21][ 4,19][ 6,21][ 5,21][ 6,22][ 6,22][ 8,23][ 8,24][ 8,24][ 8,24][ 8,23][ 8,22]   
  684. [ 9, 6][11, 4][ 9, 6][10, 6][ 9, 7][ 9, 7][ 7, 8][ 7, 9][ 7, 9][ 7, 9][ 7, 8][ 7,15]   
  685. 上面第一行数据为每月节气对应公历日期,15减去每月第一个节气,每月第二个节气减去15得第二
  686. 行,这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存
  687. 放第二个节气的数据,可得下表   
  688. ****************************************************************************************************************************/
  689. uchar code jieqi_code[]=
  690. {
  691.        0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2000   
  692.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2001   
  693.        0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x78,0x87,0x87,     //2002   
  694.        0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x69,0x78,0x87,     //2003   
  695.        0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2004   
  696.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2005   
  697.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2006   
  698.        0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x69,0x78,0x87,     //2007   
  699.        0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,     //2008   
  700.        0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2009   
  701.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2010   
  702.        0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x79,0x78,0x87,     //2011   
  703.        0x96,0xB4,0xA5,0xB5,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,     //2012   
  704.        0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,     //2013   
  705.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2014   
  706.        0x95,0xB4,0x96,0xA5,0x96,0x97,0x88,0x78,0x78,0x79,0x77,0x87,     //2015   
  707.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,     //2016   
  708.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,     //2017   
  709.        0xA5,0xB4,0xA6,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2018   
  710.        0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x79,0x77,0x87,     //2019   
  711.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x86,     //2020   
  712.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2021   
  713.        0xA5,0xB4,0xA5,0xA5,0xA6,0x96,0x88,0x88,0x88,0x78,0x87,0x87,     //2022   
  714.        0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x79,0x77,0x87,     //2023   
  715.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,     //2024   
  716.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2025   
  717.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2026   
  718.        0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x78,0x87,0x87,     //2027   
  719.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,     //2028   
  720.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2029   
  721.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2030   
  722.        0xA5,0xB4,0x96,0xA5,0x96,0x96,0x88,0x78,0x78,0x78,0x87,0x87,     //2031   
  723.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,     //2032   
  724.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x86,     //2033   
  725.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x78,0x88,0x78,0x87,0x87,     //2034   
  726.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2035   
  727.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,     //2036   
  728.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2037   
  729.        0xA5,0xB3,0xA5,0xA5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2038   
  730.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2039   
  731.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x96,     //2040   
  732.        0xA5,0xC3,0xA5,0xB5,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,     //2041   
  733.        0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x88,0x88,0x88,0x78,0x87,0x87,     //2042   
  734.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2043   
  735.        0x95,0xB4,0xA5,0xB4,0xA5,0xA6,0x97,0x87,0x87,0x88,0x87,0x96,     //2044   
  736.        0xA5,0xC3,0xA5,0xB4,0xA5,0xA6,0x87,0x88,0x87,0x78,0x87,0x86,     //2045   
  737.        0xA5,0xB3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x87,     //2046   
  738.        0xA5,0xB4,0x96,0xA5,0xA6,0x96,0x88,0x88,0x78,0x78,0x87,0x87,     //2047   
  739.        0x95,0xB4,0xA5,0xB4,0xA5,0xA5,0x97,0x87,0x87,0x88,0x86,0x96,     //2048   
  740.        0xA4,0xC3,0xA5,0xA5,0xA5,0xA6,0x97,0x87,0x87,0x78,0x87,0x86,     //2049   
  741.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x78,0x78,0x87,0x87,     //2050
  742.     };
  743. uchar jieqi (uchar y2,m2,d2)
  744. {
  745. uchar temp,d,y,y1,m;
  746. uint addr;
  747. d=d2/16*10+d2%16;
  748. m=m2/16*10+m2%16;
  749. y1=y2/16*10+y2%16+2000;
  750. y=y1-2000;
  751. addr=y*12+m-1;
  752. if(d<15)
  753. {
  754. temp=15-d;
  755. if((jieqi_code[addr]>>4)==temp) return (m*2-1);
  756. else return (0);
  757. }
  758. if(d==15) return (0);
  759. if(d>15)
  760. {
  761. temp=d-15;
  762. if((jieqi_code[addr]&0x0f)==temp) return (m*2);
  763. else return (0);
  764. }
  765. }

  766. /******************************************************************************/
  767. //公历节日数据库表
  768. /******************************************************************************/
  769. void days ()  //公历节日数据库
  770.        {          
  771.         uchar j;
  772.         j=jieqi(yy,mo,dd);
  773.                 if(t/2%2==0)//设置变化的时间,默认是2秒
  774.                 {           //以下自己添加生日、节日信息
  775.                 if ( month_moon== 0x06 && day_moon== 0x02 ){dispString(3, 0, 1, "后天是奇奇的生日");}
  776.    else if ( month_moon== 0x06 && day_moon== 0x03 ){dispString(3, 0, 1, "明天是奇奇的生日");}
  777.    else if ( month_moon== 0x06 && day_moon== 0x04 ){dispString(3, 0, 1, "今天是奇奇的生日");}
  778.    else if ( month_moon== 0x10 && day_moon== 0x07 ){dispString(3, 0, 1, "后天是老婆的生日");}
  779.    else if ( month_moon== 0x10 && day_moon== 0x08 ){dispString(3, 0, 1, "明天是老婆的生日");}
  780.    else if ( month_moon== 0x10 && day_moon== 0x09 ){dispString(3, 0, 1, "今天是老婆的生日");}
  781.    else if ( month_moon== 0x08 && day_moon== 0x01 ){dispString(3, 0, 1, "后天是我的生日! ");}
  782.    else if ( month_moon== 0x08 && day_moon== 0x02 ){dispString(3, 0, 1, "明天是我的生日! ");}
  783.    else if ( month_moon== 0x08 && day_moon== 0x03 ){dispString(3, 0, 1, "今天是我的生日! ");}
  784.    else if ( month_moon== 0x03 && day_moon== 0x23 ){dispString(3, 0, 1, "后天是爸爸的生日");}
  785.    else if ( month_moon== 0x03 && day_moon== 0x24 ){dispString(3, 0, 1, "明天是爸爸的生日");}
  786.    else if ( month_moon== 0x03 && day_moon== 0x25 ){dispString(3, 0, 1, "今天是爸爸的生日");}
  787.    else if ( month_moon== 0x01 && day_moon== 0x30 ){dispString(3, 0, 1, "后天是妈妈的生日");}
  788.    else if ( month_moon== 0x02 && day_moon== 0x01 ){dispString(3, 0, 1, "明天是妈妈的生日");}
  789.    else if ( month_moon== 0x02 && day_moon== 0x02 ){dispString(3, 0, 1, "今天是妈妈的生日");}

  790.                 //农历节日
  791.    else     if ( month_moon== 0x12 && day_moon== 0x29 ){dispString(3, 0, 1, "    明天大年    ");}
  792.    else            if ( month_moon== 0x12 && day_moon== 0x30 ){dispString(3, 0, 1, "    大年三十    ");}
  793.    else            if ( month_moon== 0x05 && day_moon== 0x05 ){dispString(3, 0, 1, "  今天是端午节  ");}
  794.    else                if ( month_moon== 0x08 && day_moon== 0x15 ){dispString(3, 0, 1, "  今天是中秋节  ");}
  795.    else                if ( month_moon== 0x01 && day_moon== 0x15 ){dispString(3, 0, 1, "  今天是元宵节  ");}
  796.    else                if ( month_moon== 0x02 && day_moon== 0x02 ){dispString(3, 0, 1, "  今天是龙抬头  ");}
  797.    else                if ( month_moon== 0x07 && day_moon== 0x07 ){dispString(3, 0, 1, "  今天是七夕!   ");}
  798.    else                if ( month_moon== 0x07 && day_moon== 0x15 ){dispString(3, 0, 1, "  今天是鬼节!   ");}
  799.    else                if ( month_moon== 0x09 && day_moon== 0x09 ){dispString(3, 0, 1, "  今天是重阳节  ");}
  800.    else                if ( month_moon== 0x12 && day_moon== 0x08 ){dispString(3, 0, 1, "  今天是腊八节  ");}
  801.                 //国立节日                                                               
  802.    else     if ( mo == 0x01 && dd == 0x01 ){dispString(3, 0, 1, "    元旦快乐!   ");}//1月
  803.    else                if ( mo == 0x01 && dd == 0x28 ){dispString(3, 0, 1, "今天是世界麻风日");}
  804.                
  805.    else                if ( mo == 0x02 && dd == 0x02 ){dispString(3, 0, 1, "今天是世界湿地日");}//2月
  806.    else                if ( mo == 0x02 && dd == 0x13 ){dispString(3, 0, 1, "  明天情人节了  ");}               
  807.    else                if ( mo == 0x02 && dd == 0x14 ){dispString(3, 0, 1, "  今天是情人节  ");}
  808.                                
  809.    else                if ( mo == 0x03 && dd == 0x01 ){dispString(3, 0, 1, "今天是国际海豹日");}//3月               
  810.    else                if ( mo == 0x03 && dd == 0x03 ){dispString(3, 0, 1, "今天是全国爱耳日");}               
  811.    else                if ( mo == 0x03 && dd == 0x08 ){dispString(3, 0, 1, "今天是3.8 妇女节");}               
  812.    else                if ( mo == 0x03 && dd == 0x12 ){dispString(3, 0, 1, "  今天是植树节  ");}               
  813.    else                if ( mo == 0x03 && dd == 0x14 ){dispString(3, 0, 1, "今天是国际警察日");}               
  814.    else                if ( mo == 0x03 && dd == 0x15 ){dispString(3, 0, 1, "今天消费者权益日");}               
  815.    else                if ( mo == 0x03 && dd == 0x17 ){dispString(3, 0, 1, "今天是国际航海日");}               
  816.    else                if ( mo == 0x03 && dd == 0x21 ){dispString(3, 0, 1, "今天是世界森林日");}               
  817.    else                if ( mo == 0x03 && dd == 0x22 ){dispString(3, 0, 1, "今天是世界水日!");}               
  818.    else                if ( mo == 0x03 && dd == 0x23 ){dispString(3, 0, 1, "今天是世界气象日");}               
  819.    else                if ( mo == 0x03 && dd == 0x24 ){dispString(3, 0, 1, "世界防治结核病日");}
  820.                                
  821.    else                if ( mo == 0x04 && dd == 0x01 ){dispString(3, 0, 1, "愚人节,小心上当");}//4               
  822.    else                if ( mo == 0x04 && dd == 0x07 ){dispString(3, 0, 1, "今天是世界卫生日");}               
  823.    else                if ( mo == 0x04 && dd == 0x08 ){dispString(3, 0, 1, "  今天复活节!   ");}               
  824.    else                if ( mo == 0x04 && dd == 0x13 ){dispString(3, 0, 1, "  黑色星期五!   ");}
  825.                                
  826.    else                if ( mo == 0x05 && dd == 0x01 ){dispString(3, 0, 1, "  今天是劳动节  ");}//5               
  827.    else                if ( mo == 0x05 && dd == 0x04 ){dispString(3, 0, 1, "今天是五四青年节");}               
  828.    else                if ( mo == 0x05 && dd == 0x08 ){dispString(3, 0, 1, "今天世界红十字日");}               
  829.    else                if ( mo == 0x05 && dd == 0x12 ){dispString(3, 0, 1, "今天是国际护士节");}               
  830.    else                if ( mo == 0x05 && dd == 0x05 ){dispString(3, 0, 1, "近日注意母亲节! ");}               
  831.    else                if ( mo == 0x05 && dd == 0x15 ){dispString(3, 0, 1, "今天是国际家庭日");}
  832.    else                if ( mo == 0x05 && dd == 0x31 ){dispString(3, 0, 1, "今天是世界无烟日");}               
  833.                                
  834.    else                if ( mo == 0x06 && dd == 0x01 ){dispString(3, 0, 1, "今天是国际儿童节");}//6
  835.    else                if ( mo == 0x06 && dd == 0x05 ){dispString(3, 0, 1, "今天是世界环境日");}               
  836.    else                if ( mo == 0x06 && dd == 0x26 ){dispString(3, 0, 1, "今天是国际禁毒日");}               
  837.    else                if ( mo == 0x06 && dd == 0x06 ){dispString(3, 0, 1, "今天是全国爱眼日");}               
  838.    else                if ( mo == 0x06 && dd == 0x13 ){dispString(3, 0, 1, "近日注意父亲节! ");}
  839.    else                if ( mo == 0x06 && dd == 0x15 ){dispString(3, 0, 1, "近日注意父亲节! ");}
  840.                                
  841.    else                if ( mo == 0x07 && dd == 0x01 ){dispString(3, 0, 1, "香港回归记念日! ");}//7
  842.    else                if ( mo == 0x07 && dd == 0x07 ){dispString(3, 0, 1, "抗日战争记念日! ");}
  843.    else                if ( mo == 0x07 && dd == 0x11 ){dispString(3, 0, 1, "今天是世界人口日");}

  844.    else                if ( mo == 0x08 && dd == 0x01 ){dispString(3, 0, 1, "今天是八一建军节");}//8
  845.    else                if ( mo == 0x08 && dd == 0x08 ){dispString(3, 0, 1, "今天是中国男子节");}
  846.    else                if ( mo == 0x08 && dd == 0x15 ){dispString(3, 0, 1, "抗战胜利记念日!");}

  847.    else                if ( mo == 0x09 && dd == 0x10 ){dispString(3, 0, 1, "  今天是教师节  ");}//9
  848.    else                if ( mo == 0x09 && dd == 0x18 ){dispString(3, 0, 1, "九·一八事变记念");}
  849.    else                if ( mo == 0x09 && dd == 0x20 ){dispString(3, 0, 1, "今天是国际爱牙日");}
  850.    else                if ( mo == 0x09 && dd == 0x27 ){dispString(3, 0, 1, "今天是世界旅游日");}

  851.    else                if ( mo == 0x10 && dd == 0x01 ){dispString(3, 0, 1, "  今天是国庆节  ");}//10
  852.    else                if ( mo == 0x10 && dd == 0x04 ){dispString(3, 0, 1, "今天是世界动物日");}
  853.    else                if ( mo == 0x10 && dd == 0x24 ){dispString(3, 0, 1, "今天是联合国日! ");}
  854.    else                if ( mo == 0x10 && dd == 0x12 ){dispString(3, 0, 1, "明天国际教师节! ");}
  855.    else                if ( mo == 0x10 && dd == 0x13 ){dispString(3, 0, 1, "今天是国际教师节");}

  856.    else                if ( mo == 0x11 && dd == 0x10 ){dispString(3, 0, 1, "今天是世界青年节");}//11
  857.    else                if ( mo == 0x11 && dd == 0x17 ){dispString(3, 0, 1, "今天是世界学生节");}

  858.    else                if ( mo == 0x12 && dd == 0x01 ){dispString(3, 0, 1, "今天世界艾滋病日");}//12
  859.    else                if ( mo == 0x12 && dd == 0x23 ){dispString(3, 0, 1, "  明晚平安夜!   ");}
  860.    else                if ( mo == 0x12 && dd == 0x24 ){dispString(3, 0, 1, "  今晚平安夜!   ");}
  861.    else                if ( mo == 0x12 && dd == 0x25 ){dispString(3, 0, 1, "    圣诞快乐    ");}
  862.    else                if ( mo == 0x12 && dd == 0x31 ){dispString(3, 0, 1, "    明日元旦    ");}
  863.                   }
  864.                 else{
  865.                         //二十四节气
  866.                if (j==1){dispString(3, 0, 1, "    今天小寒    ");}
  867.    else        if (j==2){dispString(3, 0, 1, "    今天大寒    ");}
  868.    else        if (j==3){dispString(3, 0, 1, "    今天立春    ");}
  869.    else        if (j==4){dispString(3, 0, 1, "    今天雨水    ");}
  870.    else        if (j==5){dispString(3, 0, 1, "    今天惊蛰    ");}
  871.    else        if (j==6){dispString(3, 0, 1, "    今天春分    ");}
  872.    else        if (j==7){dispString(3, 0, 1, "    今天清明    ");}
  873.    else        if (j==8){dispString(3, 0, 1, "    今天谷雨    ");}
  874.    else        if (j==9){dispString(3, 0, 1, "    今天立夏    ");}
  875.    else        if (j==10){dispString(3, 0, 1, "    今天小满    ");}
  876.    else        if (j==11){dispString(3, 0, 1, "    今天芒种    ");}
  877.    else        if (j==12){dispString(3, 0, 1, "    今天夏至    ");}
  878.    else        if (j==13){dispString(3, 0, 1, "    今天小暑    ");}
  879.    else        if (j==14){dispString(3, 0, 1, "    今天大暑    ");}
  880.    else        if (j==15){dispString(3, 0, 1, "    今天立秋    ");}
  881.    else        if (j==16){dispString(3, 0, 1, "    今天处暑    ");}
  882.    else        if (j==17){dispString(3, 0, 1, "    今天白露    ");}
  883.    else        if (j==18){dispString(3, 0, 1, "    今天秋分    ");}
  884.    else        if (j==19){dispString(3, 0, 1, "    今天寒露    ");}
  885.    else        if (j==20){dispString(3, 0, 1, "    今天霜降    ");}
  886.    else        if (j==21){dispString(3, 0, 1, "    今天立冬    ");}
  887.    else        if (j==22){dispString(3, 0, 1, "    今天小雪    ");}
  888.    else        if (j==23){dispString(3, 0, 1, "    今天大雪    ");}
  889.    else        if (j==24){dispString(3, 0, 1, "    今天冬至    ");}

  890.    //非节日时显示时晨信息
  891.    else {   if ( hh >= 0x04 && hh <  0x06 ){dispString(3, 0, 1, "  凌晨  点  分  ");
  892.                         lcdWriteCommand(0x9b);
  893.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  894.                         else{lcdWriteData(0x20);}//同上       
  895.                     lcdWriteData(hh1%10+0x30);
  896.                     lcdWriteCommand(0x9d);          //":"
  897.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  898.                         else{lcdWriteData(0x20);}//同上       
  899.                 lcdWriteData(mm%16+0x30); }
  900.                         if ( hh >= 0x06 && hh <  0x08 ){dispString(3, 0, 1, "  早晨  点  分  ");
  901.                         lcdWriteCommand(0x9b);
  902.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  903.                         else{lcdWriteData(0x20);}//同上       
  904.                     lcdWriteData(hh1%10+0x30);
  905.                     lcdWriteCommand(0x9d);          //":"
  906.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  907.                         else{lcdWriteData(0x20);}//同上       
  908.                 lcdWriteData(mm%16+0x30); }
  909.                         if ( hh >= 0x08 && hh <  0x12 ){dispString(3, 0, 1, "  上午  点  分  ");
  910.                         lcdWriteCommand(0x9b);
  911.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  912.                         else{lcdWriteData(0x20);}//同上       
  913.                     lcdWriteData(hh1%10+0x30);
  914.                     lcdWriteCommand(0x9d);          //":"
  915.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  916.                         else{lcdWriteData(0x20);}//同上       
  917.                 lcdWriteData(mm%16+0x30); }
  918.                         if ( hh == 0x12)               {dispString(3, 0, 1, "  中午  点  分  ");
  919.                         lcdWriteCommand(0x9b);
  920.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  921.                         else{lcdWriteData(0x20);}//同上       
  922.                     lcdWriteData(hh1%10+0x30);
  923.                     lcdWriteCommand(0x9d);          //":"
  924.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  925.                         else{lcdWriteData(0x20);}//同上       
  926.                 lcdWriteData(mm%16+0x30); }
  927.                         if ( hh >= 0x13 && hh <  0x18 ){dispString(3, 0, 1, "  下午  点  分  ");
  928.                         lcdWriteCommand(0x9b);
  929.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  930.                         else{lcdWriteData(0x20);}//同上       
  931.                     lcdWriteData(hh1%10+0x30);
  932.                     lcdWriteCommand(0x9d);          //":"
  933.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  934.                         else{lcdWriteData(0x20);}//同上       
  935.                 lcdWriteData(mm%16+0x30); }
  936.                         if ( hh >= 0x18 && hh <  0x22 ){dispString(3, 0, 1, "  晚上  点  分  ");
  937.                         lcdWriteCommand(0x9b);
  938.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  939.                         else{lcdWriteData(0x20);}//同上       
  940.                     lcdWriteData(hh1%10+0x30);
  941.                     lcdWriteCommand(0x9d);          //":"
  942.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  943.                         else{lcdWriteData(0x20);}//同上       
  944.                 lcdWriteData(mm%16+0x30); }
  945.                         if ( hh >= 0x22 && hh <= 0x23 ){dispString(3, 0, 1, "  夜里  点  分  ");
  946.                         lcdWriteCommand(0x9b);
  947.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  948.                         else{lcdWriteData(0x20);}//同上       
  949.                     lcdWriteData(hh1%10+0x30);
  950.                     lcdWriteCommand(0x9d);          //":"
  951.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  952.                         else{lcdWriteData(0x20);}//同上       
  953.                 lcdWriteData(mm%16+0x30); }
  954.                         if ( hh >= 0x00 && hh <  0x04 ){dispString(3, 0, 1, "  深夜  点  分  ");
  955.                         lcdWriteCommand(0x9b);
  956.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  957.                         else{lcdWriteData(0x20);}//同上       
  958.                     lcdWriteData(hh1%10+0x30);
  959.                     lcdWriteCommand(0x9d);          //":"
  960.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  961.                         else{lcdWriteData(0x20);}//同上       
  962.                 lcdWriteData(mm%16+0x30); }
  963.                         }

  964.                 }
  965. }
  966. /******************************ds1820程序***************************************/
  967. void delay_18B20(unsigned int i)//延时1微秒
  968. {
  969.    while(i--);
  970. }
  971. void ds1820rst()//ds1820复位*
  972. { unsigned char x=0;
  973. DQ = 1;          //DQ复位
  974. delay_18B20(4); //延时
  975. DQ = 0;          //DQ拉低
  976. delay_18B20(100); //精确延时大于480us
  977. DQ = 1;          //拉高
  978. delay_18B20(40);
  979.    }

  980.    unsigned char ds1820rd()//读数据
  981. { unsigned char i=0;
  982. unsigned char dat = 0;
  983. for (i=8;i>0;i--)
  984. {   DQ = 0; //给脉冲信号
  985.     dat>>=1;
  986.     DQ = 1; //给脉冲信号
  987.     if(DQ)
  988.     dat|=0x80;
  989.     delay_18B20(10);
  990. }
  991.    return(dat);
  992. }
  993. void ds1820wr(uchar wdata)//写数据
  994. {unsigned char i=0;
  995.     for (i=8; i>0; i--)
  996.    { DQ = 0;
  997.      DQ = wdata&0x01;
  998.      delay_18B20(10);
  999.      DQ = 1;
  1000.      wdata>>=1;
  1001.    }
  1002. }
  1003. read_temp()//读取温度值并转换
  1004. {uchar a,b;
  1005. ds1820rst();   
  1006. ds1820wr(0xcc);//跳过读序列号
  1007. ds1820wr(0x44);//启动温度转换
  1008. ds1820rst();   
  1009. ds1820wr(0xcc);//跳过读序列号
  1010. ds1820wr(0xbe);//读取温度
  1011. a=ds1820rd();
  1012. b=ds1820rd();
  1013. tvalue=b;
  1014. tvalue<<=8;
  1015. tvalue=tvalue|a;
  1016.     if(tvalue<0x0fff)
  1017.    tflag=0;
  1018.     else
  1019.    {tvalue=~tvalue+1;
  1020. tflag=1;
  1021.    }
  1022. tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
  1023. return(tvalue);
  1024. }
  1025. /*****************************************************************************/
  1026. //声明(当各函数的排列适当时可不用声明)
  1027. void lcm_w_ss(void);void lcm_w_mm(void);
  1028. void lcm_w_hh(void);void lcm_w_dd(void);
  1029. void lcm_w_mo(void);void lcm_w_yy(void);
  1030. void lcm_w_xq(void);
  1031. unsigned char clock_in(void);
  1032. void clock_out(unsigned char dd);
  1033. void Init_1302(void);
  1034. unsigned char read_clock(unsigned char ord);
  1035. void read_clockS(void);
  1036. void Set_time(unsigned char sel);
  1037. void write_clock(unsigned char ord, unsigned char dd);
  1038. void updata (void);
  1039. void lcmnongli();
  1040. void lcmjieqi();
  1041. void lcmshengxiao();
  1042. /*****************************************************************************/       
  1043. //农历显示
  1044. /******************************************************************************/
  1045. void lcmnongli()
  1046. {
  1047. uchar yue,ri;
  1048. year_sun=yy;
  1049. month_sun=mo;
  1050. day_sun=dd;
  1051. Conversion(c_sun,year_sun,month_sun,day_sun);
  1052. yue=(month_moon/16)*10+month_moon%16;
  1053. year1=yue;
  1054. ri=(day_moon/16)*10+day_moon%16;  //显示农历月
  1055.   if(yue==1){dispString(1, 0, 1, "正"); }
  1056.   if(yue==2){dispString(1, 0, 1, "二"); }
  1057.   if(yue==3){dispString(1, 0, 1, "三"); }
  1058.   if(yue==4){dispString(1, 0, 1, "四"); }
  1059.   if(yue==5){dispString(1, 0, 1, "五"); }
  1060.   if(yue==6){dispString(1, 0, 1, "六"); }
  1061.   if(yue==7){dispString(1, 0, 1, "七"); }
  1062.   if(yue==8){dispString(1, 0, 1, "八"); }
  1063.   if(yue==9){dispString(1, 0, 1, "九"); }
  1064.   if(yue==10){dispString(1, 0, 1, "十"); }
  1065.   if(yue==11){dispString(1, 0, 1, "冬"); }
  1066.   if(yue==12){dispString(1, 0, 1, "腊"); }
  1067.   dispString(1, 1, 1, "月");
  1068.   if(ri<=10)
  1069.    {
  1070.     if(ri==1){  dispString(1, 2, 1, "初一"); }
  1071.     if(ri==2){  dispString(1, 2, 1, "初二"); }
  1072.     if(ri==3){  dispString(1, 2, 1, "初三"); }
  1073.     if(ri==4){  dispString(1, 2, 1, "初四");}
  1074.     if(ri==5){  dispString(1, 2, 1, "初五"); }
  1075.     if(ri==6){  dispString(1, 2, 1, "初六"); }
  1076.     if(ri==7){  dispString(1, 2, 1, "初七"); }
  1077.     if(ri==8){  dispString(1, 2, 1, "初八"); }
  1078.     if(ri==9){  dispString(1, 2, 1, "初九");  }
  1079.     if(ri==10){  dispString(1, 2, 1, "初十"); }
  1080.    }
  1081.   else
  1082.    {
  1083.     if(ri==11){  dispString(1, 2, 1, "十一");}
  1084.     if(ri==12){  dispString(1, 2, 1, "十二");}
  1085.     if(ri==13){  dispString(1, 2, 1, "十三"); }
  1086.     if(ri==14){  dispString(1, 2, 1, "十四"); }
  1087.     if(ri==15){  dispString(1, 2, 1, "十五"); }
  1088.     if(ri==16){  dispString(1, 2, 1, "十六"); }
  1089.     if(ri==17){  dispString(1, 2, 1, "十七"); }
  1090.     if(ri==18){  dispString(1, 2, 1, "十八"); }
  1091.     if(ri==19){  dispString(1, 2, 1, "十九"); }
  1092.     if(ri==20){  dispString(1, 2, 1, "二十");}
  1093.     if(ri==21){  dispString(1, 2, 1, "廿一");  }
  1094.     if(ri==22){  dispString(1, 2, 1, "廿二");}
  1095.     if(ri==23){  dispString(1, 2, 1, "廿三"); }
  1096.     if(ri==24){  dispString(1, 2, 1, "廿四"); }
  1097.     if(ri==25){  dispString(1, 2, 1, "廿五"); }
  1098.     if(ri==26){  dispString(1, 2, 1, "廿六");}
  1099.     if(ri==27){  dispString(1, 2, 1, "廿七"); }
  1100.     if(ri==28){  dispString(1, 2, 1, "廿八"); }
  1101.     if(ri==29){  dispString(1, 2, 1, "廿九");}
  1102.     if(ri==30){  dispString(1, 2, 1, "三十"); }
  1103.    }
  1104. }
  1105. /******************************************************************************/
  1106. //十二生肖显示
  1107. /******************************************************************************/
  1108. void lcmshengxiao()
  1109. {
  1110. uint y3;
  1111. y3=(yy/16*10+yy%16+2000-1900)%12;
  1112. if(year<6 & year1>6) y3--;
  1113. switch(y3)
  1114. {
  1115.   case 0: dispString(0, 6, 1, "子鼠");
  1116.           break;
  1117.   case 1:  dispString(0, 6, 1, "丑牛");
  1118.           break;
  1119.   case 2:  dispString(0, 6, 1, "寅虎");
  1120.           break;
  1121.   case 3:  dispString(0, 6, 1, "卯兔");
  1122.           break;
  1123.   case 4:  dispString(0, 6, 1, "辰龙");
  1124.           break;
  1125.   case 5: dispString(0, 6, 1, "巳蛇");
  1126.           break;
  1127.   case 6: dispString(0, 6, 1, "午马");
  1128.           break;
  1129.   case 7: dispString(0, 6, 1, "未羊");
  1130.           break;
  1131.   case 8:  dispString(0, 6, 1, "申猴");
  1132.           break;
  1133.   case 9:  dispString(0, 6, 1, "酉鸡");
  1134.           break;
  1135.   case 10:  dispString(0, 6, 1, "戌狗");
  1136.           break;
  1137.   case 11: dispString(0, 6, 1, "亥猪");
  1138.           break;
  1139. }
  1140. }
  1141. /*****************************************************************************/
  1142. //调时用加1程序
  1143. void Set_time(unsigned char sel)//根据选择调整的相应项目加1并写入DS1302
  1144. {
  1145.   signed char address,item;
  1146.   signed char max,mini;
  1147.   dispString(3, 2, 1, "设置");
  1148.   if(sel==6)  {dispString(3, 4, 1, "秒钟");address=0x80; max=59;mini=0;}     //秒7
  1149.   if(sel==5)  {dispString(3, 4, 1, "分钟");address=0x82; max=59;mini=0;}    //分钟6
  1150.   if(sel==4)  {dispString(3, 4, 1, "小时");address=0x84; max=23;mini=0;}    //小时5
  1151.   if(sel==3)  {dispString(3, 4, 1, "星期");address=0x8a; max=7;mini=1;}    //星期4  
  1152.   if(sel==2)  {dispString(3, 4, 1, "日期");address=0x86; max=31;mini=1;}    //日3
  1153.   if(sel==1)  {dispString(3, 4, 1, "月份");address=0x88; max=12;mini=1;}    //月2
  1154.   if(sel==0)  {dispString(3, 4, 1, "年份");address=0x8c; max=99; mini=0;}    //年1
  1155.   switch(sel)
  1156.         {
  1157.             case 0: convertChar(0, 1, 2);
  1158.                                 break;
  1159.                 case 1: convertChar(0, 2, 3);
  1160.                                 break;
  1161.                 case 2:        convertChar(0, 4, 2);
  1162.                                 break;
  1163.                 case 3: convertChar(1, 7, 2);
  1164.                                 break;
  1165.                 case 4: convertChar(2, 0, 2);
  1166.                                 break;
  1167.                 case 5: convertChar(2, 1, 3);
  1168.                                 break;
  1169.                 case 6: convertChar(2, 3, 2);
  1170.                                 break;
  1171.         }
  1172.   //读取1302某地址上的数值转换成10进制赋给item
  1173.   item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  1174.   if(KEY_2 == 0)
  1175.   {
  1176.           item++;//数加 1  
  1177.   }
  1178.   if(KEY_4 == 0)
  1179.   {
  1180.           item--;//数减 1
  1181.   }
  1182.   if(item>max) item=mini;//查看数值有效范围   
  1183.   if(item<mini) item=max;           
  1184.   write_clock(0x8e,0x00);//允许写操作
  1185.   write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  1186.   write_clock(0x8e,0x80);//写保护,禁止写操作
  1187.   
  1188. }
  1189. /*****************************************************************************/
  1190. //设置1302的初始时间(自动初始化)
  1191. void Init_1302(void){//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
  1192.         unsigned char f;
  1193.         if(read_clock(0xc1) != 0xaa){
  1194.                 write_clock(0x8e,0x00);//允许写操作
  1195.                 write_clock(0x8c,0x07);//年
  1196.                 write_clock(0x8a,0x01);//星期
  1197.                 write_clock(0x88,0x01);//月
  1198.                 write_clock(0x86,0x01);//日
  1199.                 write_clock(0x84,0x00);//小时
  1200.                 write_clock(0x82,0x00);//分钟
  1201.                 write_clock(0x80,0x00);//秒
  1202.                 write_clock(0x90,0xa5);//充电       
  1203.                 write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
  1204.                 for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
  1205.                         write_clock(0xc2+f,0x00);
  1206.                 }
  1207.                 write_clock(0x8e,0x80);//禁止写操作
  1208.         }
  1209. }
  1210. /*****************************************************************************/
  1211. //DS1302写数据(底层协议)
  1212. void write_clock(unsigned char ord, unsigned char dd){
  1213.         clock_clk=0;
  1214.         clock_Rst=0;
  1215.         clock_Rst=1;
  1216.         clock_out(ord);
  1217.         clock_out(dd);
  1218.         clock_Rst=0;
  1219.         clock_clk=1;
  1220. }
  1221. /*****************************************************************************/
  1222. //1302驱动程序(底层协议)
  1223. void clock_out(unsigned char dd){
  1224.         ACC=dd;
  1225.         clock_dat=a0; clock_clk=1; clock_clk=0;
  1226.         clock_dat=a1; clock_clk=1; clock_clk=0;
  1227.         clock_dat=a2; clock_clk=1; clock_clk=0;
  1228.         clock_dat=a3; clock_clk=1; clock_clk=0;
  1229.         clock_dat=a4; clock_clk=1; clock_clk=0;
  1230.         clock_dat=a5; clock_clk=1; clock_clk=0;
  1231.         clock_dat=a6; clock_clk=1; clock_clk=0;
  1232.         clock_dat=a7; clock_clk=1; clock_clk=0;
  1233. }
  1234. /*****************************************************************************/
  1235. //DS1302写入字节(底层协议)
  1236. unsigned char clock_in(void){
  1237.         clock_dat=1;
  1238.         a0=clock_dat;
  1239.         clock_clk=1; clock_clk=0; a1=clock_dat;
  1240.         clock_clk=1; clock_clk=0; a2=clock_dat;
  1241.         clock_clk=1; clock_clk=0; a3=clock_dat;
  1242.         clock_clk=1; clock_clk=0; a4=clock_dat;
  1243.         clock_clk=1; clock_clk=0; a5=clock_dat;
  1244.         clock_clk=1; clock_clk=0; a6=clock_dat;
  1245.         clock_clk=1; clock_clk=0; a7=clock_dat;
  1246.         return(ACC);
  1247. }
  1248. /*****************************************************************************/
  1249. //DS1302读数据(底层协议)
  1250. unsigned char read_clock(unsigned char ord){
  1251.         unsigned char dd=0;
  1252.         clock_clk=0;
  1253.         clock_Rst=0;
  1254.         clock_Rst=1;
  1255.         clock_out(ord);
  1256.         dd=clock_in();
  1257.         clock_Rst=0;
  1258.         clock_clk=1;
  1259.         return(dd);
  1260. }
  1261. /*****************************************************************************/

  1262. /*****************************************************************************/
  1263. //扬声器驱动程序(闹钟音乐)
  1264. /*****************************************************************************/       
  1265. void Beep(void)
  1266. {//BELL-扬声器--整点报时
  1267.         unsigned char a;//定义变量用于发声的长度设置
  1268.         for(a=60;a>0;a--){//第一个声音的长度
  1269.                 beep = ~beep;//取反扬声器驱动口,以产生音频
  1270.                 Delay(100);//音调设置延时
  1271.         }
  1272.         for(a=100;a>0;a--){//同上
  1273.                 beep = ~beep;
  1274.                 Delay(80);//
  1275.         }
  1276.         for(a=100;a>0;a--){//同上
  1277.                 beep = ~beep;
  1278.                 Delay(30);//
  1279.         }
  1280.         beep = 1;//音乐结束后扬声器拉高关闭
  1281. }
  1282. /*****************************************************************************/
  1283. void Beep_set(void){//BELL -扬声器--确定设置
  1284.         unsigned char a;//定义变量用于发声的长度设置
  1285.         for(a=50;a>0;a--){//第一个声音的长度
  1286.                 beep = ~beep;//取反扬声器驱动口,以产生音频
  1287.                 Delay(100);//音调设置延时
  1288.         }
  1289.         for(a=100;a>0;a--){//同上
  1290.                 beep = ~beep;
  1291.                 Delay(50);//
  1292.         }
  1293.         for(a=50;a>0;a--){//同上
  1294.                 beep = ~beep;
  1295.                 Delay(100);//
  1296.         }
  1297.         beep = 1;//音乐结束后扬声器拉高关闭
  1298. }
  1299. /*****************************************************************************/
  1300. void Beep_key(void){//-扬声器--按键音
  1301.         unsigned char a;//定义变量用于发声的长度设置
  1302.         for(a=100;a>0;a--){//声音的长度
  1303.                 beep = ~beep;
  1304.                 Delay(50);//音调设置延时
  1305.         }
  1306.         beep = 1;//音乐结束后扬声器拉高关闭
  1307. }               
  1308. /*****************************************************************************/

  1309. /*****************************************************************************/
  1310. //电子钟应用层程序设计
  1311. /*****************************************************************************/
  1312. //向LCM中填写 年 数据
  1313. void lcm_w_yy(void){
  1314.         //if(read_clock(0x8d) != yy){
  1315.                 yy = read_clock(0x8d);
  1316.                 dispString(0, 0, 1, "20");
  1317.                 lcdWriteCommand(0x81);
  1318.                 lcdWriteData((yy/16)+0x30);       
  1319.                 lcdWriteData(yy%16+0x30);
  1320. }        //}
  1321. /*****************************************************************************/
  1322. //向LCM中填写 月 数据
  1323. void lcm_w_mo(void){
  1324.         //if(read_clock(0x89) != mo){
  1325.                 mo = read_clock(0x89);
  1326.                     lcdWriteCommand(0x82);
  1327.                         lcdWriteData(0x2d);
  1328.                         lcdWriteData((mo/16)+0x30);        //十位消隐               
  1329.                     lcdWriteData(mo%16+0x30);
  1330.                         lcdWriteData(0x2d);
  1331.                         year=(mo/16*10)+mo%16;
  1332. }        //}
  1333. /*****************************************************************************/
  1334. //星期处理并送入LCM的指定区域
  1335. void lcm_w_xq(void){
  1336.         //if(read_clock(0x8b) != xq){
  1337.         xq = read_clock(0x8b);
  1338.         selx = (read_clock(0x8b))%16; //字节低4位的BCD码放入selx
  1339.                 if(selx==7)  {dispString(1, 7, 1, "日");}    //
  1340.                   if(selx==6)  {dispString(1, 7, 1, "六");}    //
  1341.                   if(selx==5)  {dispString(1, 7, 1, "五");}    //
  1342.                   if(selx==4)  {dispString(1, 7, 1, "四");}    //
  1343.                   if(selx==3)  {dispString(1, 7, 1, "三");}    //
  1344.                   if(selx==2)  {dispString(1, 7, 1, "二");}    //
  1345.                   if(selx==1)  {dispString(1, 7, 1, "一");}    //星期一
  1346.         dispString(1, 5, 1, "星期");
  1347. }        //}
  1348. /*****************************************************************************/
  1349. //向LCM中填写 日 数据
  1350. void lcm_w_dd(void){
  1351. //        if(read_clock(0x87) != dd){
  1352.                 dd = read_clock(0x87);
  1353.                 lcdWriteCommand(0x84);
  1354.                 lcdWriteData((dd/16)+0x30);        //十位消隐       
  1355.                 lcdWriteData(dd%16+0x30);
  1356. }        //}
  1357. /*****************************************************************************/
  1358. //向LCM中填写 小时 数据
  1359. void lcm_w_hh(void){
  1360.         if(read_clock(0x85) != hh){
  1361.                 hh = read_clock(0x85);
  1362.                         if (hh > 0x07 && hh < 0x22 && w == 0){
  1363.                                 Beep();//整点报时音
  1364.                         }
  1365.                 }
  1366.                 lcdWriteCommand(0x88);
  1367.                 lcdWriteData((hh/16)+0x30);
  1368.                 lcdWriteData(hh%16+0x30);
  1369.                 hh1=hh/16*10+hh%16;
  1370.                 if(hh1>12) hh1=(hh1-12);
  1371.                                
  1372. }
  1373. /*****************************************************************************/
  1374. //向LCM中填写 分钟 数据
  1375. void lcm_w_mm(void){
  1376.         if(read_clock(0x83) != mm)
  1377.             {               
  1378.                 mm = read_clock(0x83);
  1379.             }
  1380.                 lcdWriteCommand(0x89);
  1381.                 if(t/1%2==0)lcdWriteData(0x3a);          //":"
  1382.                 else{lcdWriteData(0x20);}
  1383.                 lcdWriteData((mm/16)+0x30);
  1384.                 lcdWriteData(mm%16+0x30);
  1385.                 if(t/1%2==0) lcdWriteData(0x3a);          //":"
  1386.                 else{lcdWriteData(0x20);}       
  1387. }
  1388. void disp_temper()//温度值显示
  1389. {
  1390.     uint temper;
  1391.         uchar temper_ge,temper_shi,temper_bai;
  1392.         temper=read_temp();//读取温度
  1393.         temper_ge=temper%10+0x30;
  1394.         temper_shi=temper%100/10+0x30;
  1395.         temper_bai=temper/100+0x30;
  1396.         if(tflag==1)
  1397.         {
  1398.                 dispString(2, 4, 1, " -");
  1399.         }
  1400.         else
  1401.         {
  1402.          dispString(2, 4, 1, "  ");
  1403.         }  
  1404.         if(temper_bai==0x30) temper_bai=0x20;
  1405.         lcdWriteCommand(0x8d);
  1406. lcdWriteData(temper_bai);
  1407.         lcdWriteData(temper_shi);
  1408. lcdWriteData('.');
  1409. lcdWriteData(temper_ge);

  1410.         dispString(2, 7, 1, "℃");       
  1411.    }
  1412. /*********************************************************************************************************
  1413. 处理显示函数(被调用层)                                       
  1414. *********************************************************************************************************/
  1415. void deal(uchar sfm)
  1416. {
  1417.         shi=sfm/16;
  1418.         ge=sfm%16;
  1419. }
  1420. /********************************************************************************************************
  1421. 12864显示时分秒函数(被调用层)
  1422. ********************************************************************************************************/
  1423. void display(uchar add,uchar dat)
  1424. {
  1425.         uchar i,j=0;
  1426.         for(i=16;i<32;i++)
  1427.         {                       
  1428.                 lcdWriteCommand(0x80+i);                                                       
  1429.                 lcdWriteCommand(0x90+add);                                               
  1430.                 lcdWriteData(tab[dat][j++]);
  1431.                 lcdWriteData(tab[dat][j++]);
  1432.         }
  1433.         for(i=0;i<16;i++)
  1434.         {
  1435.                 lcdWriteCommand(0x80+i);
  1436.                 lcdWriteCommand(0x88+add);
  1437.                 lcdWriteData(tab[dat][j++]);
  1438.                 lcdWriteData(tab[dat][j++]);
  1439.         }
  1440. }
  1441. /*********************************************************************************************************
  1442. 初始化函数(被调用层)                                       
  1443. *********************************************************************************************************/
  1444. void init_dz()
  1445. {
  1446.         lcdWriteCommand(0x30);                                                        //选择8bit数据流,基本指令集
  1447.         lcdWriteCommand(0x0c);                                                      //开显示(无游标、不反白)
  1448.         lcdWriteCommand(0x01);                                                       //清除显示,并且设定地址指针为00H
  1449.         dispString(0, 2, 1, "年  月  日");       
  1450.         dispString(3, 0, 1, "星期");       
  1451.         lcdWriteCommand(0x81);                                                         //处理年,并显示
  1452.         yy = read_clock(0x8d);                               
  1453.         deal(yy);
  1454.         lcdWriteData(shi+0x30);
  1455.         lcdWriteData(ge+0x30);
  1456.                                                                                                  //处理月,并显示
  1457.         lcdWriteCommand(0x83);
  1458.         mo = read_clock(0x89);
  1459.         deal(mo);
  1460.         lcdWriteData(shi+0x30);
  1461.         lcdWriteData(ge+0x30);

  1462.         lcdWriteCommand(0x85);                                                         //处理日,并显示
  1463.         dd = read_clock(0x87);
  1464.         deal(dd);
  1465.         lcdWriteData(shi+0x30);
  1466.         lcdWriteData(ge+0x30);
  1467.                                                                                                                                   //处理星期,并显示
  1468.         xq = read_clock(0x8b);
  1469.         switch(xq)
  1470.         {
  1471.                 case 1:        dispString(3, 2, 1, "一");break;
  1472.                 case 2:        dispString(3, 2, 1, "二");break;
  1473.                 case 3:        dispString(3, 2, 1, "三");break;
  1474.                 case 4:        dispString(3, 2, 1, "四");break;
  1475.                 case 5:        dispString(3, 2, 1, "五");break;
  1476.                 case 6:        dispString(3, 2, 1, "六");break;
  1477.                 case 7:        dispString(3, 2, 1, "日");break;
  1478.                 default:break;
  1479.         }
  1480.         dispString(3, 7, 1, "℃");
  1481.         lcdWriteCommand(0x36);                                                         //启动扩充指令集,启动绘图模式
  1482.     clear_img();                                                                //清理图片缓冲区
  1483.         hh = read_clock(0x85);                                                         //处理小时,并显示
  1484.         deal(hh);
  1485.         display(0,shi);
  1486.         display(1,ge);
  1487.         display(2,10);
  1488.         mm = read_clock(0x83);                                                         //处理分钟,并显示
  1489.         deal(mm);
  1490.         display(3,shi);
  1491.         display(4,ge);
  1492.         display(5,10);
  1493.         ss = read_clock(0x81);                                                         //处理秒,并显示
  1494.         deal(ss);
  1495.         display(6,shi);
  1496.         display(7,ge);
  1497. }
  1498. /********************************************************************************************************
  1499. 在12864上显示时间
  1500. ********************************************************************************************************/
  1501. void disp_sfm()
  1502. {
  1503.         uint temper;
  1504.         uchar temper_ge,temper_shi,temper_bai,day_temp,date_temp,month_temp,year_temp;
  1505.         lcdWriteCommand(0x36);                                                         //启动扩充指令集,启动绘图模式
  1506.     ss = read_clock(0x81);        //更新数据                                                
  1507.         if(sec_temp!=ss)//读取秒,只要有改变液晶显示也改变
  1508.         {
  1509.                 sec_temp=ss;
  1510.                 deal(sec_temp);
  1511.                 if(secl!=shi)
  1512.                 {
  1513.                         secl=shi;
  1514.                         display(6,secl);
  1515.                 }
  1516.                 display(7,ge);       
  1517.         }
  1518.         mm = read_clock(0x83);                                                         //读取分,只要有改变液晶显示也改变
  1519.         if(min_temp!=mm)
  1520.         {
  1521.                 min_temp=mm;
  1522.                 deal(mm);
  1523.                 display(3,shi);
  1524.                 display(4,ge);
  1525.         }
  1526.         hh = read_clock(0x85);                                                        //读取小时,只要有改变液晶显示也改变
  1527.         if(hour_temp!=hh)
  1528.         {
  1529.                 hour_temp=hh;
  1530.                 deal(hh);
  1531.                 display(0,shi);
  1532.                 display(1,ge);
  1533.         }

  1534.         if(ge/1%2==0)
  1535.         {
  1536.         display(2,10);
  1537.         display(5,10);
  1538.         }
  1539.         else
  1540.         {
  1541.         display(2,11);
  1542.         display(5,11);
  1543.         }
  1544.          
  1545.         lcdWriteCommand(0x30);
  1546.         dd = read_clock(0x87);                                                //读取日,只要有改变液晶显示也改变
  1547.         if(date_temp!=dd)
  1548.         {       
  1549.                 date_temp=dd;
  1550.                 deal(dd);
  1551.                 lcdWriteCommand(0x85);
  1552.                 lcdWriteData(shi+0x30);
  1553.                 lcdWriteData(ge+0x30);
  1554.         }
  1555.         mo = read_clock(0x89);                                                //读取月,只要有改变液晶显示也改变
  1556.         if(month_temp!=mo)
  1557.         {
  1558.                 month_temp=mo;
  1559.                 lcdWriteCommand(0x83);
  1560.                 deal(mo);
  1561.                 lcdWriteData(shi+0x30);
  1562.                 lcdWriteData(ge+0x30);
  1563.         }
  1564.         yy = read_clock(0x8d);                                                        //读取年,只要有改变液晶显示也改变
  1565.         if(year_temp!=yy)
  1566.         {
  1567.                 year_temp=yy;
  1568.                 lcdWriteCommand(0x81);
  1569.                 deal(yy);
  1570.                 lcdWriteData(shi+0x30);
  1571.                 lcdWriteData(ge+0x30);
  1572.         }
  1573.                 xq = read_clock(0x8b);                                                         //读取星期,只要有改变液晶显示也改变
  1574.         if(day_temp!=xq)
  1575.         {       
  1576.                 day_temp=xq;
  1577.                 switch(xq)
  1578.         {
  1579.                 case 1:        dispString(3, 2, 1, "一");break;
  1580.                 case 2:        dispString(3, 2, 1, "二");break;
  1581.                 case 3:        dispString(3, 2, 1, "三");break;
  1582.                 case 4:        dispString(3, 2, 1, "四");break;
  1583.                 case 5:        dispString(3, 2, 1, "五");break;
  1584.                 case 6:        dispString(3, 2, 1, "六");break;
  1585.                 case 7:        dispString(3, 2, 1, "日");break;
  1586.                 default:break;
  1587.                 }
  1588.         }
  1589.         temper=read_temp();//读取温度
  1590.         temper_ge=temper%10+0x30;
  1591.         temper_shi=temper%100/10+0x30;
  1592.         temper_bai=temper/100+0x30;
  1593.         if(tflag==1)
  1594.         {

  1595.                         dispString(3, 4, 1, " -");
  1596.         }
  1597.         else
  1598.         {
  1599.          dispString(3, 4, 1, "  ");
  1600.         }
  1601.         if(temper_bai==0x30) temper_bai=0x20;
  1602.         lcdWriteCommand(0x9d);
  1603.         lcdWriteData(temper_bai);
  1604.         lcdWriteData(temper_shi);
  1605.         lcdWriteData('.');
  1606.         lcdWriteData(temper_ge);

  1607.         lcdWriteCommand(0x36);       

  1608. }
  1609. /*****************************************************************************/
  1610. //刷新数据
  1611. void updata (void){
  1612.         lcm_w_ss();//刷新 秒
  1613.                 lcm_w_mm();//刷新 分
  1614.                 lcm_w_hh();//刷新 小时
  1615.                 lcm_w_dd();//刷新 日
  1616.                 lcm_w_xq();//更新星期值       
  1617.                 lcm_w_mo();//刷新 月
  1618.                 lcm_w_yy();//刷新 年
  1619.                 ss = read_clock(0x81);        //更新数据
  1620.                 t=ss/16*10+ss%16;
  1621.                 lcmnongli();
  1622.             lcmshengxiao();
  1623.             disp_temper();
  1624.                 if(w == 0)
  1625.                 {                               
  1626.                         days ();//节日显示
  1627.                 }
  1628.                 if (n==1||n==2||n==3)
  1629.                     {
  1630.                         lcdWriteCommand(0x85);                //秒值在LCM上的写入位置
  1631.                         lcdWriteData(0x20);
  1632.                     lcdWriteData(0x0e);       
  1633.                         }
  1634.                 else{
  1635.                      lcdWriteCommand(0x85);                //秒值在LCM上的写入位置
  1636.                          lcdWriteData(0x20);
  1637.                      lcdWriteData(0x20);       
  1638.                      }                               
  1639. }
  1640. /*****************************************************************************/
  1641. //向LCM中填写 秒 数据
  1642. void lcm_w_ss(void)
  1643. {
  1644.         unsigned int i=0;
  1645.         unsigned char a=0,b=0,c=0;
  1646.         if(read_clock(0x81) != ss){        //判断是否需要更新
  1647.                 ss = read_clock(0x81);        //更新数据
  1648.                 if(w==1&&e==6)
  1649.                 {
  1650.                  if(t/1%2==0)
  1651.                  {
  1652.                 lcdWriteCommand(0x8b);                //秒值在LCM上的写入位置
  1653.                 lcdWriteData((ss/16)+0x30);        //写十位               
  1654.                 lcdWriteData(ss%16+0x30);        //写个位
  1655.                  }
  1656.                  else
  1657.                  {
  1658.                 lcdWriteCommand(0x8b);                //秒值在LCM上的写入位置
  1659.                 lcdWriteData(0x20);        //写十位               
  1660.                 lcdWriteData(0x20);        //写个位
  1661.                  }
  1662.                 }
  1663.                 else
  1664.                 {
  1665.                 lcdWriteCommand(0x8b);                //秒值在LCM上的写入位置
  1666.                 lcdWriteData((ss/16)+0x30);        //写十位               
  1667.                 lcdWriteData(ss%16+0x30);        //写个
  1668.                 }
  1669.     }
  1670. }
  1671. //*****************************Music******************************************************/
  1672. //青春舞曲
  1673. unsigned char code Music_wo[]={   0x17,0x03, 0x16,0x03, 0x11,0x03, 0x15,0x03, 0x17,0x03,
  1674.                                   0x16,0x03, 0x15,0x03, 0x11,0x03, 0x10,0x02, 0x10,0x03,
  1675.                                   0x18,0x03, 0x17,0x01, 0x17,0x03, 0x16,0x03, 0x11,0x03,
  1676.                                   0x15,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x11,0x03,
  1677.                                   0x10,0x02, 0x10,0x03, 0x10,0x03, 0x10,0x01, 0x10,0x03,
  1678.                                   0x10,0x03, 0x16,0x03, 0x18,0x03, 0x17,0x02, 0x1A,0x03,
  1679.                                   0x18,0x03, 0x17,0x02, 0x17,0x03, 0x16,0x03, 0x17,0x01,
  1680.                                   0x17,0x03, 0x16,0x03, 0x11,0x03, 0x15,0x03, 0x17,0x03,
  1681.                                   0x16,0x03, 0x15,0x03, 0x11,0x03, 0x10,0x02, 0x10,0x03,
  1682.                                   0x18,0x03, 0x17,0x01, 0x17,0x03, 0x16,0x03, 0x11,0x03,
  1683.                                   0x15,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x11,0x03,
  1684.                                   0x10,0x02, 0x10,0x03, 0x10,0x03, 0x10,0x01, 0x10,0x67,
  1685.                                   0x15,0x04, 0x15,0x03, 0x15,0x03, 0x15,0x02, 0x15,0x03,
  1686.                                   0x11,0x03, 0x10,0x67, 0x15,0x04, 0x11,0x03, 0x10,0x03,
  1687.                                   0x11,0x01, 0x11,0x03, 0x15,0x03, 0x16,0x03, 0x18,0x03,
  1688.                                   0x17,0x03, 0x16,0x03, 0x15,0x03, 0x11,0x03, 0x10,0x02,
  1689.                                   0x10,0x02, 0x10,0x01, 0x00,0x00 };
  1690. /***********************************************************************************/
  1691. /*------------------整屏写入数据:全亮,或者竖条-----------------------------*/
  1692. void lcdfill(unsigned char disdata)
  1693. { unsigned char x,y;
  1694.         for(y=0;y<32;y++)
  1695.          for(x=0;x<16;x++)
  1696.          { lcdWriteCommand(0x36);
  1697.             lcdWriteCommand(y+0x80);        //行地址
  1698.             lcdWriteCommand(x+0x80);     //列地址
  1699.             lcdWriteCommand(0x30);
  1700.             lcdWriteData(disdata);
  1701.             lcdWriteData(disdata);
  1702.                         DelayM(2);
  1703.             }
  1704.    lcdWriteCommand(0x34);                           
  1705.    lcdWriteCommand(0x36);
  1706.    }
  1707. /*------------------显示横-----------------------------*/
  1708. void Disp_H_Line()
  1709. { unsigned char x,y;
  1710.    unsigned char k=0x00;
  1711.        for(y=0;y<32;y++)
  1712.          { k=~k;
  1713.            for(x=0;x<16;x++)
  1714.          { lcdWriteCommand(0x36);
  1715.             lcdWriteCommand(y+0x80);      //行地址
  1716.             lcdWriteCommand(x+0x80);     //列地址
  1717.             lcdWriteCommand(0x30);
  1718.             lcdWriteData(k);
  1719.             lcdWriteData(k);
  1720.                         DelayM(5);
  1721.            };
  1722.          }
  1723.      lcdWriteCommand(0x34);                          
  1724.    lcdWriteCommand(0x36);
  1725. }
  1726. /*------------------显示边框-------------------------------*/
  1727. void Frame()
  1728. {unsigned char x,y;
  1729.           lcdfill(0x00);
  1730.         for(x=0;x<9;x+=8)
  1731.           for(y=0;y<32;y++)
  1732.            { lcdWriteCommand(0x36);
  1733.             lcdWriteCommand(y+0x80);      //行地址
  1734.             lcdWriteCommand(x+0x80);        //列地址
  1735.             lcdWriteCommand(0x30);
  1736.             lcdWriteData(0x80);
  1737.             lcdWriteData(0x00);
  1738.            
  1739.             lcdWriteCommand(0x36);
  1740.             lcdWriteCommand(y+0x80);      //行地址
  1741.             lcdWriteCommand(x+0x87);        //列地址
  1742.             lcdWriteCommand(0x30);
  1743.             lcdWriteData(0x00);
  1744.             lcdWriteData(0x01);
  1745.             DelayM(5);
  1746.             }
  1747.       for(y=0;y<2;y++)
  1748.          for(x=0;x<8;x++)
  1749.            {lcdWriteCommand(0x36);
  1750.             lcdWriteCommand(y*31+0x80);      //行地址
  1751.             lcdWriteCommand(x+0x80+8*y);        //列地址
  1752.             lcdWriteCommand(0x30);
  1753.             lcdWriteData(0xff);
  1754.             lcdWriteData(0xff);
  1755.                         DelayM(5);
  1756.            }
  1757.          lcdWriteCommand(0x34);
  1758.          lcdWriteCommand(0x36);
  1759.                     }
  1760. /*****************************************************************************/
  1761. void zijian(void)
  1762. {
  1763. lcdClear();
  1764. dispString(1, 0, 1, "    V5.1版本    ");
  1765. dispString(2, 0, 1, "  自检程序开始! ");
  1766. DelayM(2000);
  1767. lcdClear();
  1768. displayPhoto(powerOnPhoto1, OFF);
  1769.                                                    DelayM(2000);
  1770. lcdfill(0xff);               //显示全开
  1771.       DelayM(2000);            
  1772.    
  1773.      Disp_H_Line();                //显示横条
  1774.        DelayM(2000);
  1775.       
  1776.       
  1777.        lcdfill(0xaa);               //显示竖条
  1778.       DelayM(2000);
  1779.      
  1780.       Frame();                     //显示边框
  1781.       DelayM(2000);
  1782.           clear_img();
  1783.           lcdClear();
  1784.           lcdWriteCommand(0x30);       //选择8bit数据流
  1785.       lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1786.       lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1787.           Beep_set();//确定按键音
  1788.           dispString(0, 0, 1, "    自检完成!  ");
  1789.           dispString(2, 0, 1, "  ==景淞电子==  ");
  1790.           dispString(3, 0, 1, "  QQ:379663387  ");
  1791.           DelayM(2000);
  1792.           lcdInit ();
  1793. }
  1794. /*****************************************************************************/
  1795. void naozhong()
  1796. {
  1797.                 lcdClear();
  1798.                   dispString(0, 2, 1, "闹钟设置");
  1799.                   dispString(2, 0, 1, "闹钟");
  1800.                   if(n==0)  {dispString(2, 7, 1, "关");}    //
  1801.                   if(n==1)  {dispString(2, 7, 1, "开");}    //
  1802.                 if(n==2)  {dispString(2, 7, 1, "开");}    //
  1803.                 if(n==3)  {dispString(2, 7, 1, "开");}    //
  1804.                 lcdWriteCommand(0x8b);
  1805.         lcdWriteData((n1/10)+0x30);
  1806.             lcdWriteData(n1%10+0x30);
  1807.             dispString(2, 4, 1, "点");
  1808.             lcdWriteData((n2/10)+0x30);
  1809.         lcdWriteData(n2%10+0x30);
  1810.                    while(1)
  1811.                    {
  1812.                    if (KEY_3 == 0) // 设置时间
  1813.               {
  1814.                 DelayM(20);           //去抖
  1815.                 if(KEY_3 == 0 )
  1816.                   {
  1817.                    Beep_key();//按键音
  1818.                    n++;
  1819.                    if (n >= 4 ){n = 0;}
  1820.                if(n==0)  {dispString(2, 7, 1, "关");}    //
  1821.                  if(n==1)  {dispString(2, 7, 1, "开");}    //
  1822.                    if(n==2)  {dispString(2, 7, 1, "开");}    //
  1823.                    if(n==3)  {dispString(2, 7, 1, "开");}    //
  1824.                    switch(n)
  1825.         {
  1826.               case 0:        convertChar(1, 0, 0);
  1827.                                 break;
  1828.                 case 1: convertChar(1, 0, 0);
  1829.                                 break;
  1830.                 case 2:        convertChar(2, 3, 2);
  1831.                                 break;
  1832.                 case 3: convertChar(2, 5, 2);
  1833.                                 break;
  1834.         }
  1835.                   while(KEY_3 == 0);//等待键松开
  1836.                   }
  1837.                 }
  1838.         if(KEY_4 == 0||KEY_2 == 0)
  1839.         {
  1840.         if (KEY_2 == 0&&n==2) //
  1841.               {
  1842.                  DelayM(20);           //去抖
  1843.                  if(KEY_2 == 0 &&n==2)
  1844.                         {
  1845.                         Beep_key();//按键音
  1846.                         n1++;
  1847.                         if (n1 >= 24 ){n1 = 0;}
  1848.                         while(KEY_2 == 0);//等待键松开
  1849.                         }
  1850.                 }
  1851.         if (KEY_2 == 0&&n==3) //
  1852.               {
  1853.                  DelayM(20);           //去抖
  1854.                  if(KEY_2 == 0&&n==3 )
  1855.                         {
  1856.                         Beep_key();//按键音
  1857.                         n2++;
  1858.                         if (n2>= 60 ){n2 = 0;}
  1859.                         while(KEY_2 == 0);//等待键松开
  1860.                         }
  1861.                 }
  1862.                 if (KEY_4 == 0&&n==2) //
  1863.               {
  1864.                  DelayM(20);           //去抖
  1865.                  if(KEY_4 == 0 &&n==2)
  1866.                         {
  1867.                         Beep_key();//按键音
  1868.                         n1--;
  1869.                         if (n1<0 ){n1 = 23;}
  1870.                         while(KEY_4 == 0);//等待键松开
  1871.                         }
  1872.                 }
  1873.         if (KEY_4 == 0&&n==3) //
  1874.               {
  1875.                  DelayM(20);           //去抖
  1876.                  if(KEY_4 == 0&&n==3 )
  1877.                         {
  1878.                         Beep_key();//按键音
  1879.                         n2--;
  1880.                         if (n2<0 ){n2 = 59;}
  1881.                         while(KEY_4 == 0);//等待键松开
  1882.                         }
  1883.                 }
  1884.                 lcdWriteCommand(0x8b);
  1885.         lcdWriteData((n1/10)+0x30);
  1886.             lcdWriteData(n1%10+0x30);
  1887.             dispString(2, 4, 1, "点");
  1888.             lcdWriteData((n2/10)+0x30);
  1889.         lcdWriteData(n2%10+0x30);
  1890.         }
  1891.            if(KEY_1 == 0 )
  1892.                                             {
  1893.                                                   Beep_key();//按键音
  1894.                                                   k=0;
  1895.                                                   while(KEY_1 == 0);//等待键松开
  1896.                                           lcdInit ();
  1897.                               break;
  1898.                                     }
  1899.    }

  1900. }
  1901. /*****************************************************************************/
  1902. void naozhongdao()
  1903. {
  1904.         hh1=hh/16*10+hh%16;
  1905.         mm1=mm/16*10+mm%16;
  1906.         if(n1==hh1 && n2==mm1 && ss==0)
  1907.                    {
  1908.                     lcdWriteCommand(0x30);       //选择8bit数据流
  1909.             lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1910.             lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1911.                    dispString(0, 1, 1, "闹钟时间到! ");
  1912.                    lcdWriteCommand(0x89);
  1913.            lcdWriteData((n1/10)+0x30);
  1914.                lcdWriteData(n1%10+0x30);
  1915.                    dispString(2, 2, 1, "点");
  1916.                lcdWriteData((n2/10)+0x30);
  1917.            lcdWriteData(n2%10+0x30);
  1918.                    dispString(2, 4, 1, "分");
  1919.                    lcdWriteData(0x02);
  1920.                    Play(Music_wo,0,3,360);
  1921.                    lcdInit ();
  1922.                  }
  1923. }
  1924. /*****************************************************************************/
  1925. void procKey (void)
  1926. {
  1927. uchar key1Times=1 ;
  1928. lcdClear();
  1929. dispString(0, 0, 1, "    功能菜单    ");
  1930. dispString(1, 0, 1, "1:界面    2:设置");
  1931. dispString(2, 0, 1, "3:闹钟    4:音乐");
  1932. dispString(3, 0, 1, "5:自检    6:退出");
  1933. convertChar(1, 0, 6);
  1934. while(KEY_3 == 0);//等待键松开
  1935. while(1)
  1936. {
  1937. if(KEY_4 == 0||KEY_2 == 0)
  1938.                         {
  1939. if (KEY_4 == 0) //
  1940.               {
  1941.                  DelayM(20);           //去抖
  1942.                  if(KEY_4 == 0 && w == 0)
  1943.                         {
  1944.                         Beep_key();//按键音
  1945.                         while(KEY_4 == 0);//等待键松开
  1946.                         key1Times--;
  1947.                         if (key1Times==0 ){key1Times = 6;}
  1948.                         }
  1949.                 }
  1950.                 if (KEY_2 == 0) //
  1951.               {
  1952.                  DelayM(20);           //去抖
  1953.                  if(KEY_2 == 0 && w == 0)
  1954.                         {
  1955.                         Beep_key();//按键音
  1956.                         while(KEY_2 == 0);//等待键松开
  1957.                         key1Times++;
  1958.                         if (key1Times==7 ){key1Times = 1;}
  1959.                         }
  1960.                 }
  1961.         lcdClear();
  1962.         dispString(0, 0, 1, "    功能菜单    ");
  1963.         dispString(1, 0, 1, "1:界面    2:设置");
  1964.         dispString(2, 0, 1, "3:闹钟    4:音乐");
  1965.         dispString(3, 0, 1, "5:自检    6:退出");
  1966.         if (key1Times == 7)
  1967.         {
  1968.                 key1Times = 1;
  1969.         }

  1970.         switch(key1Times)
  1971.         {
  1972.                 case 1: convertChar(1, 0, 6);
  1973.                                 break;
  1974.                 case 2:        convertChar(1, 5, 6);
  1975.                                 break;
  1976.                 case 3: convertChar(2, 0, 6);
  1977.                                 break;
  1978.                 case 4: convertChar(2, 5, 6);
  1979.                                 break;
  1980.                 case 5: convertChar(3, 0, 6);
  1981.                                 break;
  1982.                 case 6: convertChar(3, 5, 6);
  1983.                                 break;
  1984.         }
  1985. }
  1986. if (KEY_1== 0) //
  1987.                          {
  1988.                                DelayM(20);
  1989.                                if(KEY_1 == 0 )
  1990.                                              {                               
  1991.                                           Beep_set();//确定按键音
  1992.                                                   if (key1Times==1 ){if(k==0)k=1;else if(k==1)k=0;lcdInit ();break;}
  1993.                                                   if (key1Times==2 ){clear_img();lcdClear();w=1;Set_time(e); k=1;break;}
  1994.                                                   if (key1Times==3 ){lcdClear();clear_img();k=2;break;}
  1995.                                                   if (key1Times==4 ){clear_img();lcdClear();displayPhoto(powerOnPhoto, OFF);Play(Music_wo,0,3,360);lcdInit ();break;}
  1996.                                                   if (key1Times==5 ){zijian(); break;}
  1997.                                                   if (key1Times==6 ){lcdInit (); break;}
  1998.                                                   
  1999.                                                   }
  2000.                                         }
  2001.   }
  2002. }
  2003. /*****************************************************************************/
  2004. //---主程序---//
  2005. /*****************************************************************************/
  2006. main()
  2007. {
  2008.     KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;//初始键盘
  2009.         yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新
  2010.         Beep_set();//确定按键音       
  2011.     InitialSound();
  2012.         beep=1;
  2013.         Init_1302();
  2014.         lcdWriteCommand(0x30);       //选择8bit数据流
  2015.     lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  2016.     lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  2017.         lcdClear();
  2018.         dispString(0, 0, 1, "┏━━━━━━┓");
  2019.         dispString(1, 0, 1, "┃12864 LCD5.2┃");
  2020.         dispString(2, 0, 1, "┃多功能万年历┃");
  2021.         dispString(3, 0, 1, "┗━━━━━━┛");
  2022.         DelayM(1500); //显示等留1秒
  2023.         lcdInit ();
  2024.         c_sun=0;
  2025. /*****************************************************************************/
  2026.         while(1)
  2027.                 {//主循环
  2028.         if(k==1){updata ();}
  2029.                 if(k==0){disp_sfm();}
  2030.                 if(k==2){naozhong();}
  2031.                 if(n==1||n==2||n==3){naozhongdao();}                               
  2032.                 //------------------------------------------------------------------

  2033.                 if (KEY_3 == 0) // 设置时间
  2034.                                       {
  2035.                                     DelayM(10);           //去抖
  2036.                                         if(KEY_3 == 0 && w == 1)  //当是调时状态 本键用于调整下一项
  2037.                                                 {
  2038.                                                 Beep_key();//按键音
  2039.                                                 e++;
  2040.                                                 if (e >= 7 ){e = 0;}
  2041.                                                 Set_time(e);//调整                               
  2042.                                     }
  2043.                                         if(KEY_3 == 0 && w == 0)  //当是调时状态 本键用于调整下一项
  2044.                                                 {
  2045.                                                 lcdClear();
  2046.                                                 lcdWriteCommand(0x30);       //选择8bit数据流
  2047.                         lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  2048.                         lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  2049.                                                 Beep_key();//按键音
  2050.                                                 procKey ();                               
  2051.                                     }
  2052.                                                 while(KEY_3 == 0);//等待键松开
  2053.                          }
  2054.                 //------------------------------------------------------------------
  2055.                 if (KEY_1 == 0&& w == 1) // 当在调时状态时就退出调时
  2056.                          {
  2057.                                DelayM(20);
  2058.                                if(KEY_1 == 0 && w == 1)
  2059.                                              {                               
  2060.                                           Beep_set();//确定按键音
  2061.                                           w = 0;          //退出调时
  2062.                                           e = 0;                //“下一项”计数器清0
  2063.                                                   convertChar(0, 0, 0);                                                               
  2064.                                      }
  2065.                                  while(KEY_1 == 0);//等待键松开
  2066.                         }
  2067.                 //------------------------------------------------------------------
  2068.                 if (KEY_2 == 0 && w == 1) // 加减调整
  2069.                          {
  2070.                              DelayM(5);
  2071.                              if(KEY_2 == 0 && w == 1)
  2072.                                   {                               
  2073.                                        Set_time(e);//调整
  2074.                                            Beep_key();//按键音
  2075.                                   }
  2076.                             while(KEY_2 == 0);//等待键松开
  2077.                        }
  2078.                 //------------------------------------------------------------------
  2079.                 if (KEY_4 == 0 && w == 1)// 加减调整
  2080.                         {              
  2081.                                 DelayM(5);
  2082.                              if(KEY_4 == 0 && w == 1)
  2083.                                      {                               
  2084.                                        Set_time(e);//调整
  2085.                                            Beep_key();//按键音
  2086.                                  }
  2087.                              while(KEY_4 == 0);//等待键松开
  2088.                       }
  2089.   }
  2090. }       
复制代码

所有资料51hei提供下载:
123456万年历.rar (4.1 MB, 下载次数: 225)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:160658 发表于 2018-10-12 13:43 | 只看该作者
不错,下来试试
回复

使用道具 举报

板凳
ID:51142 发表于 2018-10-15 00:19 | 只看该作者
下载,学习了,支持!
回复

使用道具 举报

地板
ID:364396 发表于 2018-10-15 18:23 | 只看该作者
下载来试试 看能不能用
回复

使用道具 举报

5#
ID:394719 发表于 2018-10-26 14:55 | 只看该作者
厉害啊
回复

使用道具 举报

6#
ID:233745 发表于 2018-10-26 19:37 | 只看该作者
可以学学,厉害了
回复

使用道具 举报

7#
ID:381033 发表于 2018-11-18 10:31 | 只看该作者
您好,关于您的赋值为题,k与nn是怎么赋值的呀,关系
回复

使用道具 举报

8#
ID:266007 发表于 2018-12-5 23:08 来自手机 | 只看该作者
谢谢,下载学习看看
回复

使用道具 举报

9#
ID:64089 发表于 2020-5-15 16:31 | 只看该作者
这个资料是非常完整的,农历,节气都有,谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表