要求:在 Proteus 里實現兩級中斷嵌套:當K1和K2都未按下時,P1口8只 LED 呈流水燈顯示,當按一下 K 1時,產生一個低優先級外中斷0請求(跳沿觸發),進入外中斷0中斷服務程序,標號為偶數的 LED 和奇數 LED 交替閃爍10次。此時按一下 K 2時,產生一個高優先級的外中斷1請求(跳沿觸發),進入外中斷1中斷服務程序,使8只 LED 全部閃爍。當顯示5次后,再從外中斷1返回繼續執行外中斷0中斷服務程序,直至偶數和奇數 LED 交替閃爍10次完成,然后再次返回主程序,8只 LED 呈流水燈顯示。設置外中斷0為低優先級,外中斷1為高優先級
我的單片機代碼:
#include <REGX51.H>
#include "intrins.h"
#define uchar unsigned char
sbit K1=P3^2;//定義按鍵
sbit K2=P3^3;
void Delay(unsigned int i)//延時函數
{ unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}//空函數
}
void main()//主函數
{
unsigned char display [9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水燈顯示數據數組
unsigned char a;
for(;;)
{
EA=1;//總中斷允許
EX0=1;//允許外部中斷0中斷
EX1=1;//允許外部中斷1中斷
IT0=1;//選擇外部中斷0為跳沿觸發方式
IT1=1;//選擇外部中斷1為跳沿觸發方式
PX0=0;//外部中斷0為低優先級
PX1=1;//外部中斷1為高優先級
for(a=0;a<9;a++)
{
Delay(400);//延時
P1=display[a];//已定義的流水燈顯示數據送到P1口
}
}
}
void int0_isr(void) interrupt 0 using 0 //外中斷0的中斷服務函數
{
unsigned char m=0;
for(m=0;m<10;m++)//標號為偶數的LED和奇數LED交替閃爍10次
{
P1=0x55;//標號為偶數的LED燈點亮
Delay(500);//延時
P1=0xaa;//標號為奇數的LED燈點亮
Delay(500);//延時
}
}
void int1_isr(void) interrupt 2 using 1 //外中斷1的中斷服務函數
{
unsigned char n=0;
for(n=0;n<5;n++)//8位LED全亮全滅5次
{
P1=0;//8位LED全亮
Delay(500);//延時
P1=0xff;//8位LED全滅
Delay(500);//延時
}
}
基本能完成題目要求,但是最后低優先級中斷完成后無法返回主程序,求助怎么辦。 |