外部中断
:::tips
理解三道锁:EA——IENx——PxIEN
EA-总开关
IENx-中断使能功能配置,可以配置程总线 IO中断(P0、P1、P2),也可以配置程定时器等中断
PxIEN-总线中具体某一位的中断允许,如刚刚已经配置了 IEN2 即开启了 P2 总线的中断,如果我们想要开启 P20 的中断,则需要将 P2IEN 赋值为 0000 0001,即令 P2IEN = 0x01;
:::
void InitKey(){
//P01 io功能配置
P0DIR |= 0xff-2;//1111 1101 // P01为输入
P0INP |= 0xff-2;//1111 1101 // P01为上拉或下拉状态
P2INP |= 0xff-32;//1101 1111// P01为上拉状态
//中断三道锁,EA-IEN1-P0IEN
EA = 1;//打开总中断
IEN1 |= 0x20; // 0010 0000 ,IEN1的第5位为端口0中断使能位,允许P0口中断
P0IEN = 0x02;//由于按键是P01,所以将其配置成中断使能,即0000 0010
PICTL |= 1;//下降沿触发中断
P0IFG |= 0;//中断标志位初始化(清0)
}
#pragma vector = P0INT_VECTOR // 前两行硬背下来
__interrupt void P0_ISR(void) // 函数名自定义的,并且不用再开头声明了
{
if(P0IFG & 0x02){ //中断标志位有值,说明中断信号产生
P0IFG = 0; //将信号置零
Delay(100);
if(P0IFG == 0){ // P01
//中断操作
D1LED();//D1状态切换
}
P0IFG = 0;
}
}
//过按键 S1 产生外部中断改变 LED1\LED2\LED3 状态
#include <iocc2530.h>
void Delay(unsigned int tvalue);
void IoInit();
void D1LED();
void InteruptInit();
#define D1 P1_0;
void main(){
IoInit();
InteruptInit();
while(1){
}
}
void Delay(unsigned int tvalue){
while(tvalue--);
}
//初始化配置D1口为输出模式
void IoInit(){
P1DIR = 0x01;
P1_0 = 1;
}
//LED-D1控制程序
void D1LED(){
P1_0 = !P1_0;//D1 ^= 1;
}
//中断IO配置
void InteruptInit(){
P0DIR |= 0xff-2;//1111 1101 // P01为输入
P0INP |= 0xff-2;//1111 1101 // P01为上拉或下拉状态
P2INP |= 0xff-32;//1101 1111// P01为上拉状态
EA = 1;// 打开总中断
IEN1 |= 0x20; // 0010 0000 ,IEN1的第5位为端口0中断使能位,允许P0口中断
PICTL |= 0x02;//下降沿触发
P0IFG |= 0x00;//初始化中断标志位
P0IEN |= 0x02;//P01设置为中断方式
}
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(P0IFG & 0x02){
P0IFG = 0;
Delay(100);
if(P0IFG == 0){
//中断操作
D1LED();//D1状态切换
}
P0IFG = 0;
}
}
#include <iocc2530.h>
void KeyInit();
void LedGPIOInit();
void Delay();
void main(){
LedGPIOInit();//LED-P11初始化
KeyInit();
while(1){
}
}
void LedGPIOInit(){
P1SEL |= 0xff-2;//P11设定为通用IO模式 1111 1101
P1DIR |= 0x02;//P11设定为输出模式 0000 0010;
P1_1 = 1;//默认熄灭
}
void KeyInit(){
//P20的IO配置
P2SEL |= 0xff-1;//P20设定为通用IO模式 1111 1110
P2DIR |= 0x00;//P20设定为输入模式 0000 0000
P2INP |= 0x80;//P2上拉状态 1000 0000
//
EA = 1;//打开总中断
IEN2 = 0x02;//端口2中断使能,0中断禁止,1中断使能 ~~~~~~~~~~~~~~~~~~~~~~~~~
P2IEN = 0x01;//由于按键是P20,所以将其配置成中断使能,即0000 0001
PICTL |= 1;//下降沿触发
P2IFG |= 0;//中断标志位初始化(清0)
}
#pragma vector = P2INT_VECTOR
__interrupt void P2_ISR(void){
if(P2IFG & 0x01){//检测P20的中断标志位是否为1,所以要将其与0000 0001作与运算
P2IFG = 0;//中断标志位清空
Delay();//相当于按键消抖
if(P2IFG == 0){
//相当于按键消抖
P1_1 = !P1_1;
}
P2IFG = 0;
}
}
void Delay(){
unsigned int tmp = 100;
while(tmp--);
}