找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+1602+DS18B20出现光标漂移问题

[复制链接]
跳转到指定楼层
楼主
ID:235296 发表于 2018-2-11 18:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做了一个带日期显示的温度计,但是在显示时1602液晶出现光标漂移的问题,在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;                                //定义键——进入设置
  12. sbit S2=P3^1;                                //定义键——增大
  13. sbit S3=P3^2;                                //定义键——减小
  14. sbit S4=P3^3;                                //定义键——退出设置

  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液晶寄存器设置   
  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. //名称:复位DS18B20函数
  32. //---------------------------------------
  33. bit Reset(void)
  34. {
  35.         unsigned int i;
  36.    bit k;
  37.    ds18b20=0;                             //拉低DQ总线开始复位      
  38.    i=200;                                             //保持DQ低大约870uS,符合不低于48US的要求
  39.    while(i>0)                             //保持DQ低大约870uS,符合不低于48US的要求
  40.        i--;                               //保持DQ低大约870uS,符合不低于48US的要求            
  41.    ds18b20=1;                             //拉高准备接收数据   
  42.    i=18;                                            //大约80uS后
  43.    while(i>0)                                    //大约80uS后
  44.        i--;                                      //大约80uS后
  45.    k=ds18b20;                               //读出数据并保存   
  46.    i=91;                                                    //维持约400US,符合总读时隙不低于480US的要求
  47.    while(i>0)                                    //维持约400US,符合总读时隙不低于480US的要求
  48.        i--;                                      //维持约400US,符合总读时隙不低于480US的要求
  49.    return k;               //k=0为复位成功,k=1为复位失败
  50. }
  51. //---------------------------------------
  52. //名称:读一字节函数
  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次还原一个字节数据
  59.    {
  60.                 buf=buf>>1;                          //接收前,想将接收缓冲区右移
  61.                 ds18b20=0;                                 //拉低      
  62.       _nop_();                       //维持2US,符合大于1US小于15US的规范
  63.       _nop_();                       //维持2US,符合大于1US小于15US的规范
  64.       _nop_();                       //维持2US,符合大于1US小于15US的规范
  65.            _nop_();                       //维持2US,符合大于1US小于15US的规范
  66.       ds18b20=1;                                  //拉高,为读数据做准备
  67.                 _nop_();                       //维持6US,符合大于1US小于15US的规范
  68.       _nop_();                       //维持6US,符合大于1US小于15US的规范
  69.       _nop_();                       //维持6US,符合大于1US小于15US的规范
  70.            _nop_();                       //维持6US,符合大于1US小于15US的规范
  71.                 _nop_();                       //维持6US,符合大于1US小于15US的规范
  72.       _nop_();                       //维持6US,符合大于1US小于15US的规范
  73.       _nop_();                       //维持6US,符合大于1US小于15US的规范
  74.            _nop_();                       //维持6US,符合大于1US小于15US的规范
  75.                 _nop_();                       //维持6US,符合大于1US小于15US的规范
  76.       _nop_();                       //维持6US,符合大于1US小于15US的规范
  77.       _nop_();                       //维持6US,符合大于1US小于15US的规范
  78.            _nop_();                       //维持6US,符合大于1US小于15US的规范
  79.                 if(ds18b20==1) buf|=0x80;  //读出1位数据保存于buf中
  80.                 i=12;                                          //维持约52US,符合总读时隙不低于60US的要求
  81.       while(i>0)                          //维持约52US,符合总读时隙不低于60US的要求
  82.               i--;                             //维持约52US,符合总读时隙不低于60US的要求
  83.         }
  84.    return buf;             //退出的同时将接收缓冲区参数返回
  85. }

  86. //---------------------------------------
  87. //名称:写一字节函数
  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的规范
  99.          _nop_();               //维持2US,符合大于1US小于15US的规范
  100.          _nop_();               //维持2US,符合大于1US小于15US的规范
  101.                     _nop_();               //维持2US,符合大于1US小于15US的规范
  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的规范
  115.          _nop_();               //维持2US,符合大于1US的规范
  116.          _nop_();               //维持2US,符合大于1US的规范
  117.                     _nop_();               //维持2US,符合大于1US的规范
  118.       }
  119.                 dat=dat>>1;                                //写入字节右移1位
  120.         }
  121. }

  122. //---------------------------------------
  123. //名称:DS18B20温度转换函数
  124. //---------------------------------------
  125. bit Convert(void)
  126. {   
  127.         if(Reset()==0)          //复位DS18B20
  128.         {               
  129.             WriteByte(0xcc);                //写入跳过序列号命令字 Skip Rom
  130.       WriteByte(0x44);                //写入温度转换命令字 Convert T  
  131.                   return 1;            //启动温度转换成功
  132.         }
  133.         else
  134.         {         
  135.                   return 0;            //启动温度转换失败
  136.         }
  137. }

  138. //---------------------------------------
  139. //名称:转换结束处理函数
  140. //---------------------------------------
  141. void ReadFlash(void)
  142. {   
  143.         unsigned char Lsb,Msb;      
  144.    if(Reset()==0)          //复位DS18B20
  145.         {
  146.       WriteByte(0xcc);                //写入跳过序列号命令字 Skip Rom
  147.       WriteByte(0xbe);                //写入读取数据令字 Read Scratchpad
  148.       Lsb=ReadByte();                //读出第一个字节暂存于LSB
  149.       Msb=ReadByte();                //读出第二个字节暂存于MSB      
  150.                   temp1=Lsb&0x0f;                //temp1内装温度参数的小数部分
  151.       temp2=(Lsb>>4)|(Msb<<4);//temp2内装温度参数的整数部分         
  152.         }      
  153.         else
  154.         {
  155.                 temp1=0;                                        //如果复位失败,温度参数清零
  156.       temp2=0;                                        //如果复位失败,温度参数清零      
  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)                                        //液晶写数据
  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函数
  187. ********************************************/
  188. void write_sfm(uchar add,uchar dat)                           //写时分秒函数
  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)                           //写月日函数
  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)                           //写年函数
  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)                                                 //启动转换
  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');  //温度整数部分十位                              

  229.                         write_com(0xc0+11);

  230.                         write_data(temp2%10+'0');     //LCD1602_Disp(1,0,temp2%10+'0');  //温度整数部分个位

  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');  //温度小数部分

  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);                                           //设置16x2显示,5x7点阵,8位数据口
  255.         write_com(0x0c);                                           //设置开显示,不显示光标
  256.         write_com(0x06);                                        //写一个字符后地址指针加1
  257.         write_com(0x01);                                           //显示清0,数据指针清0
  258. }

  259. void init()                                                                        //初始化函数
  260. {
  261.         init_lcd();                                                                 //液晶初始化
  262.         write_com(0x80);                                                  //设置显示初始坐标
  263.         for(a=0;a<14;a++)                                                   //显示年月日初始值
  264.         {
  265.                 write_data(table0[a]);
  266.                 delay(5);
  267.         }
  268.         write_com(0x80+0x40);                                           //设置显示初始坐标
  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;                                                                          //设置定时器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;                                //定义键——进入设置
  288. sbit S2=P3^1;                                //定义键——增大
  289. sbit S3=P3^2;                                //定义键——减小
  290. sbit S4=P3^3;                                //定义键——退出设置
  291. 独立键盘已接地
  292. *************************************************/
  293. void keyscan()
  294. {
  295.         if(S1==0)
  296.         {
  297.                 delay(5);                                        //确认定义键被按下
  298.                 if(S1==0)
  299.                 {
  300.                         S1num++;                                //定义键S1按下次数记录
  301.                         while(!S1);                                //释放按键确认
  302.                         if(S1num==1)                        //S1按下一次时
  303.                         {
  304.                                 TR0=0;                                //关闭定时器
  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记录按键次数清零
  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++;                                //调整秒加1
  351.                                         if(miao==60)                //满60清零
  352.                                                 miao=0;
  353.                                         write_sfm(6,miao);                   //每调节一次送液晶显示一次
  354.                                         write_com(0x80+0x40+7);           //显示位置重新回到调节处
  355.                                 }
  356.                                 if(S1num==2)                           //S1按下两次时
  357.                                 {
  358.                                         fen++;                                        //调整分加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++;                                          //调整时加1
  367.                                         if(shi==24)
  368.                                                 shi=0;                                       
  369.                                         write_sfm(0,shi);
  370.                                                                                                                                                                 write_com(0xc0+1);
  371.                                 }
  372.                                 if(S1num==4)                                                   //星期加调整
  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)                                                                //日加调整
  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)                                                        //月加调整
  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)                                                 //年加调整
  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--;                                          //调整秒减1
  469.                                         if(miao==-1)                          //减到00后再减重新设置为59
  470.                                                 miao=59;
  471.                                         write_sfm(6,miao);
  472.                                         write_com(0x80+0x40+7);
  473.                                 }
  474.                                 if(S1num==2)
  475.                                 {
  476.                                         fen--;                                           //调整分减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--;                                                //调整时减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--;                                        //调整星期减一
  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)                                   //调整日
  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)                                           //调整月
  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)                                          //调整年
  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)                                                                   //退出设置、开启中断
  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中断服务程序
  594. {
  595.         TH0=0xdb;                                         //重装定时器初始值
  596.         TL0=0xff;
  597.         count++;                                                                  //中断次数累加
  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)                //偶数月(除二月)
  639.                                                 {
  640.                                                         if(ri==31)                                          
  641.                                                         {
  642.                                                                 ri=1;
  643.                                                                 yue++;
  644.                                                         }
  645.                                                 }
  646.                                                 else if(yue%2!=0)                         //奇数月
  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)                //偶数月(除二月)
  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)                         //奇数月
  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);                                //重新写入数据
  694.                         }
  695.                         write_sfm(3,fen);                                        //重新写入数据
  696.                 }
  697.                 write_sfm(6,miao);                                                //重新写入数据
  698.         }
  699. }



  700. /*************************************************
  701. 主函数
  702. *************************************************/
  703. void main()
  704. {
  705.         init();
  706.         while(1)
  707.         {                             
  708.             if(S1num==0)                                       
  709.                                                 {   
  710.                                                 xwd();
  711.                                                 }               
  712.                                                            
  713.                   keyscan();                                                                //不停的检测按键是否被按下
  714.         }
  715. }
复制代码



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

使用道具 举报

沙发
ID:235296 发表于 2018-2-21 02:55 | 只看该作者
已解决
回复

使用道具 举报

板凳
ID:788 发表于 2019-1-16 22:14 | 只看该作者

遇到同样的问题,请问是怎么解决的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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