51单片机OLED时钟和流水灯问题

51单片机用I2C驱动0.96OLED显示时钟 加上按键控制,更改年月日,开关流水灯。

流水灯正常运行,日期也可以通过按键更改,但是不进行计时。时间卡住不动了。

问题部分相关代码

/*------------------------------------------------
                    定时器0初始化
------------------------------------------------*/
void TIM0init(void)
{

  TMOD|= 0x01;//定时器0工作方式1
  TH0=0x00;    
  TL0=0x00; 
  ET1=1;
  EA=1;
    TR0=1;
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main()
{    
    unsigned char num,num1,N,Y,R,S,F,M;

  TIM0init();    //初始化定时器0

    OLED_Init();    //初始化        
    OLED_ColorTurn(0);    //0正常显示,1反色显示    
    OLED_DisplayTurn(0);//0正常显示,1屏幕反转显示
    P0=0x00;
    while(1) 
      {    
                    key();    
                
               if(flag==0)
               {
           P0=0x00;
                 }
           else if(flag==1)
                       flag1();
             else if(flag==2)         
                       flag2();                
             else if(flag==3)
                       flag3();
             else if(flag==4) 
                       flag4();     
    //后面是一些按键检测,省略
            ************************
                    //
        OLED_ShowNum(0,0,N,2,8);        //显示数字        
        OLED_ShowChinese(13,0,0,7);    //文字 年
                
        OLED_ShowNum(22,0,Y,2,8);        //显示数字        
    OLED_ShowChinese(35,0,1,7);    //文字 月
                
        OLED_ShowNum(46,0,R,2,8);        //显示数字        
    OLED_ShowChinese(59,0,2,7);    //文字 日    
                
        OLED_ShowNum(33,5,S,2,16);        //显示数字
        OLED_ShowString(50,5,":",16);   //显示字符串        
        OLED_ShowNum(57,5,F,2,16);        //显示数字
        OLED_ShowString(72,5,":",16);   //显示字符串        
        OLED_ShowNum(79,5,M,2,16);        //显示数字    
        
    OLED_ShowChinese(75,1,7,13);    //文字 星
    OLED_ShowChinese(88,1,8,13);    //文字 期
        OLED_ShowChinese(101,1,Q,13);    //文字 
        

                        
     }

   }

}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
    static unsigned int num;
 TH0=(65536-2000)/256;//重新赋值 2ms
 TL0=(65536-2000)%256;
 num++;

 if(num==500)        //大致1s
   {
    num=0;
      second++;
    if(second==60)  //秒到60,分钟加1
     {
      second=0;      
      minute++;
      if(minute==60)//分钟到60,小时加1
        {
         minute=0;
         hour++;
         if(hour==24)//小时到24,回零
          {
             hour=0;
           date++;Q++;
                if(Q==8)
                     Q=0;
           if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//月1,3,5,7,8,10,12
             {
                if(date==31)
                    {
                        date=0;
                       month++;
                        if(month==12)
                            month=0;
                            year++;
                    }                
              }
              if(month==4||month==6||month==9||month==11)//月4,6,9,11
                {
                if(date==30)
                    {
                        date=0;
                       month++;
                        if(month==12)
                            month=0;
                            year++;
                    }                
              }
                if(month==2)//月2
                {
             if(year%4==0)
           {
                        if(date==29)
                          {
                           date=0;
                           month++;
                             if(month==12)
                                 {
                                  month=0;
                                  year++;
                                 }
                          }
                     }                         
                else if(date==28)
                         {
                             date=0;
                           month++;
                             if(month==12)
                             { 
                                 month=0;
                                 year++;
                             }
                         }                
              }
            }
          }
     }
   
  }
      ssec++;
        if(ssec>=100)             //毫秒      时钟
      {
        ssec=0;
        sec++; 
        if(sec>=15)              //秒
        {
            sec=0;
            flag++;
        }
        if(flag==5)
            flag=1;
      }
}

刚学单片机,麻烦各位看看有什么问题?

void main()
{
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256; //装初值
EA=1;//开总中断
ET0=1;//开启定时器0中断
TR0=1;//启动定时器0
while(1);//程序在这里等待中断发生
}
以上是百度到的,“ET0=1;//开启定时器0中断”,开中断这里不一样,可以看看是不是这个问题。