找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机万年历(程序,原理图,PCB,元件清单都有)欢迎下载

  [复制链接]
跳转到指定楼层
楼主
ID:72399 发表于 2015-2-2 23:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
欢迎下载万年历,不懂的可以问我

程序如下:
  1. /*********************功能比较齐全实用的万年历*********************************************


  2. 功  能:     显示公历年、月、日、时、分、秒
  3.                      农历月、日没用阿拉伯数字符合国人习惯
  4.                          星期(星期不调,用DS1302内的数据,而是根据公历年月日推算的)
  5.                          温度显示(DS18B20)
  6.                          湿度显示(DHT11)
  7.                          公历重大节日显示
  8.                          农历纪念日与节日(用于提醒农历生日非常实用)
  9. 注:1、当农历纪念日与公历纪念日碰到同一天,则按5秒的间隔轮流显示
  10.      2、加入阳历大小月和平闰年判断,调日历时自动控制每个月份的天数
  11.          3、整点提醒等
  12.          4、单片机STC89C54RD+   晶振11.0592MHz
  13.          本程序参考了网上众多高手的制作而来,在这里谢谢了!
  14. /*********************************************************************************************/
  15. //程序部分开始//
  16. /****************************************************************************/
  17. //头文件
  18. #include <reg52.h>
  19. #include <string.h>
  20. #include "DHT11.h"
  21. #include "nongli.h"
  22. #define uchar unsigned char
  23. #define uint unsigned int
  24. #include <intrins.h>
  25. /*****************************************************************************/
  26. //定义PCB板的灯与扬声器定义
  27. sbit        led_back = P2^3;//背光控制(V2.1程序中加入了背光控制的硬件电路)
  28. //sbit        beep   = P2^6;//扬声器
  29. sbit    led_b=P1^4;//秒闪动
  30. /*****************************************************************************/
  31. //定做PCB板温度传感器引脚定义
  32. /****************************************************************************/
  33. sbit DQ = P2 ^4 ;//ds18B20
  34. /*****************************************************************************/
  35. //键盘引脚定义
  36. sbit KEY_1 = P3^1;         //退出设置键
  37. sbit KEY_2 = P3^7;         //上调键
  38. sbit KEY_3 = P3^0;         //设置键
  39. sbit KEY_4 = P3^6;         //下调键
  40. sbit KEY_5 = P3^2;         //LED控制每次按动改变背光开关
  41. /****************************************************************************/
  42. //LCD接口定义
  43. sbit RS = P1^1;//模式位,为0输入指令,为1输入数据
  44. sbit RW = P1^2;//读写位,为0读,为1写
  45. sbit E = P1^0;//使能位
  46. #define Lcd_Bus P0 //数据总线
  47. /*****************************************************************************/
  48. //定义DS1302时钟接口
  49. sbit clock_clk = P2 ^ 0;//ds1302_clk(时钟线)
  50. sbit clock_dat = P2 ^ 1;//ds1302_dat(数据线)
  51. sbit clock_Rst = P2 ^ 2;//ds1302_Rst(复位线)
  52. /*****************************************************************************/
  53. //定义累加器A中的各位
  54. sbit a0   = ACC ^ 0;
  55. sbit a1   = ACC ^ 1;
  56. sbit a2   = ACC ^ 2;
  57. sbit a3   = ACC ^ 3;
  58. sbit a4   = ACC ^ 4;
  59. sbit a5   = ACC ^ 5;
  60. sbit a6   = ACC ^ 6;
  61. sbit a7   = ACC ^ 7;
  62. /****************************************************************************/
  63. //定义全局变量
  64. unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定义时间映射全局变量(专用寄存器)
  65. bit w = 0; //调时标志位,=0时为走时状态,=1时为调时状态
  66. static unsigned char menu = 0;//定义静态小时更新用数据变量
  67. static unsigned char keys = 0;//定义静态小时更新用数据变量
  68. static unsigned char timecount = 0;//定义静态软件计数器变量
  69. signed char address,item,max,mini;
  70. /****************************************************************************/
  71. void DelayM(unsigned int a){//延时函数 1MS/次        
  72.                 unsigned char i;
  73.                 while( --a != 0){               
  74.                         for(i = 0; i < 125; i++);  //一个 ; 表示空语句,CPU空转。
  75.                 }                                      //i 从0加到125,CPU大概就耗时1毫秒
  76. }
  77. /******************************************************************************/
  78. //LCD驱动(DY12864CBL液晶显示屏并口驱动程序)
  79. /******************************************************************************/
  80. void chk_busy(){//检查忙位(底层)
  81.    RS=0;
  82.    RW=1;
  83.    E=1;
  84.    Lcd_Bus=0xff;
  85.    while((Lcd_Bus&0x80)==0x80);
  86.    E=0;
  87. }
  88. /******************************************************************************/
  89. void write_com(unsigned char cmdcode){//写命令到LCD(底层)
  90.         chk_busy();
  91.         RS=0;
  92.         RW=0;
  93.         E=1;
  94.         Lcd_Bus=cmdcode;
  95.         E=0;
  96. }
  97. /******************************************************************************/
  98. void write_data(unsigned char Dispdata){         //写数据到LCD(底层)
  99.         chk_busy();
  100.         RS=1;
  101.         RW=0;
  102.         E=1;
  103.         Lcd_Bus=Dispdata;
  104.         E=0;
  105. }
  106. /******************************************************************************/
  107. void lcm_init(){//初始化LCD屏(被调用层)
  108.    write_com(0x30);       //选择8bit数据流
  109.    write_com(0x0c);       //开显示(无游标、不反白)
  110.    write_com(0x01);       //清除显示,并且设定地址指针为00H
  111. }
  112. /*****************************************************************************/
  113. void lcm_w_word(unsigned char *s){//向LCM发送一个字符串,长度64字符(一行)之内。(被调用层)
  114.         while(*s>0){                                        //应用:lcm_w_word("您好!"),直接显示:您好!
  115.             write_data(*s);
  116.             s++;
  117.    }
  118. }
  119. /******************************************************************************/
  120. void lcm_w_test(bit i,unsigned char word){//写指令或数据(被调用层)
  121.         if(i == 0){
  122.                 write_com(word);//写指令或数据(0,指令)
  123.         }else{
  124.                 write_data(word);//写指令或数据(1,数据)
  125.         }
  126. }
  127. /******************************************************************************/
  128. void lcm_clr(void){//清屏函数
  129.         lcm_w_test(0,0x01);        
  130. }
  131. /******************************************************************************/
  132. void lcm_clr2(void){//清屏上面3行(用空格填满要清显示的地方,因为液晶屏是静态显示的,所以这办法常用)
  133.         lcm_w_test(0,0x80);//第一行
  134.         lcm_w_word("                ");
  135.             //标尺("1234567812345678"应该能够显示满一行)
  136.    lcm_w_test(0,0x90);//第二行
  137.         lcm_w_word("                ");
  138.             //标尺("1234567812345678"应该能够显示满一行)
  139.    lcm_w_test(0,0x88);//第一行
  140.         lcm_w_word("                ");
  141.             //标尺("1234567812345678"应该能够显示满一行)
  142.    }
  143. /******************************************************************************/
  144. //DS18B20温度传感器驱动(显示0至60度,小数点后显示一位)
  145. /******************************************************************************/
  146. void Delay1820(int num){//延时函数
  147.         while(num--) ;
  148. }        
  149. /******************************************************************************/
  150. void Init_DS18B20(void){//初始化ds1820
  151.         unsigned char x=0;
  152.         DQ = 1;    //DQ复位
  153.         Delay1820(8);  //稍做延时
  154.         DQ = 0;    //单片机将DQ拉低
  155.         Delay1820(80); //精确延时 大于 480us
  156.         DQ = 1;    //拉高总线
  157.         Delay1820(14);
  158.         x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  159.         Delay1820(20);
  160. }
  161. /******************************************************************************/
  162. unsigned char ReadOneChar(void){//读一个字节
  163.         unsigned char i=0;
  164.         unsigned char dat = 0;
  165.         for (i=8;i>0;i--){
  166.                 DQ = 0; // 给脉冲信号
  167.                 dat>>=1;
  168.                 DQ = 1; // 给脉冲信号
  169.                 if(DQ)
  170.                 dat|=0x80;
  171.                 Delay1820(4);
  172.         }
  173.         return(dat);
  174. }
  175. /******************************************************************************/
  176. void WriteOneChar(unsigned char dat){//写一个字节
  177.         unsigned char i=0;
  178.         for (i=8; i>0; i--){
  179.                 DQ = 0;
  180.                 DQ = dat&0x01;
  181.                 Delay1820(5);
  182.                 DQ = 1;
  183.                 dat>>=1;
  184.         }
  185. }
  186. /******************************************************************************/
  187. unsigned int ReadTemperature(void){//读取温度,温度值返回到此函数中,供调用
  188.         unsigned char a=0;
  189.         unsigned char b=0;
  190.         unsigned int t=0;
  191.         float tt=0;
  192.         Init_DS18B20();
  193.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  194.         WriteOneChar(0x44); // 启动温度转换
  195.         Init_DS18B20();
  196.         WriteOneChar(0xCC); //跳过读序号列号的操作
  197.         WriteOneChar(0xBE); //读取温度寄存器
  198.         a=ReadOneChar();  //读低8位
  199.         b=ReadOneChar(); //读高8位
  200.         t=b;
  201.         t<<=8;
  202.         t=t|a;
  203.         tt=t*0.0625;
  204.         t= tt*10+0.5; //放大10倍输出并四舍五入
  205.         return(t);//t内的温度值,返回到子函数中,要将温度传输到temp变量,应用temp=ReabTemperature()
  206. }
  207. /******************************************************************************/
  208. //后面会出现的函数声明(当各函数的排列适当时可不用声明,加入函数声明就不用管各个子函数出现的位置先后了?)
  209. void lcm_w_ss(void);//向液晶LCM中写秒数据
  210. void lcm_w_mm(void);//向液晶LCM中写分数据
  211. void lcm_w_hh(void);//向液晶LCM中写小时数据
  212. void lcm_w_dd(void);//写日数据
  213. void lcm_w_mo(void);//写月数据
  214. void lcm_w_yy(void);//写年数据
  215. void lcm_w_xq(void);//星期处理并送入LCM的指定区域
  216. unsigned char clock_in(void);//DS1302逐位写入字节(底层协议)
  217. void clock_out(unsigned char dd);//1302驱动程序逐位读出字节(底层协议?
  218. void Init_1302(void);//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
  219. unsigned char read_clock(unsigned char ord);//DS1302读数据(底层协议)
  220. void read_clockS(void);
  221. void Set_time(unsigned char sel);//根据选择调整的相应项目sel加1并写入DS1302
  222. void write_clock(unsigned char ord, unsigned char dd);//DS1302写数据(底层协议)
  223. void updata (void);        
  224. //void lcm_w_sd(void);//写入湿度数据
  225. void lcm_w_nl(void);//显示农历子函数
  226. void Conversion(bit c,unsigned char year,unsigned char month,unsigned char day); //农历年月日计算子函数
  227. void Conver_week(bit c,unsigned char year,unsigned char month,unsigned char day);//星期计算子函数
  228. void ds_w(void);

  229. /*****************************************************************************/
  230. //设置1302的初始时间(自动初始化)
  231. void Init_1302(void){//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
  232.         unsigned char f;
  233.         if(read_clock(0xc1) != 0xaa){
  234.                 write_clock(0x8e,0x00);//允许写操作
  235.                 write_clock(0x8c,0x11);//年
  236.                 write_clock(0x8a,0x00);//星期
  237.                 write_clock(0x88,0x05);//月
  238.                 write_clock(0x86,0x29);//日
  239.                 write_clock(0x84,0x19);//小时
  240.                 write_clock(0x82,0x55);//分钟
  241.                 write_clock(0x80,0x23);//秒
  242.                 write_clock(0x90,0xa5);//充电        
  243.                 write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
  244.                 for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
  245.                         write_clock(0xc2+f,0x00);
  246.                 }
  247.                 write_clock(0x8e,0x80);//禁止写操作
  248.         }
  249. }
  250. /*****************************************************************************/
  251. //DS1302写数据(底层协议)
  252. void write_clock(unsigned char ord, unsigned char dd){
  253.         clock_clk=0;
  254.         clock_Rst=0;
  255.         clock_Rst=1;
  256.         clock_out(ord);
  257.         clock_out(dd);
  258.         clock_Rst=0;
  259.         clock_clk=1;
  260. }
  261. /*****************************************************************************/
  262. //1302驱动程序逐位读出字节(底层协议)
  263. void clock_out(unsigned char dd){
  264.         ACC=dd;
  265.         clock_dat=a0; clock_clk=1; clock_clk=0;
  266.         clock_dat=a1; clock_clk=1; clock_clk=0;
  267.         clock_dat=a2; clock_clk=1; clock_clk=0;
  268.         clock_dat=a3; clock_clk=1; clock_clk=0;
  269.         clock_dat=a4; clock_clk=1; clock_clk=0;
  270.         clock_dat=a5; clock_clk=1; clock_clk=0;
  271.         clock_dat=a6; clock_clk=1; clock_clk=0;
  272.         clock_dat=a7; clock_clk=1; clock_clk=0;
  273. }
  274. /*****************************************************************************/
  275. //DS1302逐位写入字节(底层协议)
  276. unsigned char clock_in(void){
  277.         clock_dat=1;
  278.         a0=clock_dat;
  279.         clock_clk=1; clock_clk=0; a1=clock_dat;
  280.         clock_clk=1; clock_clk=0; a2=clock_dat;
  281.         clock_clk=1; clock_clk=0; a3=clock_dat;
  282.         clock_clk=1; clock_clk=0; a4=clock_dat;
  283.         clock_clk=1; clock_clk=0; a5=clock_dat;
  284.         clock_clk=1; clock_clk=0; a6=clock_dat;
  285.         clock_clk=1; clock_clk=0; a7=clock_dat;
  286.         return(ACC);
  287. }
  288. /*****************************************************************************/
  289. //DS1302读数据(底层协议)供调用时钟数据
  290. unsigned char read_clock(unsigned char ord){
  291.         unsigned char dd=0;
  292.         clock_clk=0;
  293.         clock_Rst=0;
  294.         clock_Rst=1;
  295.         clock_out(ord);
  296.         dd=clock_in();
  297.         clock_Rst=0;
  298.         clock_clk=1;
  299.         return(dd);
  300. }

  301. /*****************************************************************************/
  302. //扬声器驱动程序(闹钟音乐)
  303. /*****************************************************************************/        
  304. void Beep(void){//BELL-扬声器--整点报时
  305.         unsigned char a;//定义变量用于发声的长度设置
  306.         for(a=60;a>0;a--){//第一个声音的长度
  307.                 beep = ~beep;//取反扬声器驱动口,以产生音频
  308.                 Delay1820(100);//音调设置延时
  309.         }
  310.         for(a=100;a>0;a--){//同上
  311.                 beep = ~beep;
  312.                 Delay1820(80);//
  313.         }
  314.         for(a=100;a>0;a--){//同上
  315.                 beep = ~beep;
  316.                 Delay1820(30);//
  317.         }
  318.         beep = 0;//音乐结束后扬声器输出0关闭,因为后端用9014驱动,所以控制输出1时蜂鸣响
  319. }
  320. /*****************************************************************************/
  321. void Beep_set(void){//BELL -扬声器--确定设置
  322.         unsigned char a;//定义变量用于发声的长度设置
  323.         for(a=50;a>0;a--){//第一个声音的长度
  324.                 beep = ~beep;//取反扬声器驱动口,以产生音频
  325.                 Delay1820(100);//音调设置延时
  326.         }
  327.         for(a=100;a>0;a--){//同上
  328.                 beep = ~beep;
  329.                 Delay1820(50);//
  330.         }
  331.         for(a=50;a>0;a--){//同上
  332.                 beep = ~beep;
  333.                 Delay1820(100);//
  334.         }
  335.         beep = 0;//音乐结束后扬声器输出0关闭,因为后端用9014反相驱动,所以控制输出0时蜂鸣响
  336. }
  337. /*****************************************************************************/
  338. void Beep_key(void){//-扬声器--按键音
  339.         unsigned char a;//定义变量用于发声的长度设置
  340.         for(a=100;a>0;a--){//声音的长度
  341.                 beep = ~beep;
  342.                 Delay1820(50);//音调设置延时
  343.         }
  344.         beep = 0;//音乐结束后扬声器拉高关闭
  345. }               

  346. /******************************************************************************/
  347. //农历节日数据库表,农历纪念日数据表,加上公历的重大节日
  348. /******************************************************************************/



  349. void jie_nl(void){                    //

  350.         dd = read_clock(0x87);//日
  351.             mo = read_clock(0x89);//月
  352.         yy = read_clock(0x8d);//年
  353.         Conversion(0,yy,mo,dd);//调用公历转农历子函数
  354.   //调用函数后,原有数据不变,读c_moon农历世纪,year_moon农历年,month_moon,day_moon得出阴历BCD数据        

  355.         
  356.       lcm_w_test(0,0x98);//在屏幕第四行显示节日(下面的注释行用坐标尺,不要改动)
  357. //农历节日:
  358. //                                                                                                                   ----|----------------|标尺,汉字不要对在空隙上
  359.           if ( month_moon == 0x12 && day_moon == 0x29 ){ lcm_w_word("  明天是春节!!"); }
  360.       if ( month_moon == 0x12 && day_moon == 0x30 ){ lcm_w_word("  今天是春节!!"); }
  361.       if ( month_moon == 0x01 && day_moon == 0x01 ){ lcm_w_word("大年初一拜年啦  "); }
  362.       if ( month_moon == 0x01 && day_moon == 0x14 ){ lcm_w_word("  明天元宵节!  "); }
  363.       if ( month_moon == 0x01 && day_moon == 0x15 ){ lcm_w_word("  元宵节到啦!   "); }
  364.       if ( month_moon == 0x05 && day_moon == 0x04 ){ lcm_w_word("    明天端午    "); }
  365.           if ( month_moon == 0x05 && day_moon == 0x05 ){ lcm_w_word("    今天端午    "); }
  366.       if ( month_moon == 0x07 && day_moon == 0x06 ){ lcm_w_word("  明天七月七啦  "); }
  367.       if ( month_moon == 0x07 && day_moon == 0x07 ){ lcm_w_word("牛郎织女鹊桥相会"); }
  368.       if ( month_moon == 0x08 && day_moon == 0x14 ){ lcm_w_word("  明天仲秋节    "); }
  369.       if ( month_moon == 0x08 && day_moon == 0x15 ){ lcm_w_word("    仲秋佳节    "); }
  370.           if ( month_moon == 0x09 && day_moon == 0x08 ){ lcm_w_word("    明天重阳    "); }
  371.       if ( month_moon == 0x09 && day_moon == 0x09 ){ lcm_w_word("    今天重阳节  "); }
  372.           if ( month_moon == 0x12 && day_moon == 0x07 ){ lcm_w_word("    明天腊八    "); }
  373.           if ( month_moon == 0x12 && day_moon == 0x08 ){ lcm_w_word("    今天腊八    "); }
  374.           if ( month_moon == 0x12 && day_moon == 0x22 ){ lcm_w_word("    明日辞灶    "); }
  375.           if ( month_moon == 0x12 && day_moon == 0x23 ){ lcm_w_word("    今日辞灶    "); }

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

  381.          dd = read_clock(0x87);//日
  382.              mo = read_clock(0x89);//月
  383.          yy = read_clock(0x8d);//年
  384.         //Conversion(0,yy,mo,dd);//调用公历转农历子函数
  385.         //调用函数后,原有数据不变,读c_moon农历世纪,year_moon农历年,month_moon,day_moon得出阴历BCD数据        

  386.          lcm_w_test(0,0x98);//在屏幕第四行显示节日(下面的注释行用坐标尺,不要改动)

  387. //下面是公历的,有些没意思的,就不显示了
  388.         if ( mo == 0x01 && dd == 0x01 ){ lcm_w_word("    欢度元旦"    ); }
  389.         if ( mo == 0x02 && dd == 0x13 ){ lcm_w_word("  明天情人节了  "); }               
  390.                 if ( mo == 0x02 && dd == 0x14 ){ lcm_w_word("  今天是情人节  "); }               
  391.                 if ( mo == 0x03 && dd == 0x08 ){ lcm_w_word("  女同胞高兴了  "); }
  392.                 if ( mo == 0x03 && dd == 0x11 ){ lcm_w_word("  明天是植树节  "); }
  393.                 if ( mo == 0x03 && dd == 0x12 ){ lcm_w_word("    植树节      "); }
  394.             if ( mo == 0x03 && dd == 0x14 ){ lcm_w_word("明天消费者权益日"); }        
  395.                 if ( mo == 0x03 && dd == 0x15 ){ lcm_w_word("  消费者权益日  "); }                                
  396.                 if ( mo == 0x04 && dd == 0x01 ){ lcm_w_word("愚人节  小心上当"); }               
  397.                 if ( mo == 0x04 && dd == 0x07 ){ lcm_w_word("  世界卫生日    "); }               
  398.                 if ( mo == 0x04 && dd == 0x08 ){ lcm_w_word("    复活节      "); }               
  399.                 if ( mo == 0x04 && dd == 0x13 ){ lcm_w_word("  黑色星期五    "); }

  400.                 if ( mo == 0x05 && dd == 0x01 ){ lcm_w_word("  劳动节  放假  "); }//5               
  401.             if ( mo == 0x05 && dd == 0x04 ){ lcm_w_word("    青年节      "); }               
  402.                 if ( mo == 0x05 && dd == 0x08 ){ lcm_w_word("  世界红十字日  "); }               
  403.                 if ( mo == 0x05 && dd == 0x12 ){ lcm_w_word("  国际护士节    "); }               
  404.                 if ( mo == 0x05 && dd == 0x05 ){ lcm_w_word("近日注意母亲节  "); }
  405.                 if ( mo == 0x05 && dd == 0x06 ){ lcm_w_word("近日注意母亲节  "); }
  406.                 if ( mo == 0x05 && dd == 0x15 ){ lcm_w_word("  国际家庭日    "); }
  407.                 if ( mo == 0x05 && dd == 0x31 ){ lcm_w_word("  明天儿童节    "); }
  408.                                                                
  409.                 if ( mo == 0x06 && dd == 0x01 ){ lcm_w_word("月月儿童节快乐! "); }//6
  410.             if ( mo == 0x06 && dd == 0x05 ){ lcm_w_word("  世界环境日    "); }               
  411.                 if ( mo == 0x06 && dd == 0x26 ){ lcm_w_word("  国际禁毒日    "); }               
  412.                 if ( mo == 0x06 && dd == 0x06 ){ lcm_w_word("  全国爱眼日    "); }               
  413.                 if ( mo == 0x06 && dd == 0x13 ){ lcm_w_word("近日注意父亲节  "); }
  414.                 if ( mo == 0x06 && dd == 0x15 ){ lcm_w_word("近日注意父亲节  "); }
  415.                                 
  416.                 if ( mo == 0x07 && dd == 0x01 ){ lcm_w_word("香港回归记念日  "); }//7
  417.                 if ( mo == 0x07 && dd == 0x07 ){ lcm_w_word("抗日战争记念日  "); }
  418.                 if ( mo == 0x07 && dd == 0x11 ){ lcm_w_word("  世界人口日    "); }

  419.                 if ( mo == 0x08 && dd == 0x01 ){ lcm_w_word("  八一建军节    "); }//8
  420.             if ( mo == 0x08 && dd == 0x15 ){ lcm_w_word("抗战胜利记念日  "); }
  421.         if ( mo == 0x09 && dd == 0x09 ){ lcm_w_word("  明天教师节    "); }

  422.                 if ( mo == 0x09 && dd == 0x10 ){ lcm_w_word("  中国教师节    "); }//9
  423.                 if ( mo == 0x09 && dd == 0x18 ){ lcm_w_word("九一八事变纪念  "); }
  424.                 if ( mo == 0x09 && dd == 0x20 ){ lcm_w_word("  国际爱牙日    "); }
  425.                 if ( mo == 0x09 && dd == 0x27 ){ lcm_w_word("  世界旅游日    "); }

  426.                 if ( mo == 0x10 && dd == 0x01 ){ lcm_w_word("  中国国庆节    "); }//10
  427.                if ( mo == 0x10 && dd == 0x04 ){ lcm_w_word("  世界动物日    "); }
  428.                 if ( mo == 0x10 && dd == 0x24 ){ lcm_w_word("    联合国日    "); }
  429.                 if ( mo == 0x10 && dd == 0x12 ){ lcm_w_word("明天国际教师节  "); }
  430.                 if ( mo == 0x10 && dd == 0x13 ){ lcm_w_word("  国际教师节    "); }

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

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

  438.    else{//非节日时显示时晨信息,判断小时数据范围,调取显示
  439.                 if ( hh >= 0x04 && hh <  0x06 ){ lcm_w_word("  凌晨沉睡时间  "); }
  440.             if ( hh >= 0x06 && hh <  0x08 ){ lcm_w_word("不要睡懒觉早点起"); }
  441.                 if ( hh >= 0x08 && hh <  0x12 ){ lcm_w_word("上班是多么的无奈"); }
  442.                 if ( hh == 0x12)               { lcm_w_word("  做点好吃的补充"); }
  443.                 if ( hh >= 0x13 && hh <  0x18 ){ lcm_w_word("    睡个午觉    "); }
  444.                 if ( hh >= 0x18 && hh <  0x22 ){ lcm_w_word("  下班注意安全  "); }
  445.                 if ( hh >= 0x22 && hh <= 0x23 ){ lcm_w_word("  可以做个好梦了"); }
  446.                    if ( hh >= 0x00 && hh <  0x04 ){ lcm_w_word("深夜、、、、、、"); }
  447.                  }
  448. }
  449. /*****************************************************************************/
  450. //电子钟应用层程序设计
  451. /*****************************************************************************/
  452. //向LCM中填写 年 数据
  453. void lcm_w_yy(void){

  454.                 yy = read_clock(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中
  455.                 lcm_w_test(0,0x80);
  456.                 lcm_w_word("20");//显示内容字符20
  457.                 lcm_w_test(1,(yy/16)+0x30);//函数参数1,代表本行写数据,YY/16+0X30得出年十位数字的显示码地址,送显示        
  458.                 lcm_w_test(1,yy%16+0x30);//函数参数1,代表本行写数据,YY%得出年个位数字的显示码地址,送显示
  459.                 //因为年数据两位数字如果是09,C51默认是16进制数据,所以要用16来分离十位、个位。     
  460. }

  461. void lcm_w_yy2(void){//调年时的显示程序
  462.      yy = read_clock(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中
  463.           lcm_w_test(0,0x93);
  464.           lcm_w_word("20");//显示内容字符20
  465.           lcm_w_test(1,(yy/16)+0x30);//函数参数1,代表本行写数据,YY/16+0X30得出年十位数字的显示码地址,送显示        
  466.           lcm_w_test(1,yy%16+0x30);//函数?
  467.      lcm_w_word("  年");
  468.                  }

  469. /*****************************************************************************/
  470. //向LCM中填写 月 数据
  471. void lcm_w_mo(void){
  472.                 mo = read_clock(0x89);//调用1302时钟数据中的月数据,从地址0x89中
  473.            lcm_w_test(0,0x82);
  474.       lcm_w_word("-");
  475.            lcm_w_test(1,(mo/16)+0x30);
  476.                 lcm_w_test(1,mo%16+0x30);//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显示
  477.                 lcm_w_word("-");//调用字符显示函数,显示文字 月
  478. }        


  479. //向LCM中填写调月时 月 数据显示格式(调月时调用显示格式)
  480. void lcm_w_mo2(void){
  481.                 mo = read_clock(0x89);//调用1302时钟数据中的月数据,从地址0x89中
  482.       lcm_w_test(0,0x93);
  483.       lcm_w_word("  ");
  484.       lcm_w_test(1,(mo/16)+0x30);
  485.                 lcm_w_test(1,mo%16+0x30);//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显示
  486.                 lcm_w_word("  月");//调用字符显示函数,显示文字 月
  487. }        


  488. /*****************************************************************************/
  489. //向LCM中填写 日 数据
  490. void lcm_w_dd(void){

  491.                 dd = read_clock(0x87);//从1302芯片中读取日数据,从地址0x87中
  492.                 lcm_w_test(0,0x84);        
  493.                 //if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);}        //如果十位数不是0,就换算显示
  494.                 //else{lcm_w_test(1,0x20);}//如果十位数是0,则显示个空格,不显示数据
  495.            lcm_w_test(1,(dd/16)+0x30);
  496.                 lcm_w_test(1,dd%16+0x30);//第一个1参数,表示本行写数据,日数据与16取余得个位数,加0x30得到显示码
  497.                                 
  498. }        

  499. //向LCM中填写调日期时的 日 数据显示格式(调日时调用的显示格式)
  500. void lcm_w_dd2(void){

  501.                 dd = read_clock(0x87);//从1302芯片中读取日数据,从地址0x87中
  502.            lcm_w_test(0,0x93);        
  503.                 lcm_w_word("  ");
  504.            lcm_w_test(1,(dd/16)+0x30);
  505.                 lcm_w_test(1,dd%16+0x30);//第一个1参数,表示本行写数据,日数据与16取余得个位数,加0x30得到显示码
  506.                 lcm_w_word("  日");//显示字符 日
  507.                                 
  508. }        

  509. //}/*****************************************************************************/
  510. //星期处理并送入LCM的指定区域
  511. void lcm_w_xq(void){

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

  513.         dd = read_clock(0x87);//日
  514.              mo = read_clock(0x89);//月
  515.              yy = read_clock(0x8d);//年
  516.         Conver_week(0,yy,mo,dd);//调用公历换算星期子函数
  517.    
  518.    sel=week;//week是公历转换星期子函数的运行结果,结果为0-6,0是星期日
  519.         lcm_w_test(0,0x87);//显示位置
  520.         if(sel==0)  {lcm_w_word("日");}    //0=星期日
  521.           if(sel==6)  {lcm_w_word("六");}    //
  522.           if(sel==5)  {lcm_w_word("五");}    //
  523.           if(sel==4)  {lcm_w_word("四");}    //
  524.    //if(sel==3)  {lcm_w_word("三");}经调试发现液晶屏不认这一句,只好用下一句显示 三
  525.           if(sel==3)  {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因为“三”的内码失效。
  526.           if(sel==2)  {lcm_w_word("二");}    //
  527.           if(sel==1)  {lcm_w_word("一");}    //星期一
  528.         lcm_w_test(0,0x85);
  529.         lcm_w_word("星期");//调用字符显示子函数,显示 星期 两个字

  530. }        
  531. /*****************************************************************************/
  532. //向LCM中填写 小时 数据
  533. void lcm_w_hh(void){
  534.         if(read_clock(0x85) != hh){//如果程序中的小时与1302芯片中的不同,
  535.                 hh = read_clock(0x85);//刷新程序中的小时数据
  536.                         if (hh > 0x07 && hh < 0x22 && w == 0){ //整点判断
  537.                                 Beep();//调用一次整点报时音
  538.                         }
  539.                 }
  540.                 lcm_w_test(0,0x88);//第一个参数0,表示本行写入LCM的是指令,指定显示位置88H(第三行左端)
  541.                 lcm_w_test(1,(hh/16)+0x30);//显示十位
  542.                 lcm_w_test(1,hh%16+0x30);//显示个位
  543.                                 
  544. }


  545. //向LCM中填写 小时 数据(用于调整时间时调用)
  546. void lcm_w_hh2(void){
  547.         if(read_clock(0x85) != hh){//如果程序中的小时与1302芯片中的不同,
  548.                 hh = read_clock(0x85);//刷新程序中的小时数据
  549.                         if (hh > 0x07 && hh < 0x22 && w == 0){ //整点判断
  550.                                 Beep();//调用一次整点报时音
  551.                         }
  552.                 }
  553.                 lcm_w_test(0,0x93);//第一个参数0,表示本行写入LCM的是指令,指定显示位置88H(第三行左端)
  554.       lcm_w_word("  ");
  555.                 lcm_w_test(1,(hh/16)+0x30);//显示十位
  556.                 lcm_w_test(1,hh%16+0x30);//显示个位
  557.       lcm_w_word("  时");
  558.                                 
  559. }
  560. /*****************************************************************************/
  561. //向LCM中填写 分钟 数据
  562. void lcm_w_mm(void){
  563.         if(read_clock(0x83) != mm){//如果1302芯片中的分钟数据与程序中的分钟变量不相等               
  564.                 mm = read_clock(0x83);//刷新程序中的分钟数据
  565.         }
  566.                                        
  567.         lcm_w_test(0,0x89);//写指令,指定显示位置为89H(第二行的第二个字符)        
  568.         lcm_w_test(1,0x3a);          //":"写数据,显示冒号,采用直接指定冒号的液晶内定显示码的方法
  569.         lcm_w_test(1,(mm/16)+0x30);//向液晶写数据,显示分钟的十位数
  570.         lcm_w_test(1,mm%16+0x30);//向液晶写数据,显示分钟的个位数
  571.    lcm_w_test(1,0x3a);          //":"写数据,显示冒号,采用直接指定冒号的液晶内定显示码的方法
  572. }


  573. void lcm_w_mm2(void){
  574. if(read_clock(0x83) != mm){//如果1302芯片中的分钟数据与程序中的分钟变量不相等               
  575.                 mm = read_clock(0x83);//刷新程序中的分钟数据
  576.         }
  577.         
  578.         lcm_w_test(0,0x9b);//写指令,指定显示位置为89H(第二行的第二个字符)        
  579.    lcm_w_word("  ");
  580.         lcm_w_test(1,(mm/16)+0x30);//向液晶写数据,显示分钟的十位数
  581.         lcm_w_test(1,mm%16+0x30);//向液晶写数据,显示分钟的个位数
  582.         lcm_w_word("  分");
  583. }

  584. /*****************************************************************************/
  585. //向LCM中填写 秒 数据 和温度数据
  586. void lcm_w_ss(void)
  587. {
  588.         unsigned int i=0;
  589.         unsigned char a=0,b=0,c=0;
  590.         if(read_clock(0x81) != ss)
  591.         {        //判断是否需要更新,如果1302芯片中的秒数据与程序秒变量不同
  592.                 ss = read_clock(0x81);        //更新程序中的秒数据
  593.                 lcm_w_test(0,0x8b);                //指定秒值在LCM上的显示位置是8BH
  594.                 lcm_w_test(1,(ss/16)+0x30);        //显示秒十位               
  595.                 lcm_w_test(1,ss%16+0x30);        //显示秒个位(除以16,取余数)
  596.                 led_b = ~led_b;
  597.                 updata ();        //刷新数据子函数

  598.                 lcm_w_test(0,0x95);                //指定温度在LCM上的显示位置为8DH               
  599.                 i=ReadTemperature();//读温度并送显,调用了18B20的读取温度函数返回值,共3位,含十分之一位数字
  600.                 a=i/100;//得到十位上的数字
  601.                 lcm_w_test(1,a+0x30);        //参数1,表示该行写数据,换算显示温度十位数字的显示码
  602.                 b=i/10-a*10;//处理得到第二位数字(个位)
  603.                 lcm_w_test(1,b+0x30);        //参数1,表示该行写的是数据,显示温度个位数字
  604.                 lcm_w_test(1,0x2e);         //"."参数1,表示该行写的数据,显示一个小数点
  605.                 c=i-a*100-b*10;//取得温度的第三位(最末尾,也就是小数点后的一位数字
  606.                 lcm_w_test(1,c+0x30); //换算小数点后的一位数字的显示码(加0x30),并显示               
  607.                 lcm_w_word("℃");        //调用字符显示函数,显示摄氏度的符号
  608.    }        
  609. }

  610. void jie(void)//公历和农历节日按照一秒间隔轮换显示(节日显示)
  611. {
  612. unsigned char ss;
  613. ss = read_clock(0x81);
  614.     if(ss%16==0){jie_gl();}        //每隔5秒调用公历节气显示子函数
  615.         if(ss%16==5){jie_nl();}        //每隔5秒调用农历显示子函数
  616. }
  617. /******************************************************************************/

  618. /*****************************************************************************/
  619. //刷新数据子函数,供调用,在这段程序之前已经调用过
  620. void updata (void){

  621.                 lcm_w_mm();//刷新 分
  622.                 lcm_w_hh();//刷新 小时
  623.                 lcm_w_dd();//刷新 日
  624.                 lcm_w_xq();//更新星期值        
  625.                 lcm_w_mo();//刷新 月
  626.                 lcm_w_yy();//刷新 年
  627.         lcm_w_nl();//刷新农历
  628.         jie();//刷新节日显示
  629.                 lcm_w_sd();        //刷新湿度

  630. }
  631. /*****************************************************************************/
  632. void welcome(void){//开机欢迎显示内容,标尺不能改动,文字不要对准横线之间的空隙
  633.         lcm_w_word("   DIY温湿度计  重要提醒节日生日   2013/01/16     QQ:380760010  ");//
  634.         //----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺
  635. }
  636. //标尺能提示文字显示的位置在哪一行,是否在中心

  637. /*****************************************************************************/
  638. //调整时间子函数,设置键、数据范围、上调加一,下调减一功能。
  639. void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302,函数参数是按动设置键的次数
  640.   

  641.   lcm_w_test(0,0x9b);//第一参数0表示本行写入指令,指定下面行的 调整 显示起始位置为9AH
  642.   lcm_w_word("★调整");//调用字符显示函数,显示 调整字样
  643.   
  644.   //if(sel==6)  {lcm_w_word("秒钟");address=0x80; max=0;mini=0;}     //秒7,没有必要调了

  645.   if(sel==4)  {lcm_w_word("分钟");address=0x82; max=59;mini=0;
  646.    lcm_w_mm2();
  647.    ds_w();
  648.    lcm_w_mm2();
  649.   
  650.   }    //分钟6,按动6次显示 调整分钟
  651.   //并指定分钟数据写入1302芯片的地址是0x82,分钟数据的最大值是59,最小值是0


  652.   if(sel==3)  {lcm_w_word("小时");address=0x84; max=23;mini=0;
  653.   
  654.     lcm_w_hh2();
  655.     ds_w();
  656.     lcm_w_hh2();
  657.   
  658.   }    //小时5,按动5次显示 调整小时
  659.   //规定小时数据写入1302芯片的位置是0x84,小时数据最大值23,最小值是0
  660.   

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

  663.                mo = read_clock(0x89);//读月
  664.                                         moontemp1=mo/16;
  665.                                         moontemp2=mo%16;
  666.                                         mo=moontemp1*10+moontemp2;//转换成10进制月份数据

  667.                yy = read_clock(0x8d);//读年
  668.                moontemp1=yy/16;
  669.                                         moontemp2=yy%16;
  670.                                         yy=moontemp1*10+moontemp2;//转换成10进制年份数据

  671.                     if(mo==2&&yy%4!=0){max=28;mini=1;}//平年2月28天
  672.                                         if(mo==2&&yy%4==0){max=29;mini=1;}//闰年2月29天
  673.                                         if(mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12){max=31;mini=1;}//31天的月份
  674.                                         if(mo==4||mo==6||mo==9||mo==11){max=30;mini=1;}//30天的月份
  675.     lcm_w_dd2();
  676.     ds_w();
  677.     lcm_w_dd2();
  678.   }    //日3,按动3次显示 调整日期
  679.   //规定日期数据写入2302的位置地址是0x86,日期最大值31,最小值是1



  680.                    if(sel==1)  {lcm_w_word("月份");address=0x88; max=12;mini=1;
  681.     lcm_w_mo2();
  682.          ds_w();
  683.     lcm_w_mo2();
  684.   
  685.       }    //月2,按动2次显示 调整月份
  686.   //规定月份写入1302的位置地址是0x88,月份最大值12,最小值1


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

  691.      }    //年1,按动1次显示 调整年份,
  692.   //规定年份写入1302的地址是0x8c,年份的最大值99,最小值0

  693. }
  694. /*****************************************************************************/
  695. //被调数据加一或减一,并检查数据范围,写入1302指定地址保存
  696. void ds_w(void){

  697. item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
  698.   if(KEY_2 == 0){//如果按动上调键
  699.           item++;//数加 1  
  700.   }
  701.   if(KEY_4 == 0){//如果按动下调键
  702.           item--;//数减 1
  703.   }
  704.   if(item>max) item=mini;//查看数值是否在有效范围之内   
  705.   if(item<mini) item=max;//如果数值小于最小值,则自动等于最大值           
  706.   write_clock(0x8e,0x00);//允许写1302芯片操作
  707.   write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
  708.   write_clock(0x8e,0x80);//写保护,禁止写操作
  709.   }

  710. /********************************************************************/
  711. //向LCM中填写 农历年月日数据
  712. void lcm_w_nl(void){

  713.       dd = read_clock(0x87);//日
  714.            mo = read_clock(0x89);//月
  715.            yy = read_clock(0x8d);//年
  716.       Conversion(0,yy,mo,dd);//调用公历转农历子函数
  717.   //调用函数后,原有数据不变,读c_moon农历世纪,year_moon农历年,month_moon,day_moon得出阴历BCD数据
  718.                 lcm_w_test(0,0x90);
  719.         if (month_moon==0x01) {lcm_w_test(1,0xd5);lcm_w_test(1,0xfd);} //正
  720.         if (month_moon==0x02) {lcm_w_word("二");}
  721.         if (month_moon==0x03) {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //三
  722.         if (month_moon==0x04) {lcm_w_word("四");}
  723.         if (month_moon==0x05) {lcm_w_word("五");}
  724.         if (month_moon==0x06) {lcm_w_word("六");}
  725.         if (month_moon==0x07) {lcm_w_word("七");}
  726.         if (month_moon==0x08) {lcm_w_word("八");}
  727.         if (month_moon==0x09) {lcm_w_word("九");}
  728.         if (month_moon==0x10) {lcm_w_word("十");}
  729.         if (month_moon==0x11) {lcm_w_word("冬");}
  730.         if (month_moon==0x12) {lcm_w_word("腊");}
  731.                            lcm_w_word("月");

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


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

  769.         KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;KEY_5=1;//初始键盘
  770.         beep=0;//因为用9014三极管驱动蜂鸣器,所以beep=1时,蜂鸣器响
  771.     led_back=0;
  772.         yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新
  773.         Beep();//鸣响一声        
  774.         Init_1302();//初始化1302时钟芯片
  775.         lcm_init();//初始化液晶显示器
  776.         lcm_clr();//清屏
  777.         welcome();//显示欢迎信息,显示欢迎函数内设定的内容
  778.         DelayM(6000); //欢迎信息显示停留1秒
  779.    lcm_init();//
  780.    lcm_w_nl();//
  781.    lcm_w_sd();
  782.   
  783. /*****************************************************************************/
  784. while(1){//主循环
  785.                   
  786.                if (KEY_5 ==0) // 按下背光控制
  787.               {
  788.                        DelayM(20);//防抖
  789.                         
  790.                        if(KEY_5 == 0){                                
  791.                                 Beep_key();//确定按键音
  792.                            led_back =~led_back; //改变背光状态
  793.                                  
  794.                                 }        
  795.                                         while(KEY_5 == 0);//等待键松开
  796.            }      



  797.                 if (w == 0){   //W为程序头段规定的正常走时标志位,=0时说明在正常走时
  798.                 lcm_w_ss();//刷新 秒
  799.                 }
  800.                 else {                //否则(W!=0的情况下就是调时状态)启动调时
  801.                 }
  802.                 //------------------------------------------------------------------
  803.                 if (KEY_3 == 0) // 按下设置键
  804.               {
  805.                        DelayM(20);           //去抖
  806.                 //        led_g3 = 0;led_r = 1;
  807.                         if(KEY_3 == 0 && w == 1)  //如果按下设置键时,系统是调时状态 本键用于调整下一项
  808.                         {
  809.                                 Beep_key();//按键音
  810.                                 e++;
  811.                                 if (e >= 6 ){e = 0;}
  812.                                 Set_time(e);//调用调整时间子函数                                
  813.                         }


  814.                         if(KEY_3 == 0 && w == 0)  //如果按下设置键时,系统正在正常走时状态时就进入调时状态
  815.                         {
  816.                                 Beep_set();//确定按键音
  817.                         //        led_b = 1;//
  818.                                 lcm_clr();//清屏
  819.             lcm_clr2();//清前三行屏幕显示
  820.                                 w=1;          //进入调时,w是正常走时的标志位,=1进入调试状态,=0进入正常走时状态
  821.                                        
  822.                                 Set_time(e);//调用调整时间子函数
  823.                         }
  824.                        while(KEY_3 == 0);//等待键松开
  825.                
  826.               }
  827.                 //------------------------------------------------------------------
  828.                 if (KEY_1 == 0) // 按下退出键Esc,当在调时状态时就退出调时
  829.               {
  830.                        DelayM(20);
  831.                 //        led_g1 = 0;led_r = 1;
  832.                        if(KEY_1 == 0 && w == 1){        //如果w==1说明在调时状态,按动这个键,退出调时                        
  833.                                 Beep_set();//确定按键音
  834.                                 w = 0;          //退出调时,进入正常走时状体
  835.                                 e = 0;        //设置键功能循环中控制显示 下一项 的参数归0        
  836.                     lcm_w_nl();//刷新农历显示
  837.                         
  838.                         }
  839.                         if(KEY_1 == 0 && w == 0){                                
  840.                                 lcm_clr();//清屏
  841.                                 lcm_w_test(0,0x80);
  842.                                 welcome();//显示欢迎信息
  843.                                 while(KEY_1 == 0);//等待键松开  
  844.                         }
  845.                                 lcm_clr();//清屏
  846.                         
  847.                                 updata ();        //刷新数据
  848.                                 lcm_w_mm();//刷新 分

  849.             lcm_w_nl();//
  850.                
  851.                        while(KEY_1 == 0);//等待键松开  
  852.               }
  853.                 //------------------------------------------------------------------
  854.                 if (KEY_2 == 0 && w == 1){ // 加减调整,KEY_2为上调键,如果上调键按下,且系统在调时状态{
  855.                        DelayM(20); //延时消抖动20毫秒
  856.                        if(KEY_2 == 0 && w == 1){        //确认上调键是按下的                        
  857.                                 Beep_key();//按键音
  858.                                 Set_time(e);//调用调时子函数
  859.                
  860.                         }
  861.                        while(KEY_2 == 0);//等待键松开
  862.               }
  863.                 //------------------------------------------------------------------
  864.                 if (KEY_4 == 0 && w == 1){ // 加减调整,KEY_4为下调键,如果下调键按下而且系统在调时状态              
  865.                        DelayM(20);        //延时消抖动20毫秒
  866.                             if(KEY_4 == 0 && w == 1){        //确定下调键是按下的                        
  867.                                 Beep_key();//按键音
  868.                                 Set_time(e);//调用调时的子函数
  869.                         }
  870.                        while(KEY_4 == 0);//等待键松开
  871.               }
  872. }        }        
  873. /***************************************************************************/
复制代码


万年历全部设计文件.rar

411.13 KB, 下载次数: 658, 下载积分: 黑币 -5

欢迎下载

评分

参与人数 7黑币 +36 收起 理由
qjzyx + 6 赞一个!
娇1103 + 5 赞一个!
a416117858 + 5
zhaok2013 + 5 很给力!
sxencon + 5
ssfc + 5 赞一个!
madell + 5 很给力!

查看全部评分

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

使用道具 举报

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

评分

参与人数 3黑币 +12 收起 理由
zhouqiang + 5 共享资料的黑币奖励!
唐131 + 2 赞一个!一直在找的程序
Fsy + 5

查看全部评分

回复

使用道具 举报

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

好啊,正好有用。
回复

使用道具 举报

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

好啊,正好
回复

使用道具 举报

5#
ID:67678 发表于 2015-2-14 19:44 | 只看该作者
谢谢楼主分享。
回复

使用道具 举报

6#
ID:70614 发表于 2015-2-14 19:59 | 只看该作者
有什么不会的问题真的可以问你吗
回复

使用道具 举报

7#
ID:73870 发表于 2015-2-25 16:40 | 只看该作者
不错,想看看
回复

使用道具 举报

8#
ID:75864 发表于 2015-4-1 11:23 | 只看该作者
学习一下
回复

使用道具 举报

9#
ID:74143 发表于 2015-4-3 14:45 | 只看该作者
下载学习了。
回复

使用道具 举报

10#
ID:72399 发表于 2015-4-6 09:34 | 只看该作者
下载来学习学习吧
回复

使用道具 举报

11#
ID:72399 发表于 2015-4-6 09:35 | 只看该作者
星星一眨眼 发表于 2015-2-14 19:59
有什么不会的问题真的可以问你吗

可以的啊
回复

使用道具 举报

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

RE: 欢迎下载万年历


什么型式的万年历?
点阵屏的,还是数码管的?
回复

使用道具 举报

13#
ID:73962 发表于 2015-4-6 12:18 | 只看该作者
有配套电路图,和源程序吗?
回复

使用道具 举报

14#
ID:72399 发表于 2015-4-6 20:21 | 只看该作者
有啊里面没有电路图不过看程序也会画了的
回复

使用道具 举报

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

使用道具 举报

16#
ID:81190 发表于 2015-5-26 16:18 | 只看该作者
有效果图片没有呢
回复

使用道具 举报

17#
ID:81407 发表于 2015-5-28 21:49 | 只看该作者
大哥,PCB 图呢
回复

使用道具 举报

18#
ID:81407 发表于 2015-5-28 21:50 | 只看该作者
哥,急求源pcb图,在线等,加q,1903436056.
回复

使用道具 举报

19#
ID:92810 发表于 2015-12-9 13:32 | 只看该作者
正好需要这个的。。。
回复

使用道具 举报

20#
ID:99009 发表于 2015-12-9 17:46 | 只看该作者
有仿真图吗?
回复

使用道具 举报

21#
ID:108622 发表于 2016-3-25 06:49 来自手机 | 只看该作者
电路图呢
回复

使用道具 举报

22#
ID:108143 发表于 2016-3-29 00:08 | 只看该作者
看下资料,估计能用上
回复

使用道具 举报

23#
ID:91691 发表于 2016-3-29 11:50 | 只看该作者
谢谢楼主分享。
回复

使用道具 举报

24#
ID:106211 发表于 2016-4-20 10:29 | 只看该作者
先下了看看
回复

使用道具 举报

25#
ID:106211 发表于 2016-4-20 10:53 | 只看该作者
谢谢楼主分享。正好用上
回复

使用道具 举报

26#
ID:106211 发表于 2016-4-20 10:55 | 只看该作者
不知道还能带20P大点的屏吗
回复

使用道具 举报

27#
ID:115455 发表于 2016-4-20 15:30 | 只看该作者
谢谢楼主分享。正好用上
回复

使用道具 举报

28#
ID:114284 发表于 2016-4-24 09:36 | 只看该作者
请问楼主,怎么复制进工程,编译时提示错误呢
回复

使用道具 举报

29#
ID:109731 发表于 2016-4-24 16:06 | 只看该作者
有PCB图吗?
回复

使用道具 举报

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

使用道具 举报

31#
ID:116894 发表于 2016-4-26 20:15 | 只看该作者
谢谢分享
回复

使用道具 举报

32#
ID:117047 发表于 2016-5-1 16:34 | 只看该作者
感谢分享!!!!
回复

使用道具 举报

33#
ID:71115 发表于 2016-5-6 21:16 | 只看该作者
真是好东西,真好学习下
回复

使用道具 举报

34#
ID:63646 发表于 2016-5-7 00:32 | 只看该作者
真是好东西,真好学习下
回复

使用道具 举报

35#
ID:119032 发表于 2016-5-7 12:10 | 只看该作者
黑笔不够下载不了。。
回复

使用道具 举报

36#
ID:119119 发表于 2016-5-7 19:01 | 只看该作者
是想要的
回复

使用道具 举报

37#
ID:121641 发表于 2016-5-18 10:10 | 只看该作者
楼主好人,学习了。。。。
回复

使用道具 举报

38#
ID:123297 发表于 2016-5-26 11:12 | 只看该作者
。。。。下载
回复

使用道具 举报

39#
ID:123315 发表于 2016-5-26 20:16 | 只看该作者
我做的和你不一样 我遇到问题了 麻烦楼主解答一下我的 东西焊出来 显示都正常 但是时间日期不走怎么回事啊楼主

627145707149422281.jpg (63.87 KB, 下载次数: 25)

627145707149422281.jpg
回复

使用道具 举报

40#
ID:124587 发表于 2016-6-2 12:32 | 只看该作者
楼主好人!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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