代码:
#include "reg52.h"
// 流水灯数组
unsigned char led[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
void delay(){
unsigned int time = 20000;
while(time--);
}
void init(){
EA = 1; // 开启总中断
EX0 = 1; // 开启外部中断0
IT0 = 1; // 设置外部中断0跳沿触发
EX1 = 1; // 开启外部中断0
IT1 = 1; // 设置外部中断1跳沿触发
PX0 = 0; // 位操作,外部中断0为低优先级,外部中断1为高优先级
PX1 = 1;
}
// 中断后执行的操作
void init0() interrupt 0{
unsigned char n;
EX0 = 0; // 关闭外部中断0
for (n = 0; n < 3; n++){
P0 = 0x0f;
delay();
P0 = 0xf0;
delay();
}
EX0 = 1; // 恢复
}
// 中断后执行的操作
void init1() interrupt 2{
unsigned char n;
EX1 = 0;
for (n = 0; n < 3; n++){
P0 = 0xff;
delay();
P0 = 0x00;
delay();
}
EX1 = 1; // 恢复
}
void main(){
unsigned char i; // 局部变量定义要放在函数里的第一行
init();
while(1){
for (i = 0; i < 8; i++){
P0 = led_code[i];
delay();
}
}
}
仿真图:
原理:
当PX0 = 0,PX1 = 1时,外部中断1的优先级比外部中断0的优先级高
当PX0 = 1,PX1 = 0时,外部中断1的优先级比外部中断0的优先级低
当PX0和PX1同为0或1时,两者的优先级相同