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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2178|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機+1602+DS18B20出現(xiàn)光標漂移問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:235296 發(fā)表于 2018-2-11 18:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我做了一個帶日期顯示的溫度計,但是在顯示時1602液晶出現(xiàn)光標漂移的問題,在0xc0+8和9的位置。
那位幫我看看時怎么回事,初學單片機,還請多多指教。

  1. #include <AT89X52.h>
  2. #include <Intrins.h>  
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar a,count,S1num,xqnum;
  6. char yue,ri,shi,fen,miao;
  7. int nian;

  8. sbit lcdrs=P2^5;
  9. sbit lcdrw=P2^4;                             //1602
  10. sbit lcden=P2^3;

  11. sbit S1=P3^0;                                //定義鍵——進入設(shè)置
  12. sbit S2=P3^1;                                //定義鍵——增大
  13. sbit S3=P3^2;                                //定義鍵——減小
  14. sbit S4=P3^3;                                //定義鍵——退出設(shè)置

  15. sbit ds18b20=P1^7;                                 //DS18B20

  16. uchar code table0[]="2018-02-13 WED";
  17. uchar code table1[]="23:59:50  ";
  18. uchar code xingqi[][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};

  19. //---------------------------------------
  20. //1602液晶寄存器設(shè)置   
  21. //---------------------------------------         
  22. unsigned char temp1;
  23. unsigned char temp2;
  24. unsigned char code table[16]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};

  25. void delay(uint z)
  26. {
  27.         unsigned int i;
  28.     while (z--)
  29.         for (i=0;i<125;i++);
  30. }
  31. //名稱:復(fù)位DS18B20函數(shù)
  32. //---------------------------------------
  33. bit Reset(void)
  34. {
  35.         unsigned int i;
  36.    bit k;
  37.    ds18b20=0;                             //拉低DQ總線開始復(fù)位      
  38.    i=200;                                             //保持DQ低大約870uS,符合不低于48US的要求
  39.    while(i>0)                             //保持DQ低大約870uS,符合不低于48US的要求
  40.        i--;                               //保持DQ低大約870uS,符合不低于48US的要求            
  41.    ds18b20=1;                             //拉高準備接收數(shù)據(jù)   
  42.    i=18;                                            //大約80uS后
  43.    while(i>0)                                    //大約80uS后
  44.        i--;                                      //大約80uS后
  45.    k=ds18b20;                               //讀出數(shù)據(jù)并保存   
  46.    i=91;                                                    //維持約400US,符合總讀時隙不低于480US的要求
  47.    while(i>0)                                    //維持約400US,符合總讀時隙不低于480US的要求
  48.        i--;                                      //維持約400US,符合總讀時隙不低于480US的要求
  49.    return k;               //k=0為復(fù)位成功,k=1為復(fù)位失敗
  50. }
  51. //---------------------------------------
  52. //名稱:讀一字節(jié)函數(shù)
  53. //---------------------------------------
  54. unsigned char ReadByte(void)
  55. {
  56.         unsigned int i;
  57.    unsigned char j,buf=0;
  58.    for(j=0;j<8;j++)                        //接收8次還原一個字節(jié)數(shù)據(jù)
  59.    {
  60.                 buf=buf>>1;                          //接收前,想將接收緩沖區(qū)右移
  61.                 ds18b20=0;                                 //拉低      
  62.       _nop_();                       //維持2US,符合大于1US小于15US的規(guī)范
  63.       _nop_();                       //維持2US,符合大于1US小于15US的規(guī)范
  64.       _nop_();                       //維持2US,符合大于1US小于15US的規(guī)范
  65.            _nop_();                       //維持2US,符合大于1US小于15US的規(guī)范
  66.       ds18b20=1;                                  //拉高,為讀數(shù)據(jù)做準備
  67.                 _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  68.       _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  69.       _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  70.            _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  71.                 _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  72.       _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  73.       _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  74.            _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  75.                 _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  76.       _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  77.       _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  78.            _nop_();                       //維持6US,符合大于1US小于15US的規(guī)范
  79.                 if(ds18b20==1) buf|=0x80;  //讀出1位數(shù)據(jù)保存于buf中
  80.                 i=12;                                          //維持約52US,符合總讀時隙不低于60US的要求
  81.       while(i>0)                          //維持約52US,符合總讀時隙不低于60US的要求
  82.               i--;                             //維持約52US,符合總讀時隙不低于60US的要求
  83.         }
  84.    return buf;             //退出的同時將接收緩沖區(qū)參數(shù)返回
  85. }

  86. //---------------------------------------
  87. //名稱:寫一字節(jié)函數(shù)
  88. //---------------------------------------
  89. void WriteByte(unsigned char dat)
  90. {
  91.         unsigned int i;
  92.    unsigned char j;
  93.    for(j=0;j<8;j++)
  94.    {            
  95.                 if(dat&0x01)                        //如果寫1
  96.       {      
  97.                    ds18b20=0;                         //拉低      
  98.          _nop_();               //維持2US,符合大于1US小于15US的規(guī)范
  99.          _nop_();               //維持2US,符合大于1US小于15US的規(guī)范
  100.          _nop_();               //維持2US,符合大于1US小于15US的規(guī)范
  101.                     _nop_();               //維持2US,符合大于1US小于15US的規(guī)范
  102.          ds18b20=1;                          //拉高        
  103.          i=14;                                  //維持約63US,符合不低于60US的要求
  104.          while(i>0)                  //維持約63US,符合不低于60US的要求
  105.                  i--;                     //維持約63US,符合不低于60US的要求
  106.                 }
  107.       else                                                //如果寫0
  108.       {            
  109.                         ds18b20=0;                         //拉低                 
  110.          i=14;                                        //維持約63US,符合不低于60US的要求
  111.          while(i>0)                        //維持約63US,符合不低于60US的要求
  112.                  i--;                            //維持約63US,符合不低于60US的要求        
  113.          ds18b20=1;                         //拉高               
  114.          _nop_();               //維持2US,符合大于1US的規(guī)范
  115.          _nop_();               //維持2US,符合大于1US的規(guī)范
  116.          _nop_();               //維持2US,符合大于1US的規(guī)范
  117.                     _nop_();               //維持2US,符合大于1US的規(guī)范
  118.       }
  119.                 dat=dat>>1;                                //寫入字節(jié)右移1位
  120.         }
  121. }

  122. //---------------------------------------
  123. //名稱:DS18B20溫度轉(zhuǎn)換函數(shù)
  124. //---------------------------------------
  125. bit Convert(void)
  126. {   
  127.         if(Reset()==0)          //復(fù)位DS18B20
  128.         {               
  129.             WriteByte(0xcc);                //寫入跳過序列號命令字 Skip Rom
  130.       WriteByte(0x44);                //寫入溫度轉(zhuǎn)換命令字 Convert T  
  131.                   return 1;            //啟動溫度轉(zhuǎn)換成功
  132.         }
  133.         else
  134.         {         
  135.                   return 0;            //啟動溫度轉(zhuǎn)換失敗
  136.         }
  137. }

  138. //---------------------------------------
  139. //名稱:轉(zhuǎn)換結(jié)束處理函數(shù)
  140. //---------------------------------------
  141. void ReadFlash(void)
  142. {   
  143.         unsigned char Lsb,Msb;      
  144.    if(Reset()==0)          //復(fù)位DS18B20
  145.         {
  146.       WriteByte(0xcc);                //寫入跳過序列號命令字 Skip Rom
  147.       WriteByte(0xbe);                //寫入讀取數(shù)據(jù)令字 Read Scratchpad
  148.       Lsb=ReadByte();                //讀出第一個字節(jié)暫存于LSB
  149.       Msb=ReadByte();                //讀出第二個字節(jié)暫存于MSB      
  150.                   temp1=Lsb&0x0f;                //temp1內(nèi)裝溫度參數(shù)的小數(shù)部分
  151.       temp2=(Lsb>>4)|(Msb<<4);//temp2內(nèi)裝溫度參數(shù)的整數(shù)部分         
  152.         }      
  153.         else
  154.         {
  155.                 temp1=0;                                        //如果復(fù)位失敗,溫度參數(shù)清零
  156.       temp2=0;                                        //如果復(fù)位失敗,溫度參數(shù)清零      
  157.         }
  158. }
  159. /**************************************************
  160. 1602液晶顯示器模塊
  161. sbit lcdrs=P2^5;
  162. sbit lcdrw=P2^4;
  163. sbit lcden=P2^3;
  164. *************************************************/
  165. void write_com(uchar com)                                        //液晶寫指令
  166. {
  167.         lcdrw=0;
  168.         lcdrs=0;
  169.         P0=com;
  170.         delay(5);
  171.         lcden=1;
  172.         delay(5);
  173.         lcden=0;
  174. }

  175. void write_data(uchar dat)                                        //液晶寫數(shù)據(jù)
  176. {
  177.         lcdrw=0;
  178.         lcdrs=1;
  179.         P0=dat;
  180.         delay(5);
  181.         lcden=1;
  182.         delay(5);
  183.         lcden=0;
  184. }
  185. /********************************************
  186. 年月日寫入1602函數(shù)
  187. ********************************************/
  188. void write_sfm(uchar add,uchar dat)                           //寫時分秒函數(shù)
  189. {      
  190.               uchar shi,ge;

  191.               shi=dat/10;
  192.         ge=dat%10;
  193.         write_com(0x80+0x40+add);
  194.         write_data(0x30+shi);
  195.         write_data(0x30+ge);
  196. }
  197. void write_yr(uchar add,uchar dat)                           //寫月日函數(shù)
  198. {
  199.         uchar shi,ge;
  200.         shi=dat/10;
  201.         ge=dat%10;
  202.         write_com(0x80+add);
  203.         write_data(0x30+shi);
  204.         write_data(0x30+ge);
  205. }
  206. void write_nian(uchar add,uint dat)                           //寫年函數(shù)
  207. {
  208.         uint qian,bai,shi,ge;
  209.         qian=dat/1000;
  210.         bai=dat%1000/100;
  211.         shi=dat%100/10;
  212.         ge=dat%10;
  213.         write_com(0x80+add);
  214.         write_data(0x30+qian);
  215.         write_data(0x30+bai);
  216.         write_data(0x30+shi);
  217.         write_data(0x30+ge);
  218. }
  219. void xwd()
  220. {      
  221.             
  222.      if(Convert()==1)                                                 //啟動轉(zhuǎn)換
  223.                 {            
  224.                     ReadFlash();                       //讀取溫度                           
  225.          if(temp2>99) temp2=99;                        
  226.                             if(temp1>15) temp1=0;                                                

  227.                         write_com(0xc0+10);

  228.                         write_data(temp2/10+'0');                         //LCD1602_Disp(0,0,temp2/10+'0');  //溫度整數(shù)部分十位                              

  229.                         write_com(0xc0+11);

  230.                         write_data(temp2%10+'0');     //LCD1602_Disp(1,0,temp2%10+'0');  //溫度整數(shù)部分個位

  231.                         write_com(0xc0+12);

  232.                         write_data('.');               //LCD1602_Disp(2,0,'.');  //.               

  233.                         write_com(0xc0+13);

  234.                         write_data(table[temp1]+'0');  //LCD1602_Disp(3,0,table[temp1]+'0');  //溫度小數(shù)部分

  235.                         write_com(0xc0+14);
  236.                        
  237.                         write_data(0xdf);              //LCD1602_Disp(4,0,0xdf);   //.

  238.                         write_com(0xc0+15);

  239.                         write_data(0x43);                        //LCD1602_Disp(5,0,0x43);   //C                                                                 

  240.                 }   
  241. }
  242. /***************************************************
  243. 初始化
  244. ***************************************************/
  245. void init_lcd()                                                          //液晶初始化
  246. {
  247.         lcden=0;

  248.         nian=2018;
  249.         yue=2;
  250.         ri=13;
  251.         shi=23;                                                                   //初始shi、fen、miao
  252.         fen=59;
  253.         miao=50;

  254.         write_com(0x38);                                           //設(shè)置16x2顯示,5x7點陣,8位數(shù)據(jù)口
  255.         write_com(0x0c);                                           //設(shè)置開顯示,不顯示光標
  256.         write_com(0x06);                                        //寫一個字符后地址指針加1
  257.         write_com(0x01);                                           //顯示清0,數(shù)據(jù)指針清0
  258. }

  259. void init()                                                                        //初始化函數(shù)
  260. {
  261.         init_lcd();                                                                 //液晶初始化
  262.         write_com(0x80);                                                  //設(shè)置顯示初始坐標
  263.         for(a=0;a<14;a++)                                                   //顯示年月日初始值
  264.         {
  265.                 write_data(table0[a]);
  266.                 delay(5);
  267.         }
  268.         write_com(0x80+0x40);                                           //設(shè)置顯示初始坐標
  269.         for(a=0;a<8;a++)                                                        //顯示時分秒初始值
  270.         {
  271.                 write_data(table1[a]);                                       
  272.                 delay(5);
  273.         }
  274.                
  275.                                 count=0;
  276.         xqnum=0;
  277.         S1num=0;                                                                         //初始化全局變量count

  278.         TMOD=0x01;                                                                          //設(shè)置定時器0工作模式1
  279.         TH0=0xdb;                                                  //定時器裝初始值
  280.         TL0=0xff;
  281.         EA=1;                                                                                        //開總中斷
  282.         ET0=1;                                                                                        //開定時器0中斷
  283.         TR0=1;                                                                                        //啟動定時器0
  284. }
  285. /**************************************************
  286. 獨立鍵盤
  287. sbit S1=P3^0;                                //定義鍵——進入設(shè)置
  288. sbit S2=P3^1;                                //定義鍵——增大
  289. sbit S3=P3^2;                                //定義鍵——減小
  290. sbit S4=P3^3;                                //定義鍵——退出設(shè)置
  291. 獨立鍵盤已接地
  292. *************************************************/
  293. void keyscan()
  294. {
  295.         if(S1==0)
  296.         {
  297.                 delay(5);                                        //確認定義鍵被按下
  298.                 if(S1==0)
  299.                 {
  300.                         S1num++;                                //定義鍵S1按下次數(shù)記錄
  301.                         while(!S1);                                //釋放按鍵確認
  302.                         if(S1num==1)                        //S1按下一次時
  303.                         {
  304.                                 TR0=0;                                //關(guān)閉定時器
  305.                                 write_com(0xc0+7);        //光標定位到秒位置
  306.                                 write_com(0x0f);        //光標閃爍
  307.                         }
  308.                         if(S1num==2)                         //S1按下兩次時
  309.                         {
  310.                                 write_com(0xc0+4);         //光標定位到分位置
  311.                         }
  312.                         if(S1num==3)                          //S1按下三次時
  313.                         {
  314.                                 write_com(0xc0+1);          //光標定位到時位置
  315.                         }
  316.                         if(S1num==4)                          //S1按下四次時
  317.                         {
  318.                                 write_com(0x80+13);          //光標定位到星期位置
  319.                         }
  320.                         if(S1num==5)                          //S1按下五次時
  321.                         {
  322.                                 write_com(0x80+9);          //光標定位到日位置
  323.                         }
  324.                         if(S1num==6)                          //S1按下六次時
  325.                         {
  326.                                 write_com(0x80+6);          //光標定位到月位置
  327.                         }
  328.                         if(S1num==7)                          //S1按下七次時
  329.                         {
  330.                                 write_com(0x80+3);          //光標定位到年位置
  331.                         }
  332.                         if(S1num==8)                          //S1按下八次時
  333.                         {
  334.                                 S1num=0;                          //S1記錄按鍵次數(shù)清零
  335.                                 TR0=1;                                  //開啟定時器
  336.                                 write_com(0x0c);          //取消光標閃爍
  337.                         }
  338.                 }
  339.         }
  340.         if(S1num!=0)                                           //只有定義鍵按下后S2、S3、S4才有效
  341.         {
  342.                 if(S2==0)
  343.                 {
  344.                         delay(5);                                        //防抖
  345.                         if(S2==0)                                   //確認按鍵被按下
  346.                         {
  347.                                 while(!S2);                                //釋放按鍵確認
  348.                                 if(S1num==1)                        //S1按下一次時
  349.                                 {
  350.                                         miao++;                                //調(diào)整秒加1
  351.                                         if(miao==60)                //滿60清零
  352.                                                 miao=0;
  353.                                         write_sfm(6,miao);                   //每調(diào)節(jié)一次送液晶顯示一次
  354.                                         write_com(0x80+0x40+7);           //顯示位置重新回到調(diào)節(jié)處
  355.                                 }
  356.                                 if(S1num==2)                           //S1按下兩次時
  357.                                 {
  358.                                         fen++;                                        //調(diào)整分加1
  359.                                         if(fen==60)
  360.                                                 fen=0;
  361.                                         write_sfm(3,fen);
  362.                                         write_com(0x80+0x40+4);
  363.                                 }
  364.                                 if(S1num==3)                                 //S1按下三次時
  365.                                 {
  366.                                         shi++;                                          //調(diào)整時加1
  367.                                         if(shi==24)
  368.                                                 shi=0;                                       
  369.                                         write_sfm(0,shi);
  370.                                                                                                                                                                 write_com(0xc0+1);
  371.                                 }
  372.                                 if(S1num==4)                                                   //星期加調(diào)整
  373.                                 {
  374.                                         xqnum++;
  375.                                         if(xqnum==7)
  376.                                                 xqnum=0;
  377.                                         write_com(0x80+0x0b);
  378.                                         for(a=0;a<3;a++)
  379.                                         {
  380.                                                 write_data(xingqi[xqnum][a]);
  381.                                                 delay(5);
  382.                                                                                                                                                                              

  383.                                                                                                                                                                 }
  384.                                 }
  385.                                 if(S1num==5)                                                                //日加調(diào)整
  386.                                 {
  387.                                         ri++;
  388.                                         if(yue==2)
  389.                                         {
  390.                                                 if(nian%400==0)
  391.                                                 {
  392.                                                         if(ri==30)
  393.                                                         {
  394.                                                                 ri=1;
  395.                                                         }
  396.                                                 }
  397.                                                 if(nian%400!=0)
  398.                                                 {
  399.                                                         if(ri==29)
  400.                                                         {
  401.                                                                 ri=1;
  402.                                                         }
  403.                                                 }
  404.                                         }
  405.                                         else if(yue<=7)
  406.                                         {
  407.                                                 if(yue%2==0&yue!=2)
  408.                                                 {
  409.                                                         if(ri==31)
  410.                                                         {
  411.                                                                 ri=1;
  412.                                                         }
  413.                                                 }
  414.                                                 else if(yue%2!=0&yue!=2)
  415.                                                 {
  416.                                                         if(ri==32)
  417.                                                         {
  418.                                                                 ri=1;
  419.                                                         }
  420.                                                 }
  421.                                         }
  422.                                         else if(yue>=8)
  423.                                         {
  424.                                                 if(yue%2==0)
  425.                                                 {
  426.                                                         if(ri==32)
  427.                                                         {
  428.                                                                 ri=1;
  429.                                                         }
  430.                                                 }
  431.                                                 else if(yue%2!=0)
  432.                                                 {
  433.                                                         if(ri==31)
  434.                                                         {
  435.                                                                 ri=1;
  436.                                                         }
  437.                                                 }
  438.                                         }
  439.                                         write_yr(8,ri);
  440.                                                                                                                                                                 write_com(0x80+9);
  441.                                 }
  442.                                 if(S1num==6)                                                        //月加調(diào)整
  443.                                 {
  444.                                         yue++;
  445.                                         if(yue==13)
  446.                                                 yue=1;
  447.                                         write_yr(5,yue);
  448.                                                                                                                                                                 write_com(0x80+6);
  449.                                 }                                                                                 
  450.                                 if(S1num==7)                                                 //年加調(diào)整
  451.                                 {
  452.                                         nian++;
  453.                                         if(nian==2021)
  454.                                                 nian=2018;
  455.                                         write_nian(0,nian);
  456.                                                                                                                                                                 write_com(0x80+3);
  457.                                 }
  458.                         }
  459.                 }
  460.                 if(S3==0)
  461.                 {
  462.                         delay(5);
  463.                         if(S3==0)                                                 //確認按鍵被按下
  464.                         {
  465.                                 while(!S3);
  466.                                 if(S1num==1)                                 
  467.                                 {
  468.                                         miao--;                                          //調(diào)整秒減1
  469.                                         if(miao==-1)                          //減到00后再減重新設(shè)置為59
  470.                                                 miao=59;
  471.                                         write_sfm(6,miao);
  472.                                         write_com(0x80+0x40+7);
  473.                                 }
  474.                                 if(S1num==2)
  475.                                 {
  476.                                         fen--;                                           //調(diào)整分減1
  477.                                         if(fen==-1)
  478.                                                 fen=59;
  479.                                         write_sfm(3,fen);
  480.                                         write_com(0x80+0x40+4);
  481.                                 }
  482.                                 if(S1num==3)
  483.                                 {
  484.                                         shi--;                                                //調(diào)整時減1
  485.                                         if(shi==-1)
  486.                                                 shi=23;
  487.                                         write_sfm(0,shi);
  488.                                         write_com(0x80+0x40+1);
  489.                                 }
  490.                                 if(S1num==4)
  491.                                 {
  492.                                         xqnum--;                                        //調(diào)整星期減一
  493.                                         if(xqnum==-1)
  494.                                                 xqnum=6;
  495.                                         write_com(0x80+0x0b);
  496.                                         for(a=0;a<3;a++)
  497.                                         {
  498.                                                 write_data(xingqi[xqnum][a]);
  499.                                                 delay(5);
  500.                                                       
  501.                                         }
  502.                                 }
  503.                                 if(S1num==5)                                   //調(diào)整日
  504.                                 {
  505.                                         ri--;                                                
  506.                                         if(yue==2)
  507.                                         {
  508.                                                 if(nian%400==0)
  509.                                                 {
  510.                                                         if(ri==0)
  511.                                                         {
  512.                                                                 ri=29;
  513.                                                         }
  514.                                                 }
  515.                                                 if(nian%400!=0)
  516.                                                 {
  517.                                                         if(ri==0)
  518.                                                         {
  519.                                                                 ri=28;
  520.                                                         }
  521.                                                 }
  522.                                         }
  523.                                         else if(yue<=7)                                 
  524.                                         {
  525.                                                 if(yue%2==0&yue!=2)
  526.                                                 {
  527.                                                         if(ri==0)
  528.                                                         {
  529.                                                                 ri=30;
  530.                                                         }
  531.                                                 }
  532.                                                 else if(yue%2!=0&yue!=2)
  533.                                                 {
  534.                                                         if(ri==0)
  535.                                                         {
  536.                                                                 ri=31;
  537.                                                         }
  538.                                                 }
  539.                                         }
  540.                                         else if(yue>=8)
  541.                                         {
  542.                                                 if(yue%2==0)
  543.                                                 {
  544.                                                         if(ri==0)
  545.                                                         {
  546.                                                                 ri=31;
  547.                                                         }
  548.                                                 }
  549.                                                 else if(yue%2!=0)
  550.                                                 {
  551.                                                         if(ri==0)
  552.                                                         {
  553.                                                                 ri=30;
  554.                                                         }
  555.                                                 }
  556.                                         }
  557.                                         write_yr(8,ri);
  558.                                         write_com(0x80+9);                                                                                                                                                      
  559.                                 }
  560.                                 if(S1num==6)                                           //調(diào)整月
  561.                                 {
  562.                                         yue--;
  563.                                         if(yue==0)
  564.                                                 yue=12;
  565.                                         write_yr(5,yue);
  566.                                                                                                                                                                 write_com(0x80+6);
  567.                                 }
  568.                                 if(S1num==7)                                          //調(diào)整年
  569.                                 {
  570.                                         nian--;
  571.                                         if(nian==2017)
  572.                                                 nian=2020;
  573.                                         write_nian(0,nian);
  574.                                                                                                                                                                 write_com(0x80+3);
  575.                                 }
  576.                         }
  577.                 }
  578.                 if(S4==0)                                                                   //退出設(shè)置、開啟中斷
  579.                 {
  580.                         delay(5);
  581.                         if(S4==0)
  582.                         {
  583.                                 S1num=0;
  584.                                 TR0=1;
  585.                                 write_com(0x0c);
  586.                         }
  587.                 }
  588.         }
  589. }

  590. /**************************************************
  591. 定時器0
  592. *************************************************/
  593. void timer0() interrupt 1                                         //定時器0中斷服務(wù)程序
  594. {
  595.         TH0=0xdb;                                         //重裝定時器初始值
  596.         TL0=0xff;
  597.         count++;                                                                  //中斷次數(shù)累加
  598.         if(count==200)                                                         //20次50毫秒即一秒
  599.         {
  600.                 count=0;
  601.                 miao++;
  602.                 if(miao==60)                                                  //秒加到60時分進位
  603.                 {
  604.                         miao=0;
  605.                         fen++;
  606.                         if(fen==60)                                                  //分加到60時時進位
  607.                         {
  608.                                 fen=0;
  609.                                 shi++;
  610.                                 if(shi==24)                                                //時加到24時清0
  611.                                 {
  612.                                         shi=0;
  613.                                         xqnum++;
  614.                                         ri++;

  615.                                         if(yue==2)                                        //如果是二月
  616.                                         {
  617.                                                 if(nian%400==0)                         //閏年判斷
  618.                                                 {
  619.                                                         if(ri==30)
  620.                                                         {
  621.                                                                 ri=1;
  622.                                                                 yue++;
  623.                                                                 write_yr(5,yue);
  624.                                                         }
  625.                                                 }
  626.                                                 if(nian%400!=0)                           //平年判斷
  627.                                                 {
  628.                                                         if(ri==29)
  629.                                                         {
  630.                                                                 ri=1;
  631.                                                                 yue++;
  632.                                                                 write_yr(5,yue);
  633.                                                         }
  634.                                                 }
  635.                                         }
  636.                                         else if(yue<=7&yue!=2)           //一月到七月
  637.                                         {
  638.                                                 if(yue%2==0)                //偶數(shù)月(除二月)
  639.                                                 {
  640.                                                         if(ri==31)                                          
  641.                                                         {
  642.                                                                 ri=1;
  643.                                                                 yue++;
  644.                                                         }
  645.                                                 }
  646.                                                 else if(yue%2!=0)                         //奇數(shù)月
  647.                                                 {
  648.                                                         if(ri==32)
  649.                                                         {
  650.                                                                 ri=1;
  651.                                                                 yue++;
  652.                                                         }
  653.                                                 }
  654.                                                 write_yr(5,yue);
  655.                                         }
  656.                                         else if(yue>=8)                                         //八月到12月
  657.                                         {
  658.                                                 if(yue%2==0)                //偶數(shù)月(除二月)
  659.                                                 {
  660.                                                         if(ri==32)                                          
  661.                                                         {
  662.                                                                 ri=1;
  663.                                                                 yue++;
  664.                                                                 if(yue==13)                                   //如果判斷月份為12月,則加一后重新定義月份為1
  665.                                                                 {
  666.                                                                         yue=1;
  667.                                                                         nian++;
  668.                                                                         write_nian(0,nian);
  669.                                                                 }
  670.                                                                 write_yr(5,yue);
  671.                                                         }
  672.                                                 }
  673.                                                 else if(yue%2!=0)                         //奇數(shù)月
  674.                                                 {
  675.                                                         if(ri==31)
  676.                                                         {
  677.                                                                 ri=1;
  678.                                                                 yue++;
  679.                                                                 write_yr(5,yue);
  680.                                                         }
  681.                                                 }
  682.                                         }
  683.                                         write_yr(8,ri);

  684.                                         if(xqnum==7)                                        //星期寫入
  685.                                                 xqnum=0;
  686.                                         write_com(0x80+0x0b);
  687.                                         for(a=0;a<3;a++)
  688.                                         {
  689.                                                 write_data(xingqi[xqnum][a]);
  690.                                                 delay(5);
  691.                                         }
  692.                                 }
  693.                                 write_sfm(0,shi);                                //重新寫入數(shù)據(jù)
  694.                         }
  695.                         write_sfm(3,fen);                                        //重新寫入數(shù)據(jù)
  696.                 }
  697.                 write_sfm(6,miao);                                                //重新寫入數(shù)據(jù)
  698.         }
  699. }



  700. /*************************************************
  701. 主函數(shù)
  702. *************************************************/
  703. void main()
  704. {
  705.         init();
  706.         while(1)
  707.         {                             
  708.             if(S1num==0)                                       
  709.                                                 {   
  710.                                                 xwd();
  711.                                                 }               
  712.                                                            
  713.                   keyscan();                                                                //不停的檢測按鍵是否被按下
  714.         }
  715. }
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:235296 發(fā)表于 2018-2-21 02:55 | 只看該作者
已解決
回復(fù)

使用道具 舉報

板凳
ID:788 發(fā)表于 2019-1-16 22:14 | 只看該作者

遇到同樣的問題,請問是怎么解決的
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久一区二区三区 | 亚洲综合字幕 | 成人免费一区二区三区牛牛 | 九九久视频 | 91久久| 久久久久网站 | 狠狠av| 国产成人精品一区二区三 | av在线一区二区三区 | 91在线看网站 | 国产精品国产a | 久艹网站 | 亚洲欧美一区二区三区视频 | 欧美男人天堂 | 欧美伊人久久久久久久久影院 | 涩涩视频网站在线观看 | 国产日韩欧美 | 成人在线精品 | 亚洲电影免费 | 中文福利视频 | 亚洲成人三区 | 毛片网站免费观看 | 91精品久久久久久久 | 国产男女猛烈无遮掩视频免费网站 | 99热热热热 | 亚洲精品久久久久久久久久久 | 超碰国产在线 | 精品久久久久久 | 欧美日韩一区在线 | 嫩草视频网站 | 在线观看国产视频 | 久久精品国产一区 | 精品视频一区二区三区在线观看 | 国产精品一区二区三区在线 | 欧美黄视频 | 日本一区二区三区在线观看 | 精品久久久久久久久久久久久 | 婷婷五月色综合香五月 | 日韩在线一区二区三区 | 小h片免费观看久久久久 | 日本一道本视频 |