找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机音乐万年历制作资料(源代码+pcb+原理图)12864显示

[复制链接]
跳转到指定楼层
楼主
V5.2版万年历使用说明

12864万年历V5.2版本:多功能菜单、多风格主界面,生日、节日、节气、农历时段多功能提示,闹钟、音乐、温度、屏幕自检

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

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


单片机万年历元件清单:
名称    数量    说明
STC89C54(STC89C516)单片机    1    内存≥20K的51单片机都可以
DS1302    1   
DS18B20    1   
40DIP座    1   
8DIP座    1   
3DIP座    1   
20芯座    1   
20芯插针    1   
10K排阻    1    可以不安装
无源蜂鸣器    1   
CR2032电池    1   
电池座    1   
电源座    1   
按键    4   
开关    1   
32768HZ晶振    1   
11.0592MHZ晶振    1   
S8050三极管    1   
30P电容    2   
103电容    1    可以不安装
10uF电解    1   
4.7K电阻    1   
10K电阻    2   
220uF电解    1    可以不安装
PCB    1   
12864液晶    1    ST7920驱动字库液晶

单片机音乐万年历源程序如下:
  1. /*****************************************************************************/
  2. //12864液晶万年历 时钟2010年最新 V5.2版
  3. //设计: 杨黎民
  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. …………
  348. …………
  349. …………限于本文篇幅 余下代码请从51黑下载附件…………
  350. 0x2d,0x92,0xB5, //2099
  351. };
  352. ///月份数据表
  353. code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
  354. code uint day_code2[3]={0x111,0x130,0x14e};
  355. /*
  356. 函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
  357. 调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
  358. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
  359. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
  360. 纪,c_sun=1为19世纪
  361. 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
  362. */
  363. bit c_moon;
  364. data uchar year_moon,month_moon,day_moon,week;
  365. /*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0*/
  366. bit get_moon_day(uchar month_p,uint table_addr)
  367. {
  368. uchar temp;
  369. switch (month_p)
  370. {
  371. case 1:{temp=year_code[table_addr]&0x08;
  372. if (temp==0)return(0);else return(1);}
  373. case 2:{temp=year_code[table_addr]&0x04;
  374. if (temp==0)return(0);else return(1);}
  375. case 3:{temp=year_code[table_addr]&0x02;
  376. if (temp==0)return(0);else return(1);}
  377. case 4:{temp=year_code[table_addr]&0x01;
  378. if (temp==0)return(0);else return(1);}
  379. case 5:{temp=year_code[table_addr+1]&0x80;
  380. if (temp==0) return(0);else return(1);}
  381. case 6:{temp=year_code[table_addr+1]&0x40;
  382. if (temp==0)return(0);else return(1);}
  383. case 7:{temp=year_code[table_addr+1]&0x20;
  384. if (temp==0)return(0);else return(1);}
  385. case 8:{temp=year_code[table_addr+1]&0x10;
  386. if (temp==0)return(0);else return(1);}
  387. case 9:{temp=year_code[table_addr+1]&0x08;
  388. if (temp==0)return(0);else return(1);}
  389. case 10:{temp=year_code[table_addr+1]&0x04;
  390. if (temp==0)return(0);else return(1);}
  391. case 11:{temp=year_code[table_addr+1]&0x02;
  392. if (temp==0)return(0);else return(1);}
  393. case 12:{temp=year_code[table_addr+1]&0x01;
  394. if (temp==0)return(0);else return(1);}
  395. case 13:{temp=year_code[table_addr+2]&0x80;
  396. if (temp==0)return(0);else return(1);}
  397. }
  398. }
  399. /*
  400. 函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
  401. 调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
  402. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
  403. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
  404. 纪,c_sun=1为19世纪
  405. 调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
  406. */
  407. void Conversion(bit c,uchar year,uchar month,uchar day)
  408. { //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
  409. uchar temp1,temp2,temp3,month_p;
  410. uint temp4,table_addr;
  411. bit flag2,flag_y;
  412. temp1=year/16; //BCD->hex 先把数据转换为十六进制
  413. temp2=year%16;
  414. year=temp1*10+temp2;
  415. temp1=month/16;
  416. temp2=month%16;
  417. month=temp1*10+temp2;
  418. temp1=day/16;
  419. temp2=day%16;
  420. day=temp1*10+temp2;
  421. //定位数据表地址
  422. if(c==0)
  423. {
  424. table_addr=(year)*0x3;
  425. }
  426. //else
  427. //{
  428. //table_addr=(year-1)*0x3;
  429. //}
  430. //定位数据表地址完成
  431. //取当年春节所在的公历月份
  432. temp1=year_code[table_addr+2]&0x60;
  433. temp1=_cror_(temp1,5);
  434. //取当年春节所在的公历月份完成
  435. //取当年春节所在的公历日
  436. temp2=year_code[table_addr+2]&0x1f;
  437. //取当年春节所在的公历日完成
  438. // 计算当年春年离当年元旦的天数,春节只会在公历1月或2月
  439. if(temp1==0x1)
  440. {
  441. temp3=temp2-1;
  442. }
  443. else
  444. {
  445. temp3=temp2+0x1f-1;
  446. }
  447. // 计算当年春年离当年元旦的天数完成
  448. //计算公历日离当年元旦的天数,为了减少运算,用了两个表
  449. //day_code1[9],day_code2[3]
  450. //如果公历月在九月或前,天数会少于0xff,用表day_code1[9],
  451. //在九月后,天数大于0xff,用表day_code2[3]
  452. //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1
  453. //如输入公历日为11月10日,则公历日离元旦天数为day_code2[11-10]+10-1
  454. if (month<10)
  455. {
  456. temp4=day_code1[month-1]+day-1;
  457. }
  458. else
  459. {
  460. temp4=day_code2[month-10]+day-1;
  461. }
  462. if ((month>0x2)&&(year%0x4==0))
  463. { //如果公历月大于2月并且该年的2月为闰月,天数加1
  464. temp4+=1;
  465. }
  466. //计算公历日离当年元旦的天数完成
  467. //判断公历日在春节前还是春节后
  468. if (temp4>=temp3)
  469. { //公历日在春节后或就是春节当日使用下面代码进行运算
  470. temp4-=temp3;
  471. month=0x1;
  472. month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月
  473. flag2=get_moon_day(month_p,table_addr);
  474. //检查该农历月为大小还是小月,大月返回1,小月返回0
  475. flag_y=0;
  476. if(flag2==0)temp1=0x1d; //小月29天
  477. else temp1=0x1e; //大小30天
  478. temp2=year_code[table_addr]&0xf0;
  479. temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为0则该年无闰月
  480. while(temp4>=temp1)
  481. {
  482. temp4-=temp1;
  483. month_p+=1;
  484. if(month==temp2)
  485. {
  486. flag_y=~flag_y;
  487. if(flag_y==0)
  488. month+=1;
  489. }
  490. else month+=1;
  491. flag2=get_moon_day(month_p,table_addr);
  492. if(flag2==0)temp1=0x1d;
  493. else temp1=0x1e;
  494. }
  495. day=temp4+1;
  496. }
  497. else
  498. { //公历日在春节前使用下面代码进行运算
  499. temp3-=temp4;
  500. if (year==0x0)
  501. {
  502. year=0x63;c=1;
  503. }
  504. else year-=1;
  505. table_addr-=0x3;
  506. month=0xc;
  507. temp2=year_code[table_addr]&0xf0;
  508. temp2=_cror_(temp2,4);
  509. if (temp2==0)
  510. month_p=0xc;
  511. else
  512. month_p=0xd; //
  513. /*month_p为月份指向,如果当年有闰月,一年有十三个月,月指向13,无闰月指向12*/
  514. flag_y=0;
  515. flag2=get_moon_day(month_p,table_addr);
  516. if(flag2==0)temp1=0x1d;
  517. else temp1=0x1e;
  518. while(temp3>temp1)
  519. {
  520. temp3-=temp1;
  521. month_p-=1;
  522. if(flag_y==0)month-=1;
  523. if(month==temp2)flag_y=~flag_y;
  524. flag2=get_moon_day(month_p,table_addr);
  525. if(flag2==0)temp1=0x1d;
  526. else temp1=0x1e;
  527. }
  528. day=temp1-temp3+1;
  529. }
  530. c_moon=c; //HEX->BCD ,运算结束后,把数据转换为BCD数据
  531. temp1=year/10;
  532. temp1=_crol_(temp1,4);
  533. temp2=year%10;
  534. year_moon=temp1|temp2;
  535. temp1=month/10;
  536. temp1=_crol_(temp1,4);
  537. temp2=month%10;
  538. month_moon=temp1|temp2;
  539. temp1=day/10;
  540. temp1=_crol_(temp1,4);
  541. temp2=day%10;
  542. day_moon=temp1|temp2;
  543. }
  544. /*函数功能:输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年)
  545. 调用函数示例:Conver_week(c_sun,year_sun,month_sun,day_sun)
  546. 如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
  547. c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
  548. 纪,c_sun=1为19世纪
  549. 调用函数后,原有数据不变,读week得出阴历BCD数据
  550. */
  551. code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表
  552. /*
  553. 算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在
  554. 闰年又不到3 月份上述之和要减一天再除7
  555. 星期数为0
  556. */
  557. /*void Conver_week(bit c,uchar year,uchar month,uchar day)
  558. {//c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
  559. uchar temp1,temp2;
  560. temp1=year/16; //BCD->hex 先把数据转换为十六进制
  561. temp2=year%16;
  562. year=temp1*10+temp2;
  563. temp1=month/16;
  564. temp2=month%16;
  565. month=temp1*10+temp2;
  566. temp1=day/16;
  567. temp2=day%16;
  568. day=temp1*10+temp2;
  569. if (c==0){year+=0x64;} //如果为21世纪,年份数加100
  570. temp1=year/0x4; //所过闰年数只算1900年之后的
  571. temp2=year+temp1;
  572. temp2=temp2%0x7; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据
  573. temp2=temp2+day+table_week[month-1];
  574. if (year%0x4==0&&month<3)temp2-=1;
  575. week=temp2%0x7;
  576. }*/
  577. //test
  578. uchar c_sun,year_sun,month_sun,day_sun;
  579. /****************************************************************************************************************************
  580. 函数功能: 二十四节气数据库
  581. 入口参数: unsigned char(yy,mo,dd) 对应 年月日
  582. 出口参数: unsigned char(0-24) 1-24对应二十四节气
  583. 作者    : TOTOP
  584. 二十四节气数据库(1901--2050)
  585. 数据格式说明:   
  586. 如1901年的节气为   
  587.      1月    2月     3月     4月       5月      6月    7月     8月      9月    10月   11月    12月   
  588. [ 6,21][ 4,19][ 6,21][ 5,21][ 6,22][ 6,22][ 8,23][ 8,24][ 8,24][ 8,24][ 8,23][ 8,22]   
  589. [ 9, 6][11, 4][ 9, 6][10, 6][ 9, 7][ 9, 7][ 7, 8][ 7, 9][ 7, 9][ 7, 9][ 7, 8][ 7,15]   
  590. 上面第一行数据为每月节气对应公历日期,15减去每月第一个节气,每月第二个节气减去15得第二
  591. 行,这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存
  592. 放第二个节气的数据,可得下表   
  593. ****************************************************************************************************************************/
  594. uchar code jieqi_code[]=
  595. {
  596.        0x96,0xB4,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x88,0x78,0x87,0x86,     //2000   
  597. …………
  598. …………
  599. …………限于本文篇幅 余下代码请从51黑下载附件…………
  600.        0xA5,0xC3,0xA5,0xB5,0xA6,0xA6,0x87,0x88,0x78,0x78,0x87,0x87,     //2050
  601.     };
  602. uchar jieqi (uchar y2,m2,d2)
  603. {
  604. uchar temp,d,y,y1,m;
  605. uint addr;
  606. d=d2/16*10+d2%16;
  607. m=m2/16*10+m2%16;
  608. y1=y2/16*10+y2%16+2000;
  609. y=y1-2000;
  610. addr=y*12+m-1;
  611. if(d<15)
  612. {
  613. temp=15-d;
  614. if((jieqi_code[addr]>>4)==temp) return (m*2-1);
  615. else return (0);
  616. }
  617. if(d==15) return (0);
  618. if(d>15)
  619. {
  620. temp=d-15;
  621. if((jieqi_code[addr]&0x0f)==temp) return (m*2);
  622. else return (0);
  623. }
  624. }

  625. /******************************************************************************/
  626. //公历节日数据库表
  627. /******************************************************************************/
  628. void days ()  //公历节日数据库
  629.        {         
  630.         uchar j;
  631.         j=jieqi(yy,mo,dd);
  632.                 if(t/2%2==0)//设置变化的时间,默认是2秒
  633.                 {           //以下自己添加生日、节日信息
  634.                 if ( month_moon== 0x06 && day_moon== 0x02 ){dispString(3, 0, 1, "后天是奇奇的生日");}
  635.    else if ( month_moon== 0x06 && day_moon== 0x03 ){dispString(3, 0, 1, "明天是奇奇的生日");}
  636.    else if ( month_moon== 0x06 && day_moon== 0x04 ){dispString(3, 0, 1, "今天是奇奇的生日");}
  637.    else if ( month_moon== 0x10 && day_moon== 0x07 ){dispString(3, 0, 1, "后天是老婆的生日");}
  638.    else if ( month_moon== 0x10 && day_moon== 0x08 ){dispString(3, 0, 1, "明天是老婆的生日");}
  639.    else if ( month_moon== 0x10 && day_moon== 0x09 ){dispString(3, 0, 1, "今天是老婆的生日");}
  640.    else if ( month_moon== 0x08 && day_moon== 0x01 ){dispString(3, 0, 1, "后天是我的生日! ");}
  641.    else if ( month_moon== 0x08 && day_moon== 0x02 ){dispString(3, 0, 1, "明天是我的生日! ");}
  642.    else if ( month_moon== 0x08 && day_moon== 0x03 ){dispString(3, 0, 1, "今天是我的生日! ");}
  643.    else if ( month_moon== 0x03 && day_moon== 0x23 ){dispString(3, 0, 1, "后天是爸爸的生日");}
  644.    else if ( month_moon== 0x03 && day_moon== 0x24 ){dispString(3, 0, 1, "明天是爸爸的生日");}
  645.    else if ( month_moon== 0x03 && day_moon== 0x25 ){dispString(3, 0, 1, "今天是爸爸的生日");}
  646.    else if ( month_moon== 0x01 && day_moon== 0x30 ){dispString(3, 0, 1, "后天是妈妈的生日");}
  647.    else if ( month_moon== 0x02 && day_moon== 0x01 ){dispString(3, 0, 1, "明天是妈妈的生日");}
  648.    else if ( month_moon== 0x02 && day_moon== 0x02 ){dispString(3, 0, 1, "今天是妈妈的生日");}

  649.                 //农历节日
  650.    else     if ( month_moon== 0x12 && day_moon== 0x29 ){dispString(3, 0, 1, "    明天大年    ");}
  651.    else            if ( month_moon== 0x12 && day_moon== 0x30 ){dispString(3, 0, 1, "    大年三十    ");}
  652.    else            if ( month_moon== 0x05 && day_moon== 0x05 ){dispString(3, 0, 1, "  今天是端午节  ");}
  653.    else                if ( month_moon== 0x08 && day_moon== 0x15 ){dispString(3, 0, 1, "  今天是中秋节  ");}
  654.    else                if ( month_moon== 0x01 && day_moon== 0x15 ){dispString(3, 0, 1, "  今天是元宵节  ");}
  655.    else                if ( month_moon== 0x02 && day_moon== 0x02 ){dispString(3, 0, 1, "  今天是龙抬头  ");}
  656.    else                if ( month_moon== 0x07 && day_moon== 0x07 ){dispString(3, 0, 1, "  今天是七夕!   ");}
  657.    else                if ( month_moon== 0x07 && day_moon== 0x15 ){dispString(3, 0, 1, "  今天是鬼节!   ");}
  658.    else                if ( month_moon== 0x09 && day_moon== 0x09 ){dispString(3, 0, 1, "  今天是重阳节  ");}
  659.    else                if ( month_moon== 0x12 && day_moon== 0x08 ){dispString(3, 0, 1, "  今天是腊八节  ");}
  660.                 //国立节日                                                               
  661.    else     if ( mo == 0x01 && dd == 0x01 ){dispString(3, 0, 1, "    元旦快乐!   ");}//1月
  662.    else                if ( mo == 0x01 && dd == 0x28 ){dispString(3, 0, 1, "今天是世界麻风日");}
  663.                
  664.    else                if ( mo == 0x02 && dd == 0x02 ){dispString(3, 0, 1, "今天是世界湿地日");}//2月
  665.    else                if ( mo == 0x02 && dd == 0x13 ){dispString(3, 0, 1, "  明天情人节了  ");}               
  666.    else                if ( mo == 0x02 && dd == 0x14 ){dispString(3, 0, 1, "  今天是情人节  ");}
  667.                                 
  668.    else                if ( mo == 0x03 && dd == 0x01 ){dispString(3, 0, 1, "今天是国际海豹日");}//3月               
  669.    else                if ( mo == 0x03 && dd == 0x03 ){dispString(3, 0, 1, "今天是全国爱耳日");}               
  670.    else                if ( mo == 0x03 && dd == 0x08 ){dispString(3, 0, 1, "今天是3.8 妇女节");}               
  671.    else                if ( mo == 0x03 && dd == 0x12 ){dispString(3, 0, 1, "  今天是植树节  ");}               
  672.    else                if ( mo == 0x03 && dd == 0x14 ){dispString(3, 0, 1, "今天是国际警察日");}               
  673.    else                if ( mo == 0x03 && dd == 0x15 ){dispString(3, 0, 1, "今天消费者权益日");}               
  674.    else                if ( mo == 0x03 && dd == 0x17 ){dispString(3, 0, 1, "今天是国际航海日");}               
  675.    else                if ( mo == 0x03 && dd == 0x21 ){dispString(3, 0, 1, "今天是世界森林日");}               
  676.    else                if ( mo == 0x03 && dd == 0x22 ){dispString(3, 0, 1, "今天是世界水日!");}               
  677.    else                if ( mo == 0x03 && dd == 0x23 ){dispString(3, 0, 1, "今天是世界气象日");}               
  678.    else                if ( mo == 0x03 && dd == 0x24 ){dispString(3, 0, 1, "世界防治结核病日");}
  679.                                 
  680.    else                if ( mo == 0x04 && dd == 0x01 ){dispString(3, 0, 1, "愚人节,小心上当");}//4               
  681.    else                if ( mo == 0x04 && dd == 0x07 ){dispString(3, 0, 1, "今天是世界卫生日");}               
  682.    else                if ( mo == 0x04 && dd == 0x08 ){dispString(3, 0, 1, "  今天复活节!   ");}               
  683.    else                if ( mo == 0x04 && dd == 0x13 ){dispString(3, 0, 1, "  黑色星期五!   ");}
  684.                                 
  685.    else                if ( mo == 0x05 && dd == 0x01 ){dispString(3, 0, 1, "  今天是劳动节  ");}//5               
  686.    else                if ( mo == 0x05 && dd == 0x04 ){dispString(3, 0, 1, "今天是五四青年节");}               
  687.    else                if ( mo == 0x05 && dd == 0x08 ){dispString(3, 0, 1, "今天世界红十字日");}               
  688.    else                if ( mo == 0x05 && dd == 0x12 ){dispString(3, 0, 1, "今天是国际护士节");}               
  689.    else                if ( mo == 0x05 && dd == 0x05 ){dispString(3, 0, 1, "近日注意母亲节! ");}               
  690.    else                if ( mo == 0x05 && dd == 0x15 ){dispString(3, 0, 1, "今天是国际家庭日");}
  691.    else                if ( mo == 0x05 && dd == 0x31 ){dispString(3, 0, 1, "今天是世界无烟日");}               
  692.                                 
  693.    else                if ( mo == 0x06 && dd == 0x01 ){dispString(3, 0, 1, "今天是国际儿童节");}//6
  694.    else                if ( mo == 0x06 && dd == 0x05 ){dispString(3, 0, 1, "今天是世界环境日");}               
  695.    else                if ( mo == 0x06 && dd == 0x26 ){dispString(3, 0, 1, "今天是国际禁毒日");}               
  696.    else                if ( mo == 0x06 && dd == 0x06 ){dispString(3, 0, 1, "今天是全国爱眼日");}               
  697.    else                if ( mo == 0x06 && dd == 0x13 ){dispString(3, 0, 1, "近日注意父亲节! ");}
  698.    else                if ( mo == 0x06 && dd == 0x15 ){dispString(3, 0, 1, "近日注意父亲节! ");}
  699.                                 
  700.    else                if ( mo == 0x07 && dd == 0x01 ){dispString(3, 0, 1, "香港回归记念日! ");}//7
  701.    else                if ( mo == 0x07 && dd == 0x07 ){dispString(3, 0, 1, "抗日战争记念日! ");}
  702.    else                if ( mo == 0x07 && dd == 0x11 ){dispString(3, 0, 1, "今天是世界人口日");}

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

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

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

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

  717.    else                if ( mo == 0x12 && dd == 0x01 ){dispString(3, 0, 1, "今天世界艾滋病日");}//12
  718.    else                if ( mo == 0x12 && dd == 0x23 ){dispString(3, 0, 1, "  明晚平安夜!   ");}
  719.    else                if ( mo == 0x12 && dd == 0x24 ){dispString(3, 0, 1, "  今晚平安夜!   ");}
  720.    else                if ( mo == 0x12 && dd == 0x25 ){dispString(3, 0, 1, "    圣诞快乐    ");}
  721.    else                if ( mo == 0x12 && dd == 0x31 ){dispString(3, 0, 1, "    明日元旦    ");}
  722.                   }
  723.                 else{
  724.                         //二十四节气
  725.                if (j==1){dispString(3, 0, 1, "    今天小寒    ");}
  726.    else        if (j==2){dispString(3, 0, 1, "    今天大寒    ");}
  727.    else        if (j==3){dispString(3, 0, 1, "    今天立春    ");}
  728.    else        if (j==4){dispString(3, 0, 1, "    今天雨水    ");}
  729.    else        if (j==5){dispString(3, 0, 1, "    今天惊蛰    ");}
  730.    else        if (j==6){dispString(3, 0, 1, "    今天春分    ");}
  731.    else        if (j==7){dispString(3, 0, 1, "    今天清明    ");}
  732.    else        if (j==8){dispString(3, 0, 1, "    今天谷雨    ");}
  733.    else        if (j==9){dispString(3, 0, 1, "    今天立夏    ");}
  734.    else        if (j==10){dispString(3, 0, 1, "    今天小满    ");}
  735.    else        if (j==11){dispString(3, 0, 1, "    今天芒种    ");}
  736.    else        if (j==12){dispString(3, 0, 1, "    今天夏至    ");}
  737.    else        if (j==13){dispString(3, 0, 1, "    今天小暑    ");}
  738.    else        if (j==14){dispString(3, 0, 1, "    今天大暑    ");}
  739.    else        if (j==15){dispString(3, 0, 1, "    今天立秋    ");}
  740.    else        if (j==16){dispString(3, 0, 1, "    今天处暑    ");}
  741.    else        if (j==17){dispString(3, 0, 1, "    今天白露    ");}
  742.    else        if (j==18){dispString(3, 0, 1, "    今天秋分    ");}
  743.    else        if (j==19){dispString(3, 0, 1, "    今天寒露    ");}
  744.    else        if (j==20){dispString(3, 0, 1, "    今天霜降    ");}
  745.    else        if (j==21){dispString(3, 0, 1, "    今天立冬    ");}
  746.    else        if (j==22){dispString(3, 0, 1, "    今天小雪    ");}
  747.    else        if (j==23){dispString(3, 0, 1, "    今天大雪    ");}
  748.    else        if (j==24){dispString(3, 0, 1, "    今天冬至    ");}

  749.    //非节日时显示时晨信息
  750.    else {   if ( hh >= 0x04 && hh <  0x06 ){dispString(3, 0, 1, "  凌晨  点  分  ");
  751.                         lcdWriteCommand(0x9b);
  752.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  753.                         else{lcdWriteData(0x20);}//同上        
  754.                     lcdWriteData(hh1%10+0x30);
  755.                     lcdWriteCommand(0x9d);          //":"
  756.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  757.                         else{lcdWriteData(0x20);}//同上        
  758.                 lcdWriteData(mm%16+0x30); }
  759.                         if ( hh >= 0x06 && hh <  0x08 ){dispString(3, 0, 1, "  早晨  点  分  ");
  760.                         lcdWriteCommand(0x9b);
  761.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  762.                         else{lcdWriteData(0x20);}//同上        
  763.                     lcdWriteData(hh1%10+0x30);
  764.                     lcdWriteCommand(0x9d);          //":"
  765.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  766.                         else{lcdWriteData(0x20);}//同上        
  767.                 lcdWriteData(mm%16+0x30); }
  768.                         if ( hh >= 0x08 && hh <  0x12 ){dispString(3, 0, 1, "  上午  点  分  ");
  769.                         lcdWriteCommand(0x9b);
  770.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  771.                         else{lcdWriteData(0x20);}//同上        
  772.                     lcdWriteData(hh1%10+0x30);
  773.                     lcdWriteCommand(0x9d);          //":"
  774.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  775.                         else{lcdWriteData(0x20);}//同上        
  776.                 lcdWriteData(mm%16+0x30); }
  777.                         if ( hh == 0x12)               {dispString(3, 0, 1, "  中午  点  分  ");
  778.                         lcdWriteCommand(0x9b);
  779.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  780.                         else{lcdWriteData(0x20);}//同上        
  781.                     lcdWriteData(hh1%10+0x30);
  782.                     lcdWriteCommand(0x9d);          //":"
  783.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  784.                         else{lcdWriteData(0x20);}//同上        
  785.                 lcdWriteData(mm%16+0x30); }
  786.                         if ( hh >= 0x13 && hh <  0x18 ){dispString(3, 0, 1, "  下午  点  分  ");
  787.                         lcdWriteCommand(0x9b);
  788.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  789.                         else{lcdWriteData(0x20);}//同上        
  790.                     lcdWriteData(hh1%10+0x30);
  791.                     lcdWriteCommand(0x9d);          //":"
  792.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  793.                         else{lcdWriteData(0x20);}//同上        
  794.                 lcdWriteData(mm%16+0x30); }
  795.                         if ( hh >= 0x18 && hh <  0x22 ){dispString(3, 0, 1, "  晚上  点  分  ");
  796.                         lcdWriteCommand(0x9b);
  797.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  798.                         else{lcdWriteData(0x20);}//同上        
  799.                     lcdWriteData(hh1%10+0x30);
  800.                     lcdWriteCommand(0x9d);          //":"
  801.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  802.                         else{lcdWriteData(0x20);}//同上        
  803.                 lcdWriteData(mm%16+0x30); }
  804.                         if ( hh >= 0x22 && hh <= 0x23 ){dispString(3, 0, 1, "  夜里  点  分  ");
  805.                         lcdWriteCommand(0x9b);
  806.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  807.                         else{lcdWriteData(0x20);}//同上        
  808.                     lcdWriteData(hh1%10+0x30);
  809.                     lcdWriteCommand(0x9d);          //":"
  810.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  811.                         else{lcdWriteData(0x20);}//同上        
  812.                 lcdWriteData(mm%16+0x30); }
  813.                         if ( hh >= 0x00 && hh <  0x04 ){dispString(3, 0, 1, "  深夜  点  分  ");
  814.                         lcdWriteCommand(0x9b);
  815.                         if(hh1/10 != 0){lcdWriteData((hh1/10)+0x30);}        //十位消隐
  816.                         else{lcdWriteData(0x20);}//同上        
  817.                     lcdWriteData(hh1%10+0x30);
  818.                     lcdWriteCommand(0x9d);          //":"
  819.                     if(mm/16 != 0){lcdWriteData((mm/16)+0x30);}        //十位消隐
  820.                         else{lcdWriteData(0x20);}//同上        
  821.                 lcdWriteData(mm%16+0x30); }
  822.                         }

  823.                 }
  824. }
  825. /******************************ds1820程序***************************************/
  826. void delay_18B20(unsigned int i)//延时1微秒
  827. {
  828.    while(i--);
  829. }
  830. void ds1820rst()//ds1820复位*
  831. { unsigned char x=0;
  832. DQ = 1;          //DQ复位
  833. delay_18B20(4); //延时
  834. DQ = 0;          //DQ拉低
  835. delay_18B20(100); //精确延时大于480us
  836. DQ = 1;          //拉高
  837. delay_18B20(40);
  838.    }

  839.    unsigned char ds1820rd()//读数据
  840. { unsigned char i=0;
  841. unsigned char dat = 0;
  842. for (i=8;i>0;i--)
  843. {   DQ = 0; //给脉冲信号
  844.     dat>>=1;
  845.     DQ = 1; //给脉冲信号
  846.     if(DQ)
  847.     dat|=0x80;
  848.     delay_18B20(10);
  849. }
  850.    return(dat);
  851. }
  852. void ds1820wr(uchar wdata)//写数据
  853. {unsigned char i=0;
  854.     for (i=8; i>0; i--)
  855.    { DQ = 0;
  856.      DQ = wdata&0x01;
  857.      delay_18B20(10);
  858.      DQ = 1;
  859.      wdata>>=1;
  860.    }
  861. }
  862. read_temp()//读取温度值并转换
  863. {uchar a,b;
  864. ds1820rst();   
  865. ds1820wr(0xcc);//跳过读序列号
  866. ds1820wr(0x44);//启动温度转换
  867. ds1820rst();   
  868. ds1820wr(0xcc);//跳过读序列号
  869. ds1820wr(0xbe);//读取温度
  870. a=ds1820rd();
  871. b=ds1820rd();
  872. tvalue=b;
  873. tvalue<<=8;
  874. tvalue=tvalue|a;
  875.     if(tvalue<0x0fff)
  876.    tflag=0;
  877.     else
  878.    {tvalue=~tvalue+1;
  879. tflag=1;
  880.    }
  881. tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
  882. return(tvalue);
  883. }
  884. /*****************************************************************************/
  885. //声明(当各函数的排列适当时可不用声明)
  886. void lcm_w_ss(void);void lcm_w_mm(void);
  887. void lcm_w_hh(void);void lcm_w_dd(void);
  888. void lcm_w_mo(void);void lcm_w_yy(void);
  889. void lcm_w_xq(void);
  890. unsigned char clock_in(void);
  891. void clock_out(unsigned char dd);
  892. void Init_1302(void);
  893. unsigned char read_clock(unsigned char ord);
  894. void read_clockS(void);
  895. void Set_time(unsigned char sel);
  896. void write_clock(unsigned char ord, unsigned char dd);
  897. void updata (void);
  898. void lcmnongli();
  899. void lcmjieqi();
  900. void lcmshengxiao();
  901. /*****************************************************************************/        
  902. //农历显示
  903. /******************************************************************************/
  904. void lcmnongli()
  905. {
  906. uchar yue,ri;
  907. year_sun=yy;
  908. month_sun=mo;
  909. day_sun=dd;
  910. Conversion(c_sun,year_sun,month_sun,day_sun);
  911. yue=(month_moon/16)*10+month_moon%16;
  912. year1=yue;
  913. ri=(day_moon/16)*10+day_moon%16;  //显示农历月
  914.   if(yue==1){dispString(1, 0, 1, "正"); }
  915.   if(yue==2){dispString(1, 0, 1, "二"); }
  916.   if(yue==3){dispString(1, 0, 1, "三"); }
  917.   if(yue==4){dispString(1, 0, 1, "四"); }
  918.   if(yue==5){dispString(1, 0, 1, "五"); }
  919.   if(yue==6){dispString(1, 0, 1, "六"); }
  920.   if(yue==7){dispString(1, 0, 1, "七"); }
  921.   if(yue==8){dispString(1, 0, 1, "八"); }
  922.   if(yue==9){dispString(1, 0, 1, "九"); }
  923.   if(yue==10){dispString(1, 0, 1, "十"); }
  924.   if(yue==11){dispString(1, 0, 1, "冬"); }
  925.   if(yue==12){dispString(1, 0, 1, "腊"); }
  926.   dispString(1, 1, 1, "月");
  927.   if(ri<=10)
  928.    {
  929.     if(ri==1){  dispString(1, 2, 1, "初一"); }
  930.     if(ri==2){  dispString(1, 2, 1, "初二"); }
  931.     if(ri==3){  dispString(1, 2, 1, "初三"); }
  932.     if(ri==4){  dispString(1, 2, 1, "初四");}
  933.     if(ri==5){  dispString(1, 2, 1, "初五"); }
  934.     if(ri==6){  dispString(1, 2, 1, "初六"); }
  935.     if(ri==7){  dispString(1, 2, 1, "初七"); }
  936.     if(ri==8){  dispString(1, 2, 1, "初八"); }
  937.     if(ri==9){  dispString(1, 2, 1, "初九");  }
  938.     if(ri==10){  dispString(1, 2, 1, "初十"); }
  939.    }
  940.   else
  941.    {
  942.     if(ri==11){  dispString(1, 2, 1, "十一");}
  943.     if(ri==12){  dispString(1, 2, 1, "十二");}
  944.     if(ri==13){  dispString(1, 2, 1, "十三"); }
  945.     if(ri==14){  dispString(1, 2, 1, "十四"); }
  946.     if(ri==15){  dispString(1, 2, 1, "十五"); }
  947.     if(ri==16){  dispString(1, 2, 1, "十六"); }
  948.     if(ri==17){  dispString(1, 2, 1, "十七"); }
  949.     if(ri==18){  dispString(1, 2, 1, "十八"); }
  950.     if(ri==19){  dispString(1, 2, 1, "十九"); }
  951.     if(ri==20){  dispString(1, 2, 1, "二十");}
  952.     if(ri==21){  dispString(1, 2, 1, "廿一");  }
  953.     if(ri==22){  dispString(1, 2, 1, "廿二");}
  954.     if(ri==23){  dispString(1, 2, 1, "廿三"); }
  955.     if(ri==24){  dispString(1, 2, 1, "廿四"); }
  956.     if(ri==25){  dispString(1, 2, 1, "廿五"); }
  957.     if(ri==26){  dispString(1, 2, 1, "廿六");}
  958.     if(ri==27){  dispString(1, 2, 1, "廿七"); }
  959.     if(ri==28){  dispString(1, 2, 1, "廿八"); }
  960.     if(ri==29){  dispString(1, 2, 1, "廿九");}
  961.     if(ri==30){  dispString(1, 2, 1, "三十"); }
  962.    }
  963. }
  964. /******************************************************************************/
  965. //十二生肖显示
  966. /******************************************************************************/
  967. void lcmshengxiao()
  968. {
  969. uint y3;
  970. y3=(yy/16*10+yy%16+2000-1900)%12;
  971. if(year<6 & year1>6) y3--;
  972. switch(y3)
  973. {
  974.   case 0: dispString(0, 6, 1, "子鼠");
  975.           break;
  976.   case 1:  dispString(0, 6, 1, "丑牛");
  977.           break;
  978.   case 2:  dispString(0, 6, 1, "寅虎");
  979.           break;
  980.   case 3:  dispString(0, 6, 1, "卯兔");
  981.           break;
  982.   case 4:  dispString(0, 6, 1, "辰龙");
  983.           break;
  984.   case 5: dispString(0, 6, 1, "巳蛇");
  985.           break;
  986.   case 6: dispString(0, 6, 1, "午马");
  987.           break;
  988.   case 7: dispString(0, 6, 1, "未羊");
  989.           break;
  990.   case 8:  dispString(0, 6, 1, "申猴");
  991.           break;
  992.   case 9:  dispString(0, 6, 1, "酉鸡");
  993.           break;
  994.   case 10:  dispString(0, 6, 1, "戌狗");
  995.           break;
  996.   case 11: dispString(0, 6, 1, "亥猪");
  997.           break;
  998. }
  999. }
  1000. /*****************************************************************************/
  1001. //调时用加1程序
  1002. void Set_time(unsigned char sel)//根据选择调整的相应项目加1并写入DS1302
  1003. {
  1004.   signed char address,item;
  1005.   signed char max,mini;
  1006.   dispString(3, 2, 1, "设置");
  1007.   if(sel==6)  {dispString(3, 4, 1, "秒钟");address=0x80; max=59;mini=0;}     //秒7
  1008.   if(sel==5)  {dispString(3, 4, 1, "分钟");address=0x82; max=59;mini=0;}    //分钟6
  1009.   if(sel==4)  {dispString(3, 4, 1, "小时");address=0x84; max=23;mini=0;}    //小时5
  1010.   if(sel==3)  {dispString(3, 4, 1, "星期");address=0x8a; max=7;mini=1;}    //星期4  
  1011.   if(sel==2)  {dispString(3, 4, 1, "日期");address=0x86; max=31;mini=1;}    //日3
  1012.   if(sel==1)  {dispString(3, 4, 1, "月份");address=0x88; max=12;mini=1;}    //月2
  1013.   if(sel==0)  {dispString(3, 4, 1, "年份");address=0x8c; max=99; mini=0;}    //年1
  1014.   switch(sel)
  1015.         {
  1016.             case 0: convertChar(0, 1, 2);
  1017.                                 break;
  1018.                 case 1: convertChar(0, 2, 3);
  1019.                                 break;
  1020.                 case 2:        convertChar(0, 4, 2);
  1021.                                 break;
  1022.                 case 3: convertChar(1, 7, 2);
  1023.                                 break;
  1024.                 case 4: convertChar(2, 0, 2);
  1025.                                 break;
  1026.                 case 5: convertChar(2, 1, 3);
  1027.                                 break;
  1028.                 case 6: convertChar(2, 3, 2);
  1029.                                 break;
  1030.         }
  1031.   //读取1302某地址上的数值转换成10进制赋给item
  1032.   item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  1033.   if(KEY_2 == 0)
  1034.   {
  1035.           item++;//数加 1  
  1036.   }
  1037.   if(KEY_4 == 0)
  1038.   {
  1039.           item--;//数减 1
  1040.   }
  1041.   if(item>max) item=mini;//查看数值有效范围   
  1042.   if(item<mini) item=max;           
  1043.   write_clock(0x8e,0x00);//允许写操作
  1044.   write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  1045.   write_clock(0x8e,0x80);//写保护,禁止写操作
  1046.   
  1047. }
  1048. /*****************************************************************************/
  1049. //设置1302的初始时间(自动初始化)
  1050. void Init_1302(void){//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
  1051.         unsigned char f;
  1052.         if(read_clock(0xc1) != 0xaa){
  1053.                 write_clock(0x8e,0x00);//允许写操作
  1054.                 write_clock(0x8c,0x07);//年
  1055.                 write_clock(0x8a,0x01);//星期
  1056.                 write_clock(0x88,0x01);//月
  1057.                 write_clock(0x86,0x01);//日
  1058.                 write_clock(0x84,0x00);//小时
  1059.                 write_clock(0x82,0x00);//分钟
  1060.                 write_clock(0x80,0x00);//秒
  1061.                 write_clock(0x90,0xa5);//充电        
  1062.                 write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
  1063.                 for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
  1064.                         write_clock(0xc2+f,0x00);
  1065.                 }
  1066.                 write_clock(0x8e,0x80);//禁止写操作
  1067.         }
  1068. }
  1069. /*****************************************************************************/
  1070. //DS1302写数据(底层协议)
  1071. void write_clock(unsigned char ord, unsigned char dd){
  1072.         clock_clk=0;
  1073.         clock_Rst=0;
  1074.         clock_Rst=1;
  1075.         clock_out(ord);
  1076.         clock_out(dd);
  1077.         clock_Rst=0;
  1078.         clock_clk=1;
  1079. }
  1080. /*****************************************************************************/
  1081. //1302驱动程序(底层协议)
  1082. void clock_out(unsigned char dd){
  1083.         ACC=dd;
  1084.         clock_dat=a0; clock_clk=1; clock_clk=0;
  1085.         clock_dat=a1; clock_clk=1; clock_clk=0;
  1086.         clock_dat=a2; clock_clk=1; clock_clk=0;
  1087.         clock_dat=a3; clock_clk=1; clock_clk=0;
  1088.         clock_dat=a4; clock_clk=1; clock_clk=0;
  1089.         clock_dat=a5; clock_clk=1; clock_clk=0;
  1090.         clock_dat=a6; clock_clk=1; clock_clk=0;
  1091.         clock_dat=a7; clock_clk=1; clock_clk=0;
  1092. }
  1093. /*****************************************************************************/
  1094. //DS1302写入字节(底层协议)
  1095. unsigned char clock_in(void){
  1096.         clock_dat=1;
  1097.         a0=clock_dat;
  1098.         clock_clk=1; clock_clk=0; a1=clock_dat;
  1099.         clock_clk=1; clock_clk=0; a2=clock_dat;
  1100.         clock_clk=1; clock_clk=0; a3=clock_dat;
  1101.         clock_clk=1; clock_clk=0; a4=clock_dat;
  1102.         clock_clk=1; clock_clk=0; a5=clock_dat;
  1103.         clock_clk=1; clock_clk=0; a6=clock_dat;
  1104.         clock_clk=1; clock_clk=0; a7=clock_dat;
  1105.         return(ACC);
  1106. }
  1107. /*****************************************************************************/
  1108. //DS1302读数据(底层协议)
  1109. unsigned char read_clock(unsigned char ord){
  1110.         unsigned char dd=0;
  1111.         clock_clk=0;
  1112.         clock_Rst=0;
  1113.         clock_Rst=1;
  1114.         clock_out(ord);
  1115.         dd=clock_in();
  1116.         clock_Rst=0;
  1117.         clock_clk=1;
  1118.         return(dd);
  1119. }
  1120. /*****************************************************************************/

  1121. /*****************************************************************************/
  1122. //扬声器驱动程序(闹钟音乐)
  1123. /*****************************************************************************/        
  1124. void Beep(void)
  1125. {//BELL-扬声器--整点报时
  1126.         unsigned char a;//定义变量用于发声的长度设置
  1127.         for(a=60;a>0;a--){//第一个声音的长度
  1128.                 beep = ~beep;//取反扬声器驱动口,以产生音频
  1129.                 Delay(100);//音调设置延时
  1130.         }
  1131.         for(a=100;a>0;a--){//同上
  1132.                 beep = ~beep;
  1133.                 Delay(80);//
  1134.         }
  1135.         for(a=100;a>0;a--){//同上
  1136.                 beep = ~beep;
  1137.                 Delay(30);//
  1138.         }
  1139.         beep = 1;//音乐结束后扬声器拉高关闭
  1140. }
  1141. /*****************************************************************************/
  1142. void Beep_set(void){//BELL -扬声器--确定设置
  1143.         unsigned char a;//定义变量用于发声的长度设置
  1144.         for(a=50;a>0;a--){//第一个声音的长度
  1145.                 beep = ~beep;//取反扬声器驱动口,以产生音频
  1146.                 Delay(100);//音调设置延时
  1147.         }
  1148.         for(a=100;a>0;a--){//同上
  1149.                 beep = ~beep;
  1150.                 Delay(50);//
  1151.         }
  1152.         for(a=50;a>0;a--){//同上
  1153.                 beep = ~beep;
  1154.                 Delay(100);//
  1155.         }
  1156.         beep = 1;//音乐结束后扬声器拉高关闭
  1157. }
  1158. /*****************************************************************************/
  1159. void Beep_key(void){//-扬声器--按键音
  1160.         unsigned char a;//定义变量用于发声的长度设置
  1161.         for(a=100;a>0;a--){//声音的长度
  1162.                 beep = ~beep;
  1163.                 Delay(50);//音调设置延时
  1164.         }
  1165.         beep = 1;//音乐结束后扬声器拉高关闭
  1166. }               
  1167. /*****************************************************************************/

  1168. /*****************************************************************************/
  1169. //电子钟应用层程序设计
  1170. /*****************************************************************************/
  1171. //向LCM中填写 年 数据
  1172. void lcm_w_yy(void){
  1173.         //if(read_clock(0x8d) != yy){
  1174.                 yy = read_clock(0x8d);
  1175.                 dispString(0, 0, 1, "20");
  1176.                 lcdWriteCommand(0x81);
  1177.                 lcdWriteData((yy/16)+0x30);        
  1178.                 lcdWriteData(yy%16+0x30);
  1179. }        //}
  1180. /*****************************************************************************/
  1181. //向LCM中填写 月 数据
  1182. void lcm_w_mo(void){
  1183.         //if(read_clock(0x89) != mo){
  1184.                 mo = read_clock(0x89);
  1185.                     lcdWriteCommand(0x82);
  1186.                         lcdWriteData(0x2d);
  1187.                         lcdWriteData((mo/16)+0x30);        //十位消隐               
  1188.                     lcdWriteData(mo%16+0x30);
  1189.                         lcdWriteData(0x2d);
  1190.                         year=(mo/16*10)+mo%16;
  1191. }        //}
  1192. /*****************************************************************************/
  1193. //星期处理并送入LCM的指定区域
  1194. void lcm_w_xq(void){
  1195.         //if(read_clock(0x8b) != xq){
  1196.         xq = read_clock(0x8b);
  1197.         selx = (read_clock(0x8b))%16; //字节低4位的BCD码放入selx
  1198.                 if(selx==7)  {dispString(1, 7, 1, "日");}    //
  1199.                   if(selx==6)  {dispString(1, 7, 1, "六");}    //
  1200.                   if(selx==5)  {dispString(1, 7, 1, "五");}    //
  1201.                   if(selx==4)  {dispString(1, 7, 1, "四");}    //
  1202.                   if(selx==3)  {dispString(1, 7, 1, "三");}    //
  1203.                   if(selx==2)  {dispString(1, 7, 1, "二");}    //
  1204.                   if(selx==1)  {dispString(1, 7, 1, "一");}    //星期一
  1205.         dispString(1, 5, 1, "星期");
  1206. }        //}
  1207. /*****************************************************************************/
  1208. //向LCM中填写 日 数据
  1209. void lcm_w_dd(void){
  1210. //        if(read_clock(0x87) != dd){
  1211.                 dd = read_clock(0x87);
  1212.                 lcdWriteCommand(0x84);
  1213.                 lcdWriteData((dd/16)+0x30);        //十位消隐        
  1214.                 lcdWriteData(dd%16+0x30);
  1215. }        //}
  1216. /*****************************************************************************/
  1217. //向LCM中填写 小时 数据
  1218. void lcm_w_hh(void){
  1219.         if(read_clock(0x85) != hh){
  1220.                 hh = read_clock(0x85);
  1221.                         if (hh > 0x07 && hh < 0x22 && w == 0){
  1222.                                 Beep();//整点报时音
  1223.                         }
  1224.                 }
  1225.                 lcdWriteCommand(0x88);
  1226.                 lcdWriteData((hh/16)+0x30);
  1227.                 lcdWriteData(hh%16+0x30);
  1228.                 hh1=hh/16*10+hh%16;
  1229.                 if(hh1>12) hh1=(hh1-12);
  1230.                                 
  1231. }
  1232. /*****************************************************************************/
  1233. //向LCM中填写 分钟 数据
  1234. void lcm_w_mm(void){
  1235.         if(read_clock(0x83) != mm)
  1236.             {               
  1237.                 mm = read_clock(0x83);
  1238.             }
  1239.                 lcdWriteCommand(0x89);
  1240.                 if(t/1%2==0)lcdWriteData(0x3a);          //":"
  1241.                 else{lcdWriteData(0x20);}
  1242.                 lcdWriteData((mm/16)+0x30);
  1243.                 lcdWriteData(mm%16+0x30);
  1244.                 if(t/1%2==0) lcdWriteData(0x3a);          //":"
  1245.                 else{lcdWriteData(0x20);}        
  1246. }
  1247. void disp_temper()//温度值显示
  1248. {
  1249.     uint temper;
  1250.         uchar temper_ge,temper_shi,temper_bai;
  1251.         temper=read_temp();//读取温度
  1252.         temper_ge=temper%10+0x30;
  1253.         temper_shi=temper%100/10+0x30;
  1254.         temper_bai=temper/100+0x30;
  1255.         if(tflag==1)
  1256.         {
  1257.                 dispString(2, 4, 1, " -");
  1258.         }
  1259.         else
  1260.         {
  1261.          dispString(2, 4, 1, "  ");
  1262.         }  
  1263.         if(temper_bai==0x30) temper_bai=0x20;
  1264.         lcdWriteCommand(0x8d);
  1265. lcdWriteData(temper_bai);
  1266.         lcdWriteData(temper_shi);
  1267. lcdWriteData('.');
  1268. lcdWriteData(temper_ge);

  1269.         dispString(2, 7, 1, "℃");        
  1270.    }
  1271. /*********************************************************************************************************
  1272. 处理显示函数(被调用层)                                       
  1273. *********************************************************************************************************/
  1274. void deal(uchar sfm)
  1275. {
  1276.         shi=sfm/16;
  1277.         ge=sfm%16;
  1278. }
  1279. /********************************************************************************************************
  1280. 12864显示时分秒函数(被调用层)
  1281. ********************************************************************************************************/
  1282. void display(uchar add,uchar dat)
  1283. {
  1284.         uchar i,j=0;
  1285.         for(i=16;i<32;i++)
  1286.         {                        
  1287.                 lcdWriteCommand(0x80+i);                                                        
  1288.                 lcdWriteCommand(0x90+add);                                                
  1289.                 lcdWriteData(tab[dat][j++]);
  1290.                 lcdWriteData(tab[dat][j++]);
  1291.         }
  1292.         for(i=0;i<16;i++)
  1293.         {
  1294.                 lcdWriteCommand(0x80+i);
  1295.                 lcdWriteCommand(0x88+add);
  1296.                 lcdWriteData(tab[dat][j++]);
  1297.                 lcdWriteData(tab[dat][j++]);
  1298.         }
  1299. }
  1300. /*********************************************************************************************************
  1301. 初始化函数(被调用层)                                       
  1302. *********************************************************************************************************/
  1303. void init_dz()
  1304. {
  1305.         lcdWriteCommand(0x30);                                                        //选择8bit数据流,基本指令集
  1306.         lcdWriteCommand(0x0c);                                                      //开显示(无游标、不反白)
  1307.         lcdWriteCommand(0x01);                                                       //清除显示,并且设定地址指针为00H
  1308.         dispString(0, 2, 1, "年  月  日");        
  1309.         dispString(3, 0, 1, "星期");        
  1310.         lcdWriteCommand(0x81);                                                         //处理年,并显示
  1311.         yy = read_clock(0x8d);                                
  1312.         deal(yy);
  1313.         lcdWriteData(shi+0x30);
  1314.         lcdWriteData(ge+0x30);
  1315.                                                                                                  //处理月,并显示
  1316.         lcdWriteCommand(0x83);
  1317.         mo = read_clock(0x89);
  1318.         deal(mo);
  1319.         lcdWriteData(shi+0x30);
  1320.         lcdWriteData(ge+0x30);

  1321.         lcdWriteCommand(0x85);                                                         //处理日,并显示
  1322.         dd = read_clock(0x87);
  1323.         deal(dd);
  1324.         lcdWriteData(shi+0x30);
  1325.         lcdWriteData(ge+0x30);
  1326.                                                                                                                                   //处理星期,并显示
  1327.         xq = read_clock(0x8b);
  1328.         switch(xq)
  1329.         {
  1330.                 case 1:        dispString(3, 2, 1, "一");break;
  1331.                 case 2:        dispString(3, 2, 1, "二");break;
  1332.                 case 3:        dispString(3, 2, 1, "三");break;
  1333.                 case 4:        dispString(3, 2, 1, "四");break;
  1334.                 case 5:        dispString(3, 2, 1, "五");break;
  1335.                 case 6:        dispString(3, 2, 1, "六");break;
  1336.                 case 7:        dispString(3, 2, 1, "日");break;
  1337.                 default:break;
  1338.         }
  1339.         dispString(3, 7, 1, "℃");
  1340.         lcdWriteCommand(0x36);                                                         //启动扩充指令集,启动绘图模式
  1341.     clear_img();                                                                //清理图片缓冲区
  1342.         hh = read_clock(0x85);                                                         //处理小时,并显示
  1343.         deal(hh);
  1344.         display(0,shi);
  1345.         display(1,ge);
  1346.         display(2,10);
  1347.         mm = read_clock(0x83);                                                         //处理分钟,并显示
  1348.         deal(mm);
  1349.         display(3,shi);
  1350.         display(4,ge);
  1351.         display(5,10);
  1352.         ss = read_clock(0x81);                                                         //处理秒,并显示
  1353.         deal(ss);
  1354.         display(6,shi);
  1355.         display(7,ge);
  1356. }
  1357. /********************************************************************************************************
  1358. 在12864上显示时间
  1359. ********************************************************************************************************/
  1360. void disp_sfm()
  1361. {
  1362.         uint temper;
  1363.         uchar temper_ge,temper_shi,temper_bai,day_temp,date_temp,month_temp,year_temp;
  1364.         lcdWriteCommand(0x36);                                                         //启动扩充指令集,启动绘图模式
  1365.     ss = read_clock(0x81);        //更新数据                                                
  1366.         if(sec_temp!=ss)//读取秒,只要有改变液晶显示也改变
  1367.         {
  1368.                 sec_temp=ss;
  1369.                 deal(sec_temp);
  1370.                 if(secl!=shi)
  1371.                 {
  1372.                         secl=shi;
  1373.                         display(6,secl);
  1374.                 }
  1375.                 display(7,ge);        
  1376.         }
  1377.         mm = read_clock(0x83);                                                         //读取分,只要有改变液晶显示也改变
  1378.         if(min_temp!=mm)
  1379.         {
  1380.                 min_temp=mm;
  1381.                 deal(mm);
  1382.                 display(3,shi);
  1383.                 display(4,ge);
  1384.         }
  1385.         hh = read_clock(0x85);                                                        //读取小时,只要有改变液晶显示也改变
  1386.         if(hour_temp!=hh)
  1387.         {
  1388.                 hour_temp=hh;
  1389.                 deal(hh);
  1390.                 display(0,shi);
  1391.                 display(1,ge);
  1392.         }

  1393.         if(ge/1%2==0)
  1394.         {
  1395.         display(2,10);
  1396.         display(5,10);
  1397.         }
  1398.         else
  1399.         {
  1400.         display(2,11);
  1401.         display(5,11);
  1402.         }
  1403.          
  1404.         lcdWriteCommand(0x30);
  1405.         dd = read_clock(0x87);                                                //读取日,只要有改变液晶显示也改变
  1406.         if(date_temp!=dd)
  1407.         {        
  1408.                 date_temp=dd;
  1409.                 deal(dd);
  1410.                 lcdWriteCommand(0x85);
  1411.                 lcdWriteData(shi+0x30);
  1412.                 lcdWriteData(ge+0x30);
  1413.         }
  1414.         mo = read_clock(0x89);                                                //读取月,只要有改变液晶显示也改变
  1415.         if(month_temp!=mo)
  1416.         {
  1417.                 month_temp=mo;
  1418.                 lcdWriteCommand(0x83);
  1419.                 deal(mo);
  1420.                 lcdWriteData(shi+0x30);
  1421.                 lcdWriteData(ge+0x30);
  1422.         }
  1423.         yy = read_clock(0x8d);                                                        //读取年,只要有改变液晶显示也改变
  1424.         if(year_temp!=yy)
  1425.         {
  1426.                 year_temp=yy;
  1427.                 lcdWriteCommand(0x81);
  1428.                 deal(yy);
  1429.                 lcdWriteData(shi+0x30);
  1430.                 lcdWriteData(ge+0x30);
  1431.         }
  1432.                 xq = read_clock(0x8b);                                                         //读取星期,只要有改变液晶显示也改变
  1433.         if(day_temp!=xq)
  1434.         {        
  1435.                 day_temp=xq;
  1436.                 switch(xq)
  1437.         {
  1438.                 case 1:        dispString(3, 2, 1, "一");break;
  1439.                 case 2:        dispString(3, 2, 1, "二");break;
  1440.                 case 3:        dispString(3, 2, 1, "三");break;
  1441.                 case 4:        dispString(3, 2, 1, "四");break;
  1442.                 case 5:        dispString(3, 2, 1, "五");break;
  1443.                 case 6:        dispString(3, 2, 1, "六");break;
  1444.                 case 7:        dispString(3, 2, 1, "日");break;
  1445.                 default:break;
  1446.                 }
  1447.         }
  1448.         temper=read_temp();//读取温度
  1449.         temper_ge=temper%10+0x30;
  1450.         temper_shi=temper%100/10+0x30;
  1451.         temper_bai=temper/100+0x30;
  1452.         if(tflag==1)
  1453.         {

  1454.                         dispString(3, 4, 1, " -");
  1455.         }
  1456.         else
  1457.         {
  1458.          dispString(3, 4, 1, "  ");
  1459.         }
  1460.         if(temper_bai==0x30) temper_bai=0x20;
  1461.         lcdWriteCommand(0x9d);
  1462.         lcdWriteData(temper_bai);
  1463.         lcdWriteData(temper_shi);
  1464.         lcdWriteData('.');
  1465.         lcdWriteData(temper_ge);

  1466.         lcdWriteCommand(0x36);        

  1467. }
  1468. /*****************************************************************************/
  1469. //刷新数据
  1470. void updata (void){
  1471.         lcm_w_ss();//刷新 秒
  1472.                 lcm_w_mm();//刷新 分
  1473.                 lcm_w_hh();//刷新 小时
  1474.                 lcm_w_dd();//刷新 日
  1475.                 lcm_w_xq();//更新星期值        
  1476.                 lcm_w_mo();//刷新 月
  1477.                 lcm_w_yy();//刷新 年
  1478.                 ss = read_clock(0x81);        //更新数据
  1479.                 t=ss/16*10+ss%16;
  1480.                 lcmnongli();
  1481.             lcmshengxiao();
  1482.             disp_temper();
  1483.                 if(w == 0)
  1484.                 {                                
  1485.                         days ();//节日显示
  1486.                 }
  1487.                 if (n==1||n==2||n==3)
  1488.                     {
  1489.                         lcdWriteCommand(0x85);                //秒值在LCM上的写入位置
  1490.                         lcdWriteData(0x20);
  1491.                     lcdWriteData(0x0e);        
  1492.                         }
  1493.                 else{
  1494.                      lcdWriteCommand(0x85);                //秒值在LCM上的写入位置
  1495.                          lcdWriteData(0x20);
  1496.                      lcdWriteData(0x20);        
  1497.                      }                                
  1498. }
  1499. /*****************************************************************************/
  1500. //向LCM中填写 秒 数据
  1501. void lcm_w_ss(void)
  1502. {
  1503.         unsigned int i=0;
  1504.         unsigned char a=0,b=0,c=0;
  1505.         if(read_clock(0x81) != ss){        //判断是否需要更新
  1506.                 ss = read_clock(0x81);        //更新数据
  1507.                 if(w==1&&e==6)
  1508.                 {
  1509.                  if(t/1%2==0)
  1510.                  {
  1511.                 lcdWriteCommand(0x8b);                //秒值在LCM上的写入位置
  1512.                 lcdWriteData((ss/16)+0x30);        //写十位               
  1513.                 lcdWriteData(ss%16+0x30);        //写个位
  1514.                  }
  1515.                  else
  1516.                  {
  1517.                 lcdWriteCommand(0x8b);                //秒值在LCM上的写入位置
  1518.                 lcdWriteData(0x20);        //写十位               
  1519.                 lcdWriteData(0x20);        //写个位
  1520.                  }
  1521.                 }
  1522.                 else
  1523.                 {
  1524.                 lcdWriteCommand(0x8b);                //秒值在LCM上的写入位置
  1525.                 lcdWriteData((ss/16)+0x30);        //写十位               
  1526.                 lcdWriteData(ss%16+0x30);        //写个
  1527.                 }
  1528.     }
  1529. }
  1530. //*****************************Music******************************************************/
  1531. //青春舞曲
  1532. unsigned char code Music_wo[]={   0x17,0x03, 0x16,0x03, 0x11,0x03, 0x15,0x03, 0x17,0x03,
  1533.                                   0x16,0x03, 0x15,0x03, 0x11,0x03, 0x10,0x02, 0x10,0x03,
  1534.                                   0x18,0x03, 0x17,0x01, 0x17,0x03, 0x16,0x03, 0x11,0x03,
  1535.                                   0x15,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x11,0x03,
  1536.                                   0x10,0x02, 0x10,0x03, 0x10,0x03, 0x10,0x01, 0x10,0x03,
  1537.                                   0x10,0x03, 0x16,0x03, 0x18,0x03, 0x17,0x02, 0x1A,0x03,
  1538.                                   0x18,0x03, 0x17,0x02, 0x17,0x03, 0x16,0x03, 0x17,0x01,
  1539.                                   0x17,0x03, 0x16,0x03, 0x11,0x03, 0x15,0x03, 0x17,0x03,
  1540.                                   0x16,0x03, 0x15,0x03, 0x11,0x03, 0x10,0x02, 0x10,0x03,
  1541.                                   0x18,0x03, 0x17,0x01, 0x17,0x03, 0x16,0x03, 0x11,0x03,
  1542.                                   0x15,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x11,0x03,
  1543.                                   0x10,0x02, 0x10,0x03, 0x10,0x03, 0x10,0x01, 0x10,0x67,
  1544.                                   0x15,0x04, 0x15,0x03, 0x15,0x03, 0x15,0x02, 0x15,0x03,
  1545.                                   0x11,0x03, 0x10,0x67, 0x15,0x04, 0x11,0x03, 0x10,0x03,
  1546.                                   0x11,0x01, 0x11,0x03, 0x15,0x03, 0x16,0x03, 0x18,0x03,
  1547.                                   0x17,0x03, 0x16,0x03, 0x15,0x03, 0x11,0x03, 0x10,0x02,
  1548.                                   0x10,0x02, 0x10,0x01, 0x00,0x00 };
  1549. /***********************************************************************************/
  1550. /*------------------整屏写入数据:全亮,或者竖条-----------------------------*/
  1551. void lcdfill(unsigned char disdata)
  1552. { unsigned char x,y;
  1553.         for(y=0;y<32;y++)
  1554.          for(x=0;x<16;x++)
  1555.          { lcdWriteCommand(0x36);
  1556.             lcdWriteCommand(y+0x80);        //行地址
  1557.             lcdWriteCommand(x+0x80);     //列地址
  1558.             lcdWriteCommand(0x30);
  1559.             lcdWriteData(disdata);
  1560.             lcdWriteData(disdata);
  1561.                         DelayM(2);
  1562.             }
  1563.    lcdWriteCommand(0x34);                           
  1564.    lcdWriteCommand(0x36);
  1565.    }
  1566. /*------------------显示横-----------------------------*/
  1567. void Disp_H_Line()
  1568. { unsigned char x,y;
  1569.    unsigned char k=0x00;
  1570.        for(y=0;y<32;y++)
  1571.          { k=~k;
  1572.            for(x=0;x<16;x++)
  1573.          { lcdWriteCommand(0x36);
  1574.             lcdWriteCommand(y+0x80);      //行地址
  1575.             lcdWriteCommand(x+0x80);     //列地址
  1576.             lcdWriteCommand(0x30);
  1577.             lcdWriteData(k);
  1578.             lcdWriteData(k);
  1579.                         DelayM(5);
  1580.            };
  1581.          }
  1582.      lcdWriteCommand(0x34);                          
  1583.    lcdWriteCommand(0x36);
  1584. }
  1585. /*------------------显示边框-------------------------------*/
  1586. void Frame()
  1587. {unsigned char x,y;
  1588.           lcdfill(0x00);
  1589.         for(x=0;x<9;x+=8)
  1590.           for(y=0;y<32;y++)
  1591.            { lcdWriteCommand(0x36);
  1592.             lcdWriteCommand(y+0x80);      //行地址
  1593.             lcdWriteCommand(x+0x80);        //列地址
  1594.             lcdWriteCommand(0x30);
  1595.             lcdWriteData(0x80);
  1596.             lcdWriteData(0x00);
  1597.            
  1598.             lcdWriteCommand(0x36);
  1599.             lcdWriteCommand(y+0x80);      //行地址
  1600.             lcdWriteCommand(x+0x87);        //列地址
  1601.             lcdWriteCommand(0x30);
  1602.             lcdWriteData(0x00);
  1603.             lcdWriteData(0x01);
  1604.             DelayM(5);
  1605.             }
  1606.       for(y=0;y<2;y++)
  1607.          for(x=0;x<8;x++)
  1608.            {lcdWriteCommand(0x36);
  1609.             lcdWriteCommand(y*31+0x80);      //行地址
  1610.             lcdWriteCommand(x+0x80+8*y);        //列地址
  1611.             lcdWriteCommand(0x30);
  1612.             lcdWriteData(0xff);
  1613.             lcdWriteData(0xff);
  1614.                         DelayM(5);
  1615.            }
  1616.          lcdWriteCommand(0x34);
  1617.          lcdWriteCommand(0x36);
  1618.                     }
  1619. /*****************************************************************************/
  1620. void zijian(void)
  1621. {
  1622. lcdClear();
  1623. dispString(1, 0, 1, "    V5.1版本    ");
  1624. dispString(2, 0, 1, "  自检程序开始! ");
  1625. DelayM(2000);
  1626. lcdClear();
  1627. displayPhoto(powerOnPhoto1, OFF);
  1628.                                                    DelayM(2000);
  1629. lcdfill(0xff);               //显示全开
  1630.       DelayM(2000);            
  1631.    
  1632.      Disp_H_Line();                //显示横条
  1633.        DelayM(2000);
  1634.       
  1635.       
  1636.        lcdfill(0xaa);               //显示竖条
  1637.       DelayM(2000);
  1638.      
  1639.       Frame();                     //显示边框
  1640.       DelayM(2000);
  1641.           clear_img();
  1642.           lcdClear();
  1643.           lcdWriteCommand(0x30);       //选择8bit数据流
  1644.       lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1645.       lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1646.           Beep_set();//确定按键音
  1647.           dispString(0, 0, 1, "    自检完成!  ");
  1648.           dispString(2, 0, 1, "  ==景淞电子==  ");
  1649.           dispString(3, 0, 1, "  QQ:379663387  ");
  1650.           DelayM(2000);
  1651.           lcdInit ();
  1652. }
  1653. /*****************************************************************************/
  1654. void naozhong()
  1655. {
  1656.                 lcdClear();
  1657.                   dispString(0, 2, 1, "闹钟设置");
  1658.                   dispString(2, 0, 1, "闹钟");
  1659.                   if(n==0)  {dispString(2, 7, 1, "关");}    //
  1660.                   if(n==1)  {dispString(2, 7, 1, "开");}    //
  1661.                 if(n==2)  {dispString(2, 7, 1, "开");}    //
  1662.                 if(n==3)  {dispString(2, 7, 1, "开");}    //
  1663.                 lcdWriteCommand(0x8b);
  1664.         lcdWriteData((n1/10)+0x30);
  1665.             lcdWriteData(n1%10+0x30);
  1666.             dispString(2, 4, 1, "点");
  1667.             lcdWriteData((n2/10)+0x30);
  1668.         lcdWriteData(n2%10+0x30);
  1669.                    while(1)
  1670.                    {
  1671.                    if (KEY_3 == 0) // 设置时间
  1672.               {
  1673.                 DelayM(20);           //去抖
  1674.                 if(KEY_3 == 0 )
  1675.                   {
  1676.                    Beep_key();//按键音
  1677.                    n++;
  1678.                    if (n >= 4 ){n = 0;}
  1679.                if(n==0)  {dispString(2, 7, 1, "关");}    //
  1680.                  if(n==1)  {dispString(2, 7, 1, "开");}    //
  1681.                    if(n==2)  {dispString(2, 7, 1, "开");}    //
  1682.                    if(n==3)  {dispString(2, 7, 1, "开");}    //
  1683.                    switch(n)
  1684.         {
  1685.               case 0:        convertChar(1, 0, 0);
  1686.                                 break;
  1687.                 case 1: convertChar(1, 0, 0);
  1688.                                 break;
  1689.                 case 2:        convertChar(2, 3, 2);
  1690.                                 break;
  1691.                 case 3: convertChar(2, 5, 2);
  1692.                                 break;
  1693.         }
  1694.                   while(KEY_3 == 0);//等待键松开
  1695.                   }
  1696.                 }
  1697.         if(KEY_4 == 0||KEY_2 == 0)
  1698.         {
  1699.         if (KEY_2 == 0&&n==2) //
  1700.               {
  1701.                  DelayM(20);           //去抖
  1702.                  if(KEY_2 == 0 &&n==2)
  1703.                         {
  1704.                         Beep_key();//按键音
  1705.                         n1++;
  1706.                         if (n1 >= 24 ){n1 = 0;}
  1707.                         while(KEY_2 == 0);//等待键松开
  1708.                         }
  1709.                 }
  1710.         if (KEY_2 == 0&&n==3) //
  1711.               {
  1712.                  DelayM(20);           //去抖
  1713.                  if(KEY_2 == 0&&n==3 )
  1714.                         {
  1715.                         Beep_key();//按键音
  1716.                         n2++;
  1717.                         if (n2>= 60 ){n2 = 0;}
  1718.                         while(KEY_2 == 0);//等待键松开
  1719.                         }
  1720.                 }
  1721.                 if (KEY_4 == 0&&n==2) //
  1722.               {
  1723.                  DelayM(20);           //去抖
  1724.                  if(KEY_4 == 0 &&n==2)
  1725.                         {
  1726.                         Beep_key();//按键音
  1727.                         n1--;
  1728.                         if (n1<0 ){n1 = 23;}
  1729.                         while(KEY_4 == 0);//等待键松开
  1730.                         }
  1731.                 }
  1732.         if (KEY_4 == 0&&n==3) //
  1733.               {
  1734.                  DelayM(20);           //去抖
  1735.                  if(KEY_4 == 0&&n==3 )
  1736.                         {
  1737.                         Beep_key();//按键音
  1738.                         n2--;
  1739.                         if (n2<0 ){n2 = 59;}
  1740.                         while(KEY_4 == 0);//等待键松开
  1741.                         }
  1742.                 }
  1743.                 lcdWriteCommand(0x8b);
  1744.         lcdWriteData((n1/10)+0x30);
  1745.             lcdWriteData(n1%10+0x30);
  1746.             dispString(2, 4, 1, "点");
  1747.             lcdWriteData((n2/10)+0x30);
  1748.         lcdWriteData(n2%10+0x30);
  1749.         }
  1750.            if(KEY_1 == 0 )
  1751.                                             {
  1752.                                                   Beep_key();//按键音
  1753.                                                   k=0;
  1754.                                                   while(KEY_1 == 0);//等待键松开
  1755.                                           lcdInit ();
  1756.                               break;
  1757.                                     }
  1758.    }

  1759. }
  1760. /*****************************************************************************/
  1761. void naozhongdao()
  1762. {
  1763.         hh1=hh/16*10+hh%16;
  1764.         mm1=mm/16*10+mm%16;
  1765.         if(n1==hh1 && n2==mm1 && ss==0)
  1766.                    {
  1767.                     lcdWriteCommand(0x30);       //选择8bit数据流
  1768.             lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1769.             lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1770.                    dispString(0, 1, 1, "闹钟时间到! ");
  1771.                    lcdWriteCommand(0x89);
  1772.            lcdWriteData((n1/10)+0x30);
  1773.                lcdWriteData(n1%10+0x30);
  1774.                    dispString(2, 2, 1, "点");
  1775.                lcdWriteData((n2/10)+0x30);
  1776.            lcdWriteData(n2%10+0x30);
  1777.                    dispString(2, 4, 1, "分");
  1778.                    lcdWriteData(0x02);
  1779.                    Play(Music_wo,0,3,360);
  1780.                    lcdInit ();
  1781.                  }
  1782. }
  1783. /*****************************************************************************/
  1784. void procKey (void)
  1785. {
  1786. uchar key1Times=1 ;
  1787. lcdClear();
  1788. dispString(0, 0, 1, "    功能菜单    ");
  1789. dispString(1, 0, 1, "1:界面    2:设置");
  1790. dispString(2, 0, 1, "3:闹钟    4:音乐");
  1791. dispString(3, 0, 1, "5:自检    6:退出");
  1792. convertChar(1, 0, 6);
  1793. while(KEY_3 == 0);//等待键松开
  1794. while(1)
  1795. {
  1796. if(KEY_4 == 0||KEY_2 == 0)
  1797.                         {
  1798. if (KEY_4 == 0) //
  1799.               {
  1800.                  DelayM(20);           //去抖
  1801.                  if(KEY_4 == 0 && w == 0)
  1802.                         {
  1803.                         Beep_key();//按键音
  1804.                         while(KEY_4 == 0);//等待键松开
  1805.                         key1Times--;
  1806.                         if (key1Times==0 ){key1Times = 6;}
  1807.                         }
  1808.                 }
  1809.                 if (KEY_2 == 0) //
  1810.               {
  1811.                  DelayM(20);           //去抖
  1812.                  if(KEY_2 == 0 && w == 0)
  1813.                         {
  1814.                         Beep_key();//按键音
  1815.                         while(KEY_2 == 0);//等待键松开
  1816.                         key1Times++;
  1817.                         if (key1Times==7 ){key1Times = 1;}
  1818.                         }
  1819.                 }
  1820.         lcdClear();
  1821.         dispString(0, 0, 1, "    功能菜单    ");
  1822.         dispString(1, 0, 1, "1:界面    2:设置");
  1823.         dispString(2, 0, 1, "3:闹钟    4:音乐");
  1824.         dispString(3, 0, 1, "5:自检    6:退出");
  1825.         if (key1Times == 7)
  1826.         {
  1827.                 key1Times = 1;
  1828.         }

  1829.         switch(key1Times)
  1830.         {
  1831.                 case 1: convertChar(1, 0, 6);
  1832.                                 break;
  1833.                 case 2:        convertChar(1, 5, 6);
  1834.                                 break;
  1835.                 case 3: convertChar(2, 0, 6);
  1836.                                 break;
  1837.                 case 4: convertChar(2, 5, 6);
  1838.                                 break;
  1839.                 case 5: convertChar(3, 0, 6);
  1840.                                 break;
  1841.                 case 6: convertChar(3, 5, 6);
  1842.                                 break;
  1843.         }
  1844. }
  1845. if (KEY_1== 0) //
  1846.                          {
  1847.                                DelayM(20);
  1848.                                if(KEY_1 == 0 )
  1849.                                              {                                
  1850.                                           Beep_set();//确定按键音
  1851.                                                   if (key1Times==1 ){if(k==0)k=1;else if(k==1)k=0;lcdInit ();break;}
  1852.                                                   if (key1Times==2 ){clear_img();lcdClear();w=1;Set_time(e); k=1;break;}
  1853.                                                   if (key1Times==3 ){lcdClear();clear_img();k=2;break;}
  1854.                                                   if (key1Times==4 ){clear_img();lcdClear();displayPhoto(powerOnPhoto, OFF);Play(Music_wo,0,3,360);lcdInit ();break;}
  1855.                                                   if (key1Times==5 ){zijian(); break;}
  1856.                                                   if (key1Times==6 ){lcdInit (); break;}
  1857.                                                   
  1858.                                                   }
  1859.                                         }
  1860.   }
  1861. }
  1862. /*****************************************************************************/
  1863. //---主程序---//
  1864. /*****************************************************************************/
  1865. main()
  1866. {
  1867.     KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;//初始键盘
  1868.         yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新
  1869.         Beep_set();//确定按键音        
  1870.     InitialSound();
  1871.         beep=1;
  1872.         Init_1302();
  1873.         lcdWriteCommand(0x30);       //选择8bit数据流
  1874.     lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1875.     lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1876.         lcdClear();
  1877.         dispString(0, 0, 1, "┏━━━━━━┓");
  1878.         dispString(1, 0, 1, "┃12864 LCD5.2┃");
  1879.         dispString(2, 0, 1, "┃多功能万年历┃");
  1880.         dispString(3, 0, 1, "┗━━━━━━┛");
  1881.         DelayM(1500); //显示等留1秒
  1882.         lcdInit ();
  1883.         c_sun=0;
  1884. /*****************************************************************************/
  1885.         while(1)
  1886.                 {//主循环
  1887.         if(k==1){updata ();}
  1888.                 if(k==0){disp_sfm();}
  1889.                 if(k==2){naozhong();}
  1890.                 if(n==1||n==2||n==3){naozhongdao();}                                
  1891.                 //------------------------------------------------------------------

  1892.                 if (KEY_3 == 0) // 设置时间
  1893.                                       {
  1894.                                     DelayM(10);           //去抖
  1895.                                         if(KEY_3 == 0 && w == 1)  //当是调时状态 本键用于调整下一项
  1896.                                                 {
  1897.                                                 Beep_key();//按键音
  1898.                                                 e++;
  1899.                                                 if (e >= 7 ){e = 0;}
  1900.                                                 Set_time(e);//调整                                
  1901.                                     }
  1902.                                         if(KEY_3 == 0 && w == 0)  //当是调时状态 本键用于调整下一项
  1903.                                                 {
  1904.                                                 lcdClear();
  1905.                                                 lcdWriteCommand(0x30);       //选择8bit数据流
  1906.                         lcdWriteCommand(0x0c);       //开显示(无游标、不反白)
  1907.                         lcdWriteCommand(0x01);       //清除显示,并且设定地址指针为00H
  1908.                                                 Beep_key();//按键音
  1909.                                                 procKey ();                                
  1910.                                     }
  1911.                                                 while(KEY_3 == 0);//等待键松开
  1912.                          }
  1913.                 //------------------------------------------------------------------
  1914.                 if (KEY_1 == 0&& w == 1) // 当在调时状态时就退出调时
  1915.                          {
  1916.                                DelayM(20);
  1917.                                if(KEY_1 == 0 && w == 1)
  1918.                                              {                                
  1919.                                           Beep_set();//确定按键音
  1920.                                           w = 0;          //退出调时
  1921.                                           e = 0;                //“下一项”计数器清0
  1922.                                                   convertChar(0, 0, 0);                                                               
  1923.                                      }
  1924.                                  while(KEY_1 == 0);//等待键松开
  1925.                         }
  1926.                 //------------------------------------------------------------------
  1927.                 if (KEY_2 == 0 && w == 1) // 加减调整
  1928.                          {
  1929.                              DelayM(5);
  1930.                              if(KEY_2 == 0 && w == 1)
  1931.                                   {                                
  1932.                                        Set_time(e);//调整
  1933.                                            Beep_key();//按键音
  1934.                                   }
  1935.                             while(KEY_2 == 0);//等待键松开
  1936.                        }
  1937.                 //------------------------------------------------------------------
  1938.                 if (KEY_4 == 0 && w == 1)// 加减调整
  1939.                         {               
  1940.                                 DelayM(5);
  1941.                              if(KEY_4 == 0 && w == 1)
  1942.                                      {                                
  1943.                                        Set_time(e);//调整
  1944.                                            Beep_key();//按键音
  1945.                                  }
  1946.                              while(KEY_4 == 0);//等待键松开
  1947.                       }
  1948.   }
  1949. }        
复制代码

所有资料51hei提供下载:
基于51单片机的12864万年历.7z (866.5 KB, 下载次数: 112)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:392670 发表于 2020-2-2 13:56 | 只看该作者
这么好的资料才发现,谢谢分享
回复

使用道具 举报

板凳
ID:288930 发表于 2020-2-3 12:03 | 只看该作者
教程很详细,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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