/*單片機中斷反應 */
//==聲明區=====================================================================================================
#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*/