|
我有一個程序,是有關(guān)這個內(nèi)容的,你看看。
//#include <STC89.H>
#include<reg52.h>
#include"LY.h"//延時函數(shù)頭文件
#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();//中斷設(shè)置子函數(shù)
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,主要用于發(fā)聲音
{
unsigned char j;
for(i; i > 0; i--)
for(j = 100; j > 0; j--);
}
void IntConfiguration()//中斷設(shè)置子函數(shù)
{
IT0=1;
EX0=1;
PX0=0;//低優(yōu)先級
IT1=1;
EX1=1;
PX1=1;//高優(yōu)先級
EA=1;
}
void Int0(void) interrupt 0//外部中斷0的中斷服務(wù)函數(shù)
{
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的中斷服務(wù)函數(shù)
{
unsigned char x,i,j;
p=GPIO_LED;//保存原來的P2口值
x=25;//延時時間長短
i=0; //循環(huán)次數(shù)
j=0xe3;//點亮數(shù)碼管的最右位
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;
}
執(zhí)行效果是:
按k3(外部中斷0)響蜂鳴器,按k4(外部中斷1),顯示數(shù)碼管。
按k3后,蜂鳴器響,馬上按K4,會立即去顯示數(shù)碼管,顯示完畢,再回來繼續(xù)響蜂鳴器,說明外部中斷1優(yōu)先級高,可以打斷外部中斷0的程序。按k4顯示數(shù)碼管,再按k3,沒有反應(yīng),等顯示完畢,才響蜂鳴器,也說明外部中斷1優(yōu)先級高,不會被低優(yōu)先級的外部中斷0打斷程序。 |
|