自学内容网 自学内容网

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

外部中断

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

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!