interrupt [iv_INT1] void USB_Link_Int(void)
{
//显示提示信息,提示进入INT1中断处理程序
DispScreen(scr_info_of_int1,true,null);
//延迟3秒,使得屏幕提示可以看清
//注意:延迟过程中产生iv_TIMER0_COMP中断,该中断的优先级低于iv_INT1
Timer0_Start(0,3); //注:此函数中使用sei()开放中断
while (Timer0_IsRun());
Timer0_Stop();
//允许INT3(ENTER)键按下产生中断
EIMSK &= 0xf7; //禁止INT3产生中断
EICRA |= 0x80;
EICRA &= 0xbf; //INT3中断方式:下降沿产生异步中断
EIFR |= 0x08; //清INT3中断标志
EIMSK |= 0x08; //允许INT3产生中断
//禁止INT1,防止重入,专等INT3
EIMSK &= ~( 1 << INT1 ); //禁止INT1产生中断
//等待INT3中断
//注意:iv_INT3中断的优先级低于iv_INT1
while(true);
}
//按ENTER键后产生INT3中断
interrupt [iv_INT3] void EnterKey_Int(void)
{
//显示提示信息,提示进入INT3中断处理程序
DispScreen(scr_info_of_int3,true,null);
//延迟3秒,使得屏幕提示可以看清
//注意:延迟过程中产生iv_TIMER0_COMP中断,该中断的优先级低于iv_INT3
Timer0_Start(0,3); //注:此函数中使用sei()开放中断
while (Timer0_IsRun());
Timer0_Stop();
//启动看门狗,等待复位
watch_dog_reset_cpu();
}
实验结果:iv_TIMER0_COMP中断、iv_INT3中断如期发生。
由此可见,AVR单片机中,进入中断处理程序适时开放全局中断,不仅可以使用中断嵌套,而且高级别中断中可响应任何级别(包括更低级别的)的中断。