51中断嵌套诡异的结果求解

2020-02-05 08:45发布

程序如下:
#include<stc12c5a60s2.h>
#include<datatype.h>
#define uchar unsigned char
#define uint unsigned int
sbit m=P0^0;
sbit n=P0^1;  //m,n控制秒
sbit a=P0^2;
sbit b=P0^3;  //a,b控制分钟
sbit x=P0^4;
sbit y=P0^5;  //x,y控制小时
sbit zhan=P0^6;                // 控制外部中断开
sbit bo=P0^7;
sbit led=P3^0;
sbit  p33=P3^3;          //   按键改数值
sbit  p35=P3^5;                // 改数值
sbit  p36=P3^6;                  //         该数值
sbit p32=P3^2;                        //                   外部中断触发

int num,k,p,q;
unsigned char pp;
code char shuzi[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
void delay(int ms)
{
int a,b;
for(a=0;a<ms;a++)
for(b=0;b<80;b++);
}
void display(int num1)
  { int s=35;
        int i,j;
        int c,d;
        int w,e;
        i=num1%10;
        j=num1/10;
        c=q%10;
        d=q/10;
        w=p%10;
        e=p/10;
while(s--)
{       
        m=0;
        P1=shuzi[i];
        delay(2);
        m=1;
        n=0;
        P1=shuzi[j];
        delay(2);
        n=1;                        //显示秒

          
        a=0;
        P1=shuzi[c];
        delay(2);
        a=1;
        b=0;
        P1=shuzi[d];
        delay(2);
        b=1;                  //显示分钟

        x=0;
        P2=shuzi[w];
        delay(2);
        x=1;
        y=0;
        P2=shuzi[e];
        delay(2);
        y=1;                  //显示小时
       
        }                                                    
          
}
void main()
  {         
P1M1=0x00;
P1M0=0xff;
P2M1=0x00;
P2M0=0xff;
P0M1=0x00;
P0M0=0xff;
P3M1=0x00;
P3M0=0xff;
           TMOD=0x01;                         //选择定时器中断的运行方式
     TL0=(65536-46038)%256;//赋定时器的初值
         TH0=(65536-46038)/256;
         EA=1;   //中断总开关
         ET0=1;  //定时器的开关
         TR0=1;  //开启定时器中断
         PX0=1;
         PT0=0;
          
         while(1)
         {
         display(k);
         }                  
        }                         
                                     
                         
                          
                    
                                 
                               
  void T0_time() interrupt 1
{
           TH0=(65536-46038)/256;
           TL0=(65536-46038)%256;
           num++;
       if(num==20)
                   {
                                num=0;
                                led=~led;
                                k++;
                                if(k==60)
                                        {
                                                k=0;                       
                                                 q++;
                                                if(q==60)
                                                q=0;
                                        }
                           if(q==0&&k==0)
                                         {
                                          p++;
                                          if(p==24)
                                          p=0;
                                         }
                    }
           if(zhan==0)
                {
                        // EA=1;
                         EX0=1;
                         IT0=1;
                //         p32=1;
                //         if(bo==0)break;
                }
                zhan=1;                          
  }


  void waibu() interrupt 0
   {        
                   bo=1;
   while(1)
     {
                         p33=1;
                   if(p33==0){k+=1;}
                   p35=1;
                 if(p35==0){q+=1;}
                    p36=1;
                 if(p36==0){p+=1;}
                //        display(k);
               
                 if(bo==0)
                 for(pp=10;pp>0;pp--);
                 if(bo==0)
                 {
                 IE0=0;
                 break;
                 }
         }
         EX0=0;
}


要实现的功能是T0计时,然后zhan控制外部中断0的开启,p3^2触发进入外部中断0,bo按键跳出外部中断后继续t0的计数。
但是现在是跳出外部中断后计数器就被清零了,没有继续之前的计数。
弄了一晚上,不知道是怎么回事,求解呀。
希望大家帮忙。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。