/*單片機(jī)中斷反應(yīng) */
//==聲明區(qū)=====================================================================================================
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint a);
bit c,b;
//==主程序區(qū)===================================================================================================
void main()
{
EA=1;//打開總中斷
EX0=1;//打開外部中斷0
IT0=0;//將中斷0設(shè)置為電平觸發(fā)
IT1=0;//將中斷0設(shè)置為電平觸發(fā)
EX1=1;//打開外部中斷1
while(1)
{
P1=0xfe;//關(guān)掉INT0里面的LED
P0=0xff;//關(guān)掉INT1里面的數(shù)碼管
P0=0x00;
P2=0xf8;
P1=0xfe;
while(1);
}
}
//=子程序區(qū)=====================================================================================================
void delay(uint a)
{
uint b,c;
for(b=a;b>0;b--)
for(c=110;c>0;c--);
}
void Int0() interrupt 0//外部中斷0的服務(wù)子程序不用在聲明區(qū)聲明的
{
uint a;
a=10;
while(a--)//這里不能用while(1)如果不是的話當(dāng)外部中斷已經(jīng)成了高電平,但無法跳出中斷服務(wù)子程序
{
P0=0x00;
P2=0xf8;
P1=0xff;
delay(1000);
P1=0x00;
delay(1000);
}
}
void Int1() interrupt 2//外部中斷1 的服務(wù)子程序也是不用在聲明區(qū)聲明的。
{
delay(1);
c=P3^3;
if(c==0)
{
delay(1);
if(c==0)
{
uint a;
a=10;
while((a--))//這里不能用while(1)如果不是的話當(dāng)外部中斷已經(jīng)成了高電平,但無法跳出中斷服務(wù)子程序
{
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);
}
}
}
}
/*程序功能是第一個(gè)LED亮的,P3^2口是低電平是進(jìn)入中斷程序,中斷實(shí)現(xiàn)功能是八個(gè)LED一起閃爍。P3^3口是低電平是進(jìn)入外部中斷1,
外部中斷1的程序?qū)崿F(xiàn)是,第一個(gè)數(shù)碼管顯示0,1,2,3,4,5.但我還沒有弄明白為什么0和1轉(zhuǎn)換的時(shí)候有一個(gè)時(shí)間間隔而大家的延時(shí)
都是一樣,但是在顯示就不一樣了。
程序?qū)崿F(xiàn)在中斷結(jié)束以后INT0的8個(gè)LED還是在點(diǎn)亮的,INT1的最后的一個(gè)數(shù)碼管還是點(diǎn)亮的,因?yàn)闆]有在主程序里面關(guān)掉LED和數(shù)碼管。
注意我的開發(fā)板P0口是接數(shù)碼管(是共陰極的)P2口是74HC138,P1口是LED*/