在单片机开发中,我遇到了一个很奇怪的关于外部中断的问题

void button_int0 () interrupt 0 { //当函数正确时,需改正delay(大数目)为delay_stop(大数目);
uchar timp;
uint i=0;
/****
IE=0x80时,程序执行完了,但是没有办法退出中断,
当使用EA=0时,就可以退出中断了。很肯定的是,并没有重复进入中断。
*****/
//IE=0x80;
EX0=0;
EA=0;

light =1;

timp=P1;
exit_flag=off;

 # if test
    test_define();
 # endif

   //closs door



    while(P1!=0XFF);          //waiting the (button)interrupt 0 relax

# if test
     light=!light;                      // test why doesn't IE equal 0x80
     delay(20000);

# endif

    while((P1!=0xEF)&&(exit_flag==off)){       //按下P14口实现“取消”功能 并且在调用函数中没有按“取消”
        timer_selection(trace_kb(0,0,0));
        //trace_kb(0,0,0);  
    }

     LIGHT_off();            // test why doesn't IE equal 0x80

# if test
light=!light; // test why doesn't IE equal 0x80
delay(20000);
# endif

    delay_stop(22500);       //  等待松开按键,预防按键出错再次进入到中断中
    EX0=1;
    EA=1;
    return;

}

实际按键时会跳动,也就是中断口容易多次快速触发,中断程序中 用 delay 是不可取的。用while()也是不可取的,建议 重新设计按键程序。