我有一個程序,是有關這個內容的,你看看。
//#include <STC89.H>
#include<reg52.h>
#include"LY.h"//延時函數頭文件
#include<intrins.h>
#define GPIO_LED P2
#define GPIO_DIG P0
sbit k1=P3^1;
sbit k2=P3^0;
sbit Beep = P1^5 ;
void IntConfiguration();//中斷設置子函數
void delay(unsigned int i) ;
unsigned char code DIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char p;
void main(void)
{
unsigned char n;
unsigned char m;
IntConfiguration();
p=0xff;
GPIO_LED=p;
while(1)
{
if(k1==0)//獨立按鍵k1
{
Delay10ms(1);
if(k1==0)
{
if(p==0xff)
{
p=0x00;
GPIO_LED=p;
}
else
{
p=0xff;
GPIO_LED=p;
}
while((m<50)&&(k1==0))
{
Delay10ms(1);
m++;
}
m=0;
}
}
if(k2==0)//獨立按鍵k2
{
Delay10ms(1);
if(k2==0)
{
if(p<0x80)
{
p=0x7f;
GPIO_LED=p;
Delay10ms(50);
for(n=0;n<7;n++)
{
p=_cror_(p,1);
GPIO_LED=p;
Delay10ms(50);
}
}
else
{
p=0xfe;
GPIO_LED=p;
Delay10ms(50);
for(n=0;n<7;n++)
{
p=_crol_(p,1);
GPIO_LED=p;
Delay10ms(50);
}
}
while((m<50)&&(k2==0))
{
Delay10ms(1);
m++;
}
m=0;
}
}
}
}
void delay(unsigned int i)//延時19.3us,主要用于發聲音
{
unsigned char j;
for(i; i > 0; i--)
for(j = 100; j > 0; j--);
}
void IntConfiguration()//中斷設置子函數
{
IT0=1;
EX0=1;
PX0=0;//低優先級
IT1=1;
EX1=1;
PX1=1;//高優先級
EA=1;
}
void Int0(void) interrupt 0//外部中斷0的中斷服務函數
{
unsigned int n;
n=0;
while(n<1500)
{
Beep= 1;
delay(5);
Beep= 0;
delay(5);
n++;
}
IE0=0;
}
void Int1(void) interrupt 2//外部中斷1的中斷服務函數
{
unsigned char x,i,j;
p=GPIO_LED;//保存原來的P2口值
x=25;//延時時間長短
i=0; //循環次數
j=0xe3;//點亮數碼管的最右位
while (i<16)
{
GPIO_LED=j;
GPIO_DIG=DIG_CODE[i];
Delay10ms(x);
if (j==0xff)
{
j=0xdf;
}
j=j+0x04;
i=i+1;
}
GPIO_DIG=0x00;
GPIO_LED=p;
IE1=0;
}
執行效果是:
按k3(外部中斷0)響蜂鳴器,按k4(外部中斷1),顯示數碼管。
按k3后,蜂鳴器響,馬上按K4,會立即去顯示數碼管,顯示完畢,再回來繼續響蜂鳴器,說明外部中斷1優先級高,可以打斷外部中斷0的程序。按k4顯示數碼管,再按k3,沒有反應,等顯示完畢,才響蜂鳴器,也說明外部中斷1優先級高,不會被低優先級的外部中斷0打斷程序。 |