interrupt [iv_INT1] void USB_Link_Int(void)
{
//顯示提示信息,提示進(jìn)入INT1中斷處理程序
DispScreen(scr_info_of_int1,true,null);
//延遲3秒,使得屏幕提示可以看清
//注意:延遲過程中產(chǎn)生iv_TIMER0_COMP中斷,該中斷的優(yōu)先級(jí)低于iv_INT1
Timer0_Start(0,3); //注:此函數(shù)中使用sei()開放中斷
while (Timer0_IsRun());
Timer0_Stop();
//允許INT3(ENTER)鍵按下產(chǎn)生中斷
EIMSK &= 0xf7; //禁止INT3產(chǎn)生中斷
EICRA |= 0x80;
EICRA &= 0xbf; //INT3中斷方式:下降沿產(chǎn)生異步中斷
EIFR |= 0x08; //清INT3中斷標(biāo)志
EIMSK |= 0x08; //允許INT3產(chǎn)生中斷
//禁止INT1,防止重入,專等INT3
EIMSK &= ~( 1 << INT1 ); //禁止INT1產(chǎn)生中斷
//等待INT3中斷
//注意:iv_INT3中斷的優(yōu)先級(jí)低于iv_INT1
while(true);
}
//按ENTER鍵后產(chǎn)生INT3中斷
interrupt [iv_INT3] void EnterKey_Int(void)
{
//顯示提示信息,提示進(jìn)入INT3中斷處理程序
DispScreen(scr_info_of_int3,true,null);
//延遲3秒,使得屏幕提示可以看清
//注意:延遲過程中產(chǎn)生iv_TIMER0_COMP中斷,該中斷的優(yōu)先級(jí)低于iv_INT3
Timer0_Start(0,3); //注:此函數(shù)中使用sei()開放中斷
while (Timer0_IsRun());
Timer0_Stop();
//啟動(dòng)看門狗,等待復(fù)位
watch_dog_reset_cpu();
}
實(shí)驗(yàn)結(jié)果:iv_TIMER0_COMP中斷、iv_INT3中斷如期發(fā)生。
由此可見,AVR單片機(jī)中,進(jìn)入中斷處理程序適時(shí)開放全局中斷,不僅可以使用中斷嵌套,而且高級(jí)別中斷中可響應(yīng)任何級(jí)別(包括更低級(jí)別的)的中斷。