要求:在 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);//延时
}
}
基本能完成题目要求,但是最后低优先级中断完成后无法返回主程序,求助怎么办。 |