我有一个程序,是有关这个内容的,你看看。
//#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打断程序。 |