久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2599|回復: 0
打印 上一主題 下一主題
收起左側

lcd1602溫濕萬年歷源程序

[復制鏈接]
跳轉到指定樓層
樓主
程序很好用

  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. }


復制代碼


下載:
LCD1602-溫顯萬年歷.rar (58.15 KB, 下載次數: 36)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久国产一区 | 97国产精品视频人人做人人爱 | 亚洲天堂久久新 | 久久宗合色 | 日韩成人免费av | 精品国产乱码久久久久久蜜臀 | 中文字幕成人av | 黄色av网站在线观看 | 亚洲精品视频在线看 | 成人性视频在线播放 | 56pao在线 | 欧美综合一区 | 日韩欧美成人精品 | 日本电影一区二区 | 韩日有码 | 日韩av电影院| 久久久成人网 | 超碰导航 | 手机av免费在线 | 精品亚洲一区二区三区 | 成人午夜在线 | 操视频网站 | 色婷婷综合久久久中字幕精品久久 | 免费成人国产 | 久久免费视频观看 | 国产偷自视频区视频 | 免费一区二区 | 91社区在线观看播放 | 久久av一区二区 | www.久久久.com | 久久精品二区 | 污视频免费在线观看 | 国产一区二区观看 | 亚洲美女在线视频 | 精品亚洲一区二区三区四区五区高 | 中文字幕专区 | 欧美激情五月 | 夜久久 | 欧美视频一区二区三区 | 日韩精品一区二区三区在线观看 | 一级毛片免费完整视频 |