ZigBee快速入门——外部中断(Key)

发布时间:2024年01月13日

外部中断

image.png
image.png
image.png
image.png
image.png
:::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--);
}
文章来源:https://blog.csdn.net/weixin_45863921/article/details/135555820
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。