/*单片机中断反应 */
//==声明区=====================================================================================================
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint a);
bit c,b;
//==主程序区===================================================================================================
void main()
{
EA=1;//打开总中断
EX0=1;//打开外部中断0
IT0=0;//将中断0设置为电平触发
IT1=0;//将中断0设置为电平触发
EX1=1;//打开外部中断1
while(1)
{
P1=0xfe;//关掉INT0里面的LED
P0=0xff;//关掉INT1里面的数码管
P0=0x00;
P2=0xf8;
P1=0xfe;
while(1);
}
}
//=子程序区=====================================================================================================
void delay(uint a)
{
uint b,c;
for(b=a;b>0;b--)
for(c=110;c>0;c--);
}
void Int0() interrupt 0//外部中断0的服务子程序不用在声明区声明的
{
uint a;
a=10;
while(a--)//这里不能用while(1)如果不是的话当外部中断已经成了高电平,但无法跳出中断服务子程序
{
P0=0x00;
P2=0xf8;
P1=0xff;
delay(1000);
P1=0x00;
delay(1000);
}
}
void Int1() interrupt 2//外部中断1 的服务子程序也是不用在声明区声明的。
{
delay(1);
c=P3^3;
if(c==0)
{
delay(1);
if(c==0)
{
uint a;
a=10;
while((a--))//这里不能用while(1)如果不是的话当外部中断已经成了高电平,但无法跳出中断服务子程序
{
P1=0xff;
P2=0xf8;
P0=0x3f;
delay(1000);
P2=0xf9;
P0=0x00;
delay(1000);
P2=0xf8;
P0=0x06;
delay(1000);
P2=0xf8;
P0=0x5b;
delay(1000);
P2=0xf8;
P0=0x4f;
delay(1000);
P2=0xf8;
P0=0x66;
delay(1000);
P2=0xf8;
P0=0x6d;
delay(1000);
}
}
}
}
/*程序功能是第一个LED亮的,P3^2口是低电平是进入中断程序,中断实现功能是八个LED一起闪烁。P3^3口是低电平是进入外部中断1,
外部中断1的程序实现是,第一个数码管显示0,1,2,3,4,5.但我还没有弄明白为什么0和1转换的时候有一个时间间隔而大家的延时
都是一样,但是在显示就不一样了。
程序实现在中断结束以后INT0的8个LED还是在点亮的,INT1的最后的一个数码管还是点亮的,因为没有在主程序里面关掉LED和数码管。
注意我的开发板P0口是接数码管(是共阴极的)P2口是74HC138,P1口是LED*/