找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2330|回复: 0
收起左侧

lcd1602温湿万年历源程序

[复制链接]
ID:188297 发表于 2017-4-11 13:03 | 显示全部楼层 |阅读模式
程序很好用

  1. /*
  2. 程序名称:                温显万年历
  3. 程序操作:                把LCD1602连接到学习板上;连接J11,J10的4和6,3和5使能DS1302;使用杜邦线连接J7的中间线与J8的中间线使能18B20;连接18B20模块。
  4. 程序效果:                LCD1602会变成可以显示年月日时分秒,温度的万年历,使用S19-22调节,S19-选择调节项目,S20-加1,S21-减1,S22-确定
  5. */
  6. #include <REG51.H>
  7. #include <intrins.h>

  8. #define uint unsigned int
  9. #define uchar unsigned char
  10. sbit  DS1302_CLK = P3^6;                      //实时时钟时钟线引脚
  11. sbit  DS1302_IO  = P3^7;                      //实时时钟数据线引脚
  12. sbit  DS1302_RST = P1^4;                      //实时时钟复位线引脚

  13. sbit  ACC0 = ACC^0;
  14. sbit  ACC7 = ACC^7;
  15. char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,时到日,月,年位闪的计数
  16. sbit Set = P2^0;                                               //模式切换键
  17. sbit Up = P2^1;                                                //加法按钮
  18. sbit Down = P2^2;                                              //减法按钮
  19. sbit out = P2^3;                                               //立刻跳出调整模式按钮
  20. sbit DQ = P3^5;                                                //温度传送数据IO口
  21. char done,count,temp,flag,up_flag,down_flag;
  22. uchar temp_value;                                              //温度值
  23. uchar TempBuffer[5],week_value[2];

  24. void show_time();                                           //液晶显示程序
  25. /***********1602液晶显示部分子程序****************/
  26. sbit LcdRs                = P1^0;                                        //LCD1602的RS,RW,E端口设定
  27. sbit LcdRw                = P1^1;
  28. sbit LcdEn          = P1^2;
  29. sfr  DBPort         = 0x80;                                        //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

  30. //内部等待函数************************************
  31. unsigned char LCD_Wait(void)
  32. {
  33.         LcdRs=0;
  34.         LcdRw=1;        _nop_();
  35.         LcdEn=1;        _nop_();                         
  36.         LcdEn=0;
  37.         return DBPort;               
  38. }
  39. //向LCD写入命令或数据*****************************
  40. #define LCD_COMMAND                        0                      // Command
  41. #define LCD_DATA                        1                      // Data
  42. #define LCD_CLEAR_SCREEN        0x01              // 清屏
  43. #define LCD_HOMING                  0x02              // 光标返回原点
  44. void LCD_Write(bit style, unsigned char input)
  45. {
  46.         LcdEn=0;
  47.         LcdRs=style;
  48.         LcdRw=0;                _nop_();
  49.         DBPort=input;        _nop_();                        //注意顺序
  50.         LcdEn=1;                _nop_();                        //注意顺序
  51.         LcdEn=0;                _nop_();
  52.         LCD_Wait();       
  53. }

  54. //设置显示模式************************************
  55. #define LCD_SHOW                        0x04            //显示开
  56. #define LCD_HIDE                        0x00            //显示关          

  57. #define LCD_CURSOR                        0x02                 //显示光标
  58. #define LCD_NO_CURSOR                0x00            //无光标                     

  59. #define LCD_FLASH                        0x01            //光标闪动
  60. #define LCD_NO_FLASH                0x00            //光标不闪动

  61. void LCD_SetDisplay(unsigned char DisplayMode)
  62. {
  63.         LCD_Write(LCD_COMMAND, 0x08|DisplayMode);       
  64. }

  65. //设置输入模式************************************
  66. #define LCD_AC_UP                        0x02
  67. #define LCD_AC_DOWN                        0x00              // default

  68. #define LCD_MOVE                        0x01              // 画面可平移
  69. #define LCD_NO_MOVE                        0x00              //default

  70. void LCD_SetInput(unsigned char InputMode)
  71. {
  72.         LCD_Write(LCD_COMMAND, 0x04|InputMode);
  73. }

  74. //初始化LCD***************************************
  75. void LCD_Initial()
  76. {
  77.         LcdEn=0;
  78.         LCD_Write(LCD_COMMAND,0x38);                           //8位数据端口,2行显示,5*7点阵
  79.         LCD_Write(LCD_COMMAND,0x38);
  80.         LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);            //开启显示, 无光标
  81.         LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);           //清屏
  82.         LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);               //AC递增, 画面不动
  83. }

  84. //液晶字符输入的位置******************************
  85. void GotoXY(unsigned char x, unsigned char y)
  86. {
  87.         if(y==0)
  88.                 LCD_Write(LCD_COMMAND,0x80|x);
  89.         if(y==1)
  90.                 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  91. }

  92. //将字符输出到液晶显示
  93. void Print(unsigned char *str)
  94. {
  95.         while(*str!='\0')
  96.         {
  97.                 LCD_Write(LCD_DATA,*str);
  98.                 str++;
  99.         }
  100. }






  101. /***********DS1302时钟部分子程序******************/
  102. typedef struct __SYSTEMTIME__
  103. {
  104.         unsigned char Second;
  105.         unsigned char Minute;
  106.         unsigned char Hour;
  107.         unsigned char Week;
  108.         unsigned char Day;
  109.         unsigned char Month;
  110.         unsigned char  Year;
  111.         unsigned char DateString[11];
  112.         unsigned char TimeString[9];
  113. }SYSTEMTIME;                                                        //定义的时间类型
  114. SYSTEMTIME CurrentTime;


  115. #define AM(X)        X
  116. #define PM(X)        (X+12)                              // 转成24小时制
  117. #define DS1302_SECOND        0x80                  //时钟芯片的寄存器位置,存放时间
  118. #define DS1302_MINUTE        0x82
  119. #define DS1302_HOUR                0x84
  120. #define DS1302_WEEK                0x8A
  121. #define DS1302_DAY                0x86
  122. #define DS1302_MONTH        0x88
  123. #define DS1302_YEAR                0x8C

  124. void DS1302InputByte(unsigned char d)         //实时时钟写入一字节(内部函数)
  125. {
  126.     unsigned char i;
  127.     ACC = d;
  128.     for(i=8; i>0; i--)
  129.     {
  130.         DS1302_IO = ACC0;                   //相当于汇编中的 RRC
  131.         DS1302_CLK = 1;
  132.         DS1302_CLK = 0;
  133.         ACC = ACC >> 1;
  134.     }
  135. }

  136. unsigned char DS1302OutputByte(void)         //实时时钟读取一字节(内部函数)
  137. {
  138.     unsigned char i;
  139.     for(i=8; i>0; i--)
  140.     {
  141.         ACC = ACC >>1;                                 //相当于汇编中的 RRC
  142.         ACC7 = DS1302_IO;
  143.         DS1302_CLK = 1;
  144.         DS1302_CLK = 0;
  145.     }
  146.     return(ACC);
  147. }

  148. void Write1302(unsigned char ucAddr, unsigned char ucDa)        //ucAddr: DS1302地址, ucData: 要写的数据
  149. {
  150.     DS1302_RST = 0;
  151.     DS1302_CLK = 0;
  152.     DS1302_RST = 1;
  153.     DS1302InputByte(ucAddr);                       // 地址,命令
  154.     DS1302InputByte(ucDa);                       // 写1Byte数据
  155.     DS1302_CLK = 1;
  156.     DS1302_RST = 0;
  157. }

  158. unsigned char Read1302(unsigned char ucAddr)        //读取DS1302某地址的数据
  159. {
  160.     unsigned char ucData;
  161.     DS1302_RST = 0;
  162.     DS1302_CLK = 0;
  163.     DS1302_RST = 1;
  164.     DS1302InputByte(ucAddr|0x01);        // 地址,命令
  165.     ucData = DS1302OutputByte();         // 读1Byte数据
  166.     DS1302_CLK = 1;
  167.     DS1302_RST = 0;
  168.     return(ucData);
  169. }



  170. void DS1302_GetTime(SYSTEMTIME *Time)  //获取时钟芯片的时钟数据到自定义的结构型数组
  171. {
  172.         unsigned char ReadValue;
  173.         ReadValue = Read1302(DS1302_SECOND);
  174.         Time->Second =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  175.         ReadValue =Read1302(DS1302_MINUTE);
  176.         Time->Minute =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  177.         ReadValue =Read1302(DS1302_HOUR);
  178.         Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  179.         ReadValue = Read1302(DS1302_DAY);
  180.         Time->Day =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);       
  181.         ReadValue = Read1302(DS1302_WEEK);
  182.         Time->Week =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  183.         ReadValue = Read1302(DS1302_MONTH);
  184.         Time->Month =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  185.         ReadValue = Read1302(DS1302_YEAR);
  186.         Time->Year =((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);       
  187. }

  188. void DateToStr(SYSTEMTIME *Time)    //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
  189. {   if(hide_year<2)                 //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
  190.     {                              
  191.           Time->DateString[0] = '2';
  192.           Time->DateString[1] = '0';         
  193.           Time->DateString[2] = Time->Year/10 + '0';
  194.           Time->DateString[3] = Time->Year%10 + '0';
  195.         }
  196.           else
  197.             {
  198.               Time->DateString[0] = ' ';
  199.               Time->DateString[1] = ' ';                 
  200.               Time->DateString[2] = ' ';
  201.               Time->DateString[3] = ' ';
  202.                 }
  203.         Time->DateString[4] = '/';
  204.         if(hide_month<2)
  205.         {
  206.           Time->DateString[5] = Time->Month/10 + '0';
  207.           Time->DateString[6] = Time->Month%10 + '0';
  208.         }
  209.           else
  210.           {
  211.             Time->DateString[5] = ' ';
  212.             Time->DateString[6] = ' ';
  213.           }
  214.         Time->DateString[7] = '/';
  215.         if(hide_day<2)
  216.         {
  217.           Time->DateString[8] = Time->Day/10 + '0';
  218.           Time->DateString[9] = Time->Day%10 + '0';
  219.         }
  220.           else
  221.           {
  222.             Time->DateString[8] = ' ';
  223.             Time->DateString[9] = ' ';            
  224.           }
  225.         if(hide_week<2)
  226.         {
  227.           week_value[0] = Time->Week%10 + '0';  //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
  228.         }
  229.           else
  230.           {
  231.             week_value[0] = ' ';
  232.           }
  233.           week_value[1] = '\0';

  234.         Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符
  235. }

  236. void TimeToStr(SYSTEMTIME *Time)  //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];
  237. {   if(hide_hour<2)
  238.     {
  239.           Time->TimeString[0] = Time->Hour/10 + '0';
  240.           Time->TimeString[1] = Time->Hour%10 + '0';
  241.         }
  242.           else
  243.             {
  244.               Time->TimeString[0] = ' ';
  245.               Time->TimeString[1] = ' ';
  246.                 }
  247.         Time->TimeString[2] = ':';
  248.     if(hide_min<2)
  249.         {
  250.           Time->TimeString[3] = Time->Minute/10 + '0';
  251.           Time->TimeString[4] = Time->Minute%10 + '0';
  252.         }
  253.           else
  254.             {
  255.               Time->TimeString[3] = ' ';
  256.               Time->TimeString[4] = ' ';
  257.                }
  258.         Time->TimeString[5] = ':';
  259.     if(hide_sec<2)
  260.     {
  261.           Time->TimeString[6] = Time->Second/10 + '0';
  262.           Time->TimeString[7] = Time->Second%10 + '0';
  263.     }
  264.       else
  265.        {
  266.          Time->TimeString[6] = ' ';
  267.              Time->TimeString[7] = ' ';
  268.        }
  269.         Time->DateString[8] = '\0';
  270. }


  271. void Initial_DS1302(void)                                           //时钟芯片初始化
  272. {   
  273.         unsigned char Second=Read1302(DS1302_SECOND);
  274.         if(Second&0x80)                                                              //判断时钟芯片是否关闭          
  275.     {
  276.                 Write1302(0x8e,0x00);                                         //写入允许
  277.                 Write1302(0x8c,0x07);                                         //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55
  278.                 Write1302(0x88,0x07);
  279.                 Write1302(0x86,0x25);
  280.                 Write1302(0x8a,0x07);
  281.                 Write1302(0x84,0x23);
  282.                 Write1302(0x82,0x59);
  283.                 Write1302(0x80,0x55);
  284.                 Write1302(0x8e,0x80);                                         //禁止写入
  285.         }

  286. }

  287. /***********ds18b20子程序*************************/

  288. /***********ds18b20延迟子函数(晶振12MHz )*******/

  289. void delay_18B20(unsigned int i)
  290. {
  291.         while(i--);
  292. }

  293. /**********ds18b20初始化函数**********************/

  294. void Init_DS18B20(void)
  295. {
  296.          unsigned char x=0;
  297.          DQ = 1;                                                          //DQ复位
  298.          delay_18B20(8);                                                  //稍做延时
  299.          DQ = 0;                                                          //单片机将DQ拉低
  300.          delay_18B20(80);                                                 //精确延时 大于 480us
  301.          DQ = 1;                                                          //拉高总线
  302.          delay_18B20(14);
  303.          x=DQ;                                                            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  304.          delay_18B20(20);
  305. }

  306. /***********ds18b20读一个字节**************/  

  307. unsigned char ReadOneChar(void)
  308. {
  309.         uchar i=0;
  310.         uchar dat = 0;
  311.         for (i=8;i>0;i--)
  312.          {
  313.                   DQ = 0;                                                         // 给脉冲信号
  314.                   dat>>=1;
  315.                   DQ = 1;                                                         // 给脉冲信号
  316.                   if(DQ)
  317.                   dat|=0x80;
  318.                   delay_18B20(4);
  319.          }
  320.         return(dat);
  321. }

  322. /*************ds18b20写一个字节****************/  

  323. void WriteOneChar(uchar dat)
  324. {
  325.         unsigned char i=0;
  326.         for (i=8; i>0; i--)
  327.         {
  328.                   DQ = 0;
  329.                 DQ = dat&0x01;
  330.             delay_18B20(5);
  331.                 DQ = 1;
  332.             dat>>=1;
  333. }
  334. }

  335. /**************读取ds18b20当前温度************/

  336. void ReadTemp(void)
  337. {
  338.         unsigned char a=0;
  339.         unsigned char b=0;
  340.         unsigned char t=0;

  341.         Init_DS18B20();
  342.         WriteOneChar(0xCC);            // 跳过读序号列号的操作
  343.         WriteOneChar(0x44);         // 启动温度转换

  344.         delay_18B20(100);       // this message is wery important

  345.         Init_DS18B20();
  346.         WriteOneChar(0xCC);         //跳过读序号列号的操作
  347.         WriteOneChar(0xBE);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

  348.         delay_18B20(100);

  349.         a=ReadOneChar();            //读取温度值低位
  350.         b=ReadOneChar();                   //读取温度值高位
  351.         temp_value=b<<4;
  352.         temp_value+=(a&0xf0)>>4;               
  353. }
  354. void temp_to_str()                   //温度数据转换成液晶字符显示
  355. {
  356.   TempBuffer[0]=temp_value/10+'0';  //十位
  357.   TempBuffer[1]=temp_value%10+'0';  //个位
  358.   TempBuffer[2]=0xdf;                           //温度符号
  359.   TempBuffer[3]='C';
  360.   TempBuffer[4]='\0';
  361. }
  362. void Delay1ms(unsigned int count)
  363. {
  364.         unsigned int i,j;
  365.         for(i=0;i<count;i++)
  366.         for(j=0;j<120;j++);
  367. }

  368. /*延时子程序*/
  369. void mdelay(uint delay)
  370. {        uint i;
  371.         for(;delay>0;delay--)
  372.                    {for(i=0;i<62;i++)                         //1ms延时.
  373.                        {;}
  374.                    }
  375. }


  376. void outkey()                            //跳出调整模式,返回默认显示
  377. { uchar Second;
  378.   if(out==0)//||wireless_1==1)         
  379.   { mdelay(8);
  380.         count=0;
  381.         hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
  382.         Second=Read1302(DS1302_SECOND);
  383.     Write1302(0x8e,0x00);                         //写入允许
  384.         Write1302(0x80,Second&0x7f);
  385.         Write1302(0x8E,0x80);                  //禁止写入
  386.         done=0;           
  387.         while(out==0);
  388.         //while(wireless_1==1);
  389.   }
  390. }
  391. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  392. void Upkey()//升序按键
  393. {          
  394.                 Up=1;
  395.                 if(Up==0)//||wireless_2==1)
  396.                           {
  397.                                    mdelay(8);
  398.                                        switch(count)
  399.                                           {case 1:
  400.                                   temp=Read1302(DS1302_SECOND);  //读取秒数
  401.                                                                   temp=temp+1;  //秒数加1
  402.                                   up_flag=1;    //数据调整后更新标志
  403.                                                                   if((temp&0x7f)>59)   //超过59秒,清零
  404.                                   temp=0;                                                                  
  405.                                                                   break;
  406.                                            case 2:
  407.                                   temp=Read1302(DS1302_MINUTE);  //读取分数
  408.                                                                   temp=temp+1;  //分数加1
  409.                                   up_flag=1;
  410.                                                                   if(temp>59)          //超过59分,清零
  411.                                                                   temp=0;
  412.                                                                   break;
  413.                                            case 3:
  414.                                   temp=Read1302(DS1302_HOUR);  //读取小时数
  415.                                                                   temp=temp+1;  //小时数加1
  416.                                   up_flag=1;
  417.                                                                   if(temp>23)   //超过23小时,清零
  418.                                                                   temp=0;
  419.                                                                   break;
  420.                                            case 4:
  421.                                   temp=Read1302(DS1302_WEEK);  //读取星期数
  422.                                                                   temp=temp+1;  //星期数加1
  423.                                   up_flag=1;
  424.                                                                   if(temp>7)  
  425.                                                                   temp=1;
  426.                                                                   break;
  427.                                            case 5:
  428.                                   temp=Read1302(DS1302_DAY);  //读取日数
  429.                                                                   temp=temp+1;  //日数加1
  430.                                   up_flag=1;
  431.                                                                   if(temp==0x0a)
  432.                                                                           temp=0x10;
  433.                                                                   if(temp==0x1a)
  434.                                                                     temp=0x20;
  435.                                                                   if(temp>0x2b)
  436.                                                                   temp=1;
  437.                                                                   break;
  438.                                            case 6:
  439.                                   temp=Read1302(DS1302_MONTH);  //读取月数
  440.                                                                   temp=temp+1;  //月数加1
  441.                                   up_flag=1;
  442.                                                                   if(temp>12)
  443.                                                                   temp=1;
  444.                                                                   break;
  445.                                            case 7:
  446.                                   temp=Read1302(DS1302_YEAR);  //读取年数
  447.                                                                   temp=temp+1;  //年数加1
  448.                                   up_flag=1;
  449.                                                                   if(temp>0x85)
  450.                                                                   temp=0;
  451.                                                                   break;
  452.                                                default:break;
  453.                                           }
  454.                                           
  455.                                    while(Up==0);
  456.                        //while(wireless_2==1);
  457.                                   }
  458. }

  459. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  460. void Downkey()//降序按键
  461. {            
  462.                 Down=1;
  463.             if(Down==0)//||wireless_3==1)
  464.                           {
  465.                                    mdelay(8);
  466.                                      switch(count)
  467.                                           {case 1:
  468.                                   temp=Read1302(DS1302_SECOND);  //读取秒数
  469.                                                                   temp=temp-1;                                                    //秒数减1
  470.                                   down_flag=1;       //数据调整后更新标志
  471.                                                                   if(temp==0x7f)     //小于0秒,返回59秒
  472.                                                                   temp=59;
  473.                                                                   break;
  474.                                            case 2:
  475.                                   temp=Read1302(DS1302_MINUTE);  //读取分数
  476.                                                                   temp=temp-1;  //分数减1
  477.                                   down_flag=1;
  478.                                                                   if(temp==-1)
  479.                                                                   temp=59;      //小于0秒,返回59秒
  480.                                                                   break;
  481.                                            case 3:
  482.                                   temp=Read1302(DS1302_HOUR);  //读取小时数
  483.                                                                   temp=temp-1;  //小时数减1
  484.                                   down_flag=1;
  485.                                                                   if(temp==-1)
  486.                                                                   temp=23;
  487.                                                                   break;
  488.                                            case 4:
  489.                                   temp=Read1302(DS1302_WEEK);  //读取星期数
  490.                                                                   temp=temp-1;  //星期数减1
  491.                                   down_flag=1;
  492.                                                                   if(temp==0)
  493.                                                                   temp=7;
  494.                                                                   break;
  495.                                            case 5:
  496.                                   temp=Read1302(DS1302_DAY);  //读取日数
  497.                                                                   temp=temp-1;  //日数减1
  498.                                   down_flag=1;
  499.                                                                   if(temp==0x10)
  500.                                                                           temp=0x0a;
  501.                                                                   if(temp==0x20)
  502.                                                                     temp=0x1a;
  503.                                                                   if(temp==0)
  504.                                                                   temp=0x2b;
  505.                                                                   break;
  506.                                            case 6:
  507.                                   temp=Read1302(DS1302_MONTH);  //读取月数
  508.                                                                   temp=temp-1;  //月数减1
  509.                                   down_flag=1;
  510.                                                                   if(temp==0)
  511.                                                                   temp=12;
  512.                                                                   break;
  513.                                            case 7:
  514.                                   temp=Read1302(DS1302_YEAR);  //读取年数
  515.                                                                   temp=temp-1;  //年数减1
  516.                                   down_flag=1;
  517.                                                                   if(temp==-1)
  518.                                                                   temp=0x85;
  519.                                                                   break;
  520.                                               default:break;
  521.                                          }
  522.                                          
  523.                                    while(Down==0);
  524.                                    //while(wireless_3==1);
  525.                                   }
  526. }

  527. void Setkey()//模式选择按键
  528. {
  529.                 Set=1;
  530.                 if(Set==0)//||wireless_4==1)
  531.             {
  532.            mdelay(8);
  533.            count=count+1;         //Setkey按一次,count就加1
  534.                    done=1;                         //进入调整模式
  535.            while(Set==0);
  536.            //while(wireless_4==1);
  537.                  }

  538. }

  539. void keydone()//按键功能执行
  540. {        uchar Second;
  541.                  if(flag==0)    //关闭时钟,停止计时
  542.          { Write1302(0x8e,0x00); //写入允许
  543.            temp=Read1302(0x80);
  544.            Write1302(0x80,temp|0x80);
  545.                Write1302(0x8e,0x80); //禁止写入
  546.            flag=1;
  547.          }
  548.          Setkey();                                            //扫描模式切换按键
  549.                  switch(count)
  550.                  {case 1:do                                                //count=1,调整秒
  551.                           {
  552.                    outkey();                           //扫描跳出按钮
  553.                                    Upkey();                //扫描加按钮
  554.                                    Downkey();              //扫描减按钮
  555.                                    if(up_flag==1||down_flag==1)  //数据更新,重新写入新的数据
  556.                                    {
  557.                                    Write1302(0x8e,0x00); //写入允许
  558.                                    Write1302(0x80,temp|0x80); //写入新的秒数
  559.                                    Write1302(0x8e,0x80); //禁止写入
  560.                                    up_flag=0;
  561.                                    down_flag=0;
  562.                                    }

  563.                                    hide_sec++;          //位闪计数
  564.                                    if(hide_sec>3)
  565.                                      hide_sec=0;
  566.                    show_time();         //液晶显示数据
  567.                                   }while(count==2);break;  
  568.                   case 2:do                                                //count=2,调整分
  569.                           {
  570.                                    hide_sec=0;
  571.                                    outkey();
  572.                                    Upkey();
  573.                                    Downkey();
  574.                                    if(temp>0x60)
  575.                                      temp=0;
  576.                                    if(up_flag==1||down_flag==1)
  577.                                    {
  578.                                    Write1302(0x8e,0x00); //写入允许
  579.                                    Write1302(0x82,temp); //写入新的分数
  580.                                    Write1302(0x8e,0x80); //禁止写入
  581.                                    up_flag=0;
  582.                                    down_flag=0;
  583.                                    }
  584.                                    hide_min++;
  585.                                    if(hide_min>3)
  586.                                      hide_min=0;
  587.                    show_time();
  588.                                   }while(count==3);break;
  589.                   case 3:do                                                //count=3,调整小时
  590.                           {
  591.                    hide_min=0;
  592.                                    outkey();
  593.                                    Upkey();
  594.                                    Downkey();
  595.                                    if(up_flag==1||down_flag==1)
  596.                                    {
  597.                                    Write1302(0x8e,0x00); //写入允许
  598.                                    Write1302(0x84,temp); //写入新的小时数
  599.                                    Write1302(0x8e,0x80); //禁止写入
  600.                                    up_flag=0;
  601.                                    down_flag=0;
  602.                                    }
  603.                                    hide_hour++;
  604.                                    if(hide_hour>3)
  605.                                      hide_hour=0;
  606.                    show_time();
  607.                                   }while(count==4);break;
  608.                   case 4:do                                                //count=4,调整星期
  609.                           {
  610.                    hide_hour=0;
  611.                                    outkey();
  612.                                    Upkey();
  613.                                    Downkey();
  614.                                    if(up_flag==1||down_flag==1)
  615.                                    {
  616.                                    Write1302(0x8e,0x00); //写入允许
  617.                                    Write1302(0x8a,temp); //写入新的星期数
  618.                                    Write1302(0x8e,0x80); //禁止写入
  619.                                    up_flag=0;
  620.                                    down_flag=0;
  621.                                    }
  622.                                    hide_week++;
  623.                                    if(hide_week>3)
  624.                                      hide_week=0;
  625.                    show_time();
  626.                                   }while(count==5);break;
  627.                   case 5:do                                                //count=5,调整日
  628.                           {
  629.                                    hide_week=0;
  630.                                    outkey();
  631.                                    Upkey();
  632.                                    Downkey();
  633.                                    if(up_flag==1||down_flag==1)
  634.                                    {
  635.                                    Write1302(0x8e,0x00); //写入允许
  636.                                    Write1302(0x86,temp); //写入新的日数
  637.                                    Write1302(0x8e,0x80); //禁止写入
  638.                                    up_flag=0;
  639.                                    down_flag=0;
  640.                                    }
  641.                                    hide_day++;
  642.                                    if(hide_day>3)
  643.                                      hide_day=0;
  644.                    show_time();
  645.                                   }while(count==6);break;
  646.                   case 6:do                                                //count=6,调整月
  647.                           {
  648.                    hide_day=0;
  649.                                    outkey();
  650.                                    Upkey();
  651.                                    Downkey();
  652.                                    if(up_flag==1||down_flag==1)
  653.                                    {
  654.                                    Write1302(0x8e,0x00); //写入允许
  655.                                    Write1302(0x88,temp); //写入新的月数
  656.                                    Write1302(0x8e,0x80); //禁止写入
  657.                                    up_flag=0;
  658.                                    down_flag=0;
  659.                                    }
  660.                                    hide_month++;
  661.                                    if(hide_month>3)
  662.                                      hide_month=0;
  663.                    show_time();
  664.                                   }while(count==7);break;
  665.                   case 7:do                                                //count=7,调整年
  666.                           {
  667.                    hide_month=0;
  668.                                    outkey();
  669.                                    Upkey();
  670.                                    Downkey();
  671.                                    if(up_flag==1||down_flag==1)
  672.                                    {
  673.                                    Write1302(0x8e,0x00); //写入允许
  674.                                    Write1302(0x8c,temp); //写入新的年数
  675.                                    Write1302(0x8e,0x80); //禁止写入
  676.                                    up_flag=0;
  677.                                    down_flag=0;
  678.                                    }
  679.                                    hide_year++;
  680.                                    if(hide_year>3)
  681.                                      hide_year=0;
  682.                    show_time();
  683.                                   }while(count==8);break;
  684.                   case 8: count=0;hide_year=0;  //count8, 跳出调整模式,返回默认显示状态
  685.                       Second=Read1302(DS1302_SECOND);
  686.                   Write1302(0x8e,0x00); //写入允许
  687.                       Write1302(0x80,Second&0x7f);
  688.                       Write1302(0x8E,0x80);          //禁止写入
  689.                                   done=0;
  690.                   break; //count=7,开启中断,标志位置0并退出
  691.                   default:break;

  692.                  }

  693. }


  694. void show_time()   //液晶显示程序
  695. {
  696.   DS1302_GetTime(&CurrentTime);  //获取时钟芯片的时间数据
  697.   TimeToStr(&CurrentTime);       //时间数据转换液晶字符
  698.   DateToStr(&CurrentTime);       //日期数据转换液晶字符
  699.   ReadTemp();                    //开启温度采集程序
  700.   temp_to_str();                 //温度数据转换成液晶字符
  701.   GotoXY(12,1);                  //液晶字符显示位置
  702.   Print(TempBuffer);             //显示温度
  703.   GotoXY(0,1);
  704.   Print(CurrentTime.TimeString); //显示时间
  705.   GotoXY(0,0);
  706.   Print(CurrentTime.DateString); //显示日期
  707.   GotoXY(15,0);
  708.   Print(week_value);             //显示星期
  709.   GotoXY(11,0);
  710.   Print("Week");                                 //在液晶上显示 字母 week
  711.   Delay1ms(400);                 //扫描延时
  712. }



  713. main()
  714. {
  715.     flag=1;                                   //时钟停止标志
  716.         LCD_Initial();                            //液晶初始化
  717.         //Init_DS18B20( ) ;              //DS18B20初始化
  718.         Initial_DS1302();                         //时钟芯片初始化
  719.         up_flag=0;
  720.         down_flag=0;
  721.         done=0;                                   //进入默认液晶显示
  722.         //wireless_1=0;
  723.         //wireless_2=0;
  724.         //wireless_3=0;
  725.         //wireless_4=0;
  726.         while(1)
  727.         {   
  728.         while(done==1)
  729.           keydone();                    //进入调整模式
  730.                 while(done==0)
  731.             {  
  732.             show_time();        //液晶显示数据
  733.             flag=0;                  
  734.                       Setkey();                        //扫描各功能键
  735.                 }
  736.         }
  737. }


复制代码

0.png
下载:
LCD1602-温显万年历.rar (58.15 KB, 下载次数: 36)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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