题目要求:
外部中断每发生一次,在数码管上显示一个数字,数码管显示初始状态为灭。且中断每触发一次显示的数值增加1或减少1(INTO做加法,INT1做减法)。
/*外部中断,INT0加一,INT1减一,初始时数码管灭*/
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define KEYPORT P3
sbit INT_0=P3^2;//位定义外部中断的接口
sbit INT_1=P3^3;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管编码表0~9
int num=-1;
uchar Trg=0,Cont;
void Delay2ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 22;
j = 128;
do
{
while (--j);
} while (--i);
}
void init(void)
{
P2=0xa0;P0=0x00;P2=0x00;//关蜂鸣器
P2=0x80;P0=0xff;P2=0x00;//LED消影
}
void inter_EX()//初始化外部中断
{
EA=1;//开总中断
EX0=1;EX1=1;//开外部中断0,开外部中断1
IT0=1;IT1=1;//下降沿触发
}
void Display(int n)
{
if(n<0)
{
P2=0xc0;P0=0xff;P2=0x00;//初始时n=-1,不显示
P2=0xe0;P0=0xff;P2=0x00;
Delay2ms();
}
else
{
P2=0xc0;P0=0x40;P2=0x00;//位选,选中十位
P2=0xe0;P0=table[n/10];P2=0x00;
Delay2ms();
P2=0xc0;P0=0x80;P2=0x00;//段选选中个位
P2=0xe0;P0=table[n%10];P2=0x00;
Delay2ms();
n=0;
}
}
void ex0_inter() interrupt 0
{
EX0=0;//关中断,防止中断再次发生
num++;//显示加一
if(num>99)
num=0;
EX0=1;//开中断
}
void ex1_inter() interrupt 2
{
EX1=0;
num--;//显示减一
if(num<0)
num=99;
EX1=1;
}
void main()
{
init();
inter_EX();
while(1)
{
Display(num);
}
}
触发方式要注意一下,还有就是,显示时,初始时候是灭的,还有0的时候再减一,像这种操作,要人为规定操作。比如0-1=99;还有就是中断发生时要关上中断防止中断再次发生,可能会导致,长按加好次。