新手学习之编写基于DS1302的时钟产生的问题

2019-03-24 19:26发布

我在编写这个程序的时候发生了一件灵异事件,非常奇怪,不知道各位有没有遇到过   是这样的   正常工作时没问题  , 调整时间的时候我按下增加键  当到达一定数字的时候会跳回来, 比如说我从2013年增加到2018,好了之后让它正常走时的时候他就跳回到2012去了, 调整月份倒没问题,调整日的时候又发生相同的问题,怎么回事呢?我使用protues仿真的,会不会跟这个有关?我找了挺久了找不出来,请各位帮帮忙吧   代码虽长,但结构简单,望有心之人稍微看看(顺便问下,这里的代码复制过来之后只得一行行处理?tab键不好用) void keyscan()
{
 if(set==0)
 {
     delay(5);
    if(set==0)
    {
      while(!set);
      helt=1;//此标志位为是否进入调整时间模式,进入此模式后静止显示,主函数中用到
      flag++;
      if(flag==1)//stay at year
      {
      lcd_write_com(0x80+2);
      lcd_write_com(0x0f);
      }
     if(flag==2) // month
     {
      lcd_write_com(0x80+5);
      lcd_write_com(0x0f);
     }
     if(flag==3)//day
     {
      lcd_write_com(0x80+8);
      lcd_write_com(0x0f);
      }
     if(flag==4)//week
     {
       lcd_write_com(0x80+13);
       lcd_write_com(0x0f);
     }
     if(flag==5)//hour
     {
         lcd_write_com(0x80+0x40+2);
         lcd_write_com(0x0f);
     }
     if(flag==6)//minute
      {
         lcd_write_com(0x80+0x40+5);
         lcd_write_com(0x0f);
      }
      if(flag==7)//start
      {
         helt=0;
        flag=0;
        lcd_write_com(0x0c);
        write_ds1302(0x82,min/16*10+min%16);
        write_ds1302(0x84,hour/16*10+hour%16);
        write_ds1302(0x86,day/16*10+day%16);
        write_ds1302(0x88,mon/16*10+mon%16);
        write_ds1302(0x8a,week%16);
        write_ds1302(0x8c,year/16*10+year%16);
       }       
    }
 }
 if(flag!=0)
 {
      if(up==0)
      {
          delay(5);
          if(up==0)
         {
             while(!up);
             if(flag==1)
            {
                 year++;
                 if(year==100)
                       year=0;
                 write_nyr(2,year);
                 lcd_write_com(0x80+2);//显示位置重新回到调节处
             }
            if(flag==2)
            {
                  mon++;
                 if(mon==13)
                 mon=1;
                 write_nyr(5,mon);
                lcd_write_com(0x80+5);
            }
           if(flag==3)
          {
                day++;
                if(day>yearchoice(year,mon))//yearchoice(year,mon)此函数返回值是当年当月的日数
                 day=1;
                write_nyr(8,day);
                lcd_write_com(0x80+8);
            }
            if(flag==4)
           {
              week++;
             if(week>7)
                 week=1;
              write_week(week);
             lcd_write_com(0x80+13);
           }
           if(flag==5)
          {
            hour++;
            if(hour==24)
            hour=0;
           write_sfm(2,hour);
            lcd_write_com(0x80+0x40+2);
          }
         if(flag==6)
         {
             min++;
             if(min==60)
             min=1;
             write_sfm(5,min);
             lcd_write_com(0x80+0x40+5);
          }
      }
  }
  if(down==0)
  {
     。。。。。。。。。。。。
   }
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。