欢迎使用CC2530的按键中断

@LangZiLing

欢迎观看第一次发表博客

你好! 这是小主第一次发表博客!欢迎参观

关于CC2530的按键中断

我们对CC2530进行了一些简单的介绍,现在开始从CC2530的中断和定时器开始介绍:

  1. 中断
  2. 灯的初始化
  3. 按键初始化
  4. 找到中断源,做好中断处理函数 ;
  5. 按键中断初始化

初始化管理

LED初始化:LED_Init

void LED_Init(){
  P1SEL &= 0x03;
  P1DIR |= 0X03;
  LED1 = 0;
  LED2 = 0;
}

按键初始化:KEY_Init

void KEY_Init(){
  P1SEL &= ~0X04;
  P1DIR &= ~0X04;
  P1INP &= ~0X04;
  P2INP &= ~0X40;
}

按键中断初始化:KEY1_ISR_Init

//按键中断初始化
void KEY1_ISR_Init(){
  //使能总开关
  EA = 1;
  //使能P1端口 IEN0 IEN1 IEN2 属于字节定义的 IEN2在第四位
  IEN2 |= 0x10;
  //使能P1_2的引脚    IEN为中断名字  
  //P1端口的中断使能
  P1IEN |= 0x04;
  //设置中断触发方式  PICTL 下降沿触发
  PICTL |= 0x02;   
  
}

中断函数框架:在这里插入图片描述
根据中断函数找到P1端口的中断函数名中断函数的处理步骤:
18个中断源 == 3个寄存器
分别是IEN0、IEN1、IEN2每个寄存器6个中断源
SFRBIT(每一位可以单独定义、可以按位来操作,列如:EA = 1;)
IENO有 (从低位到高位)(PFERRIE、ADCIE(使能ADC中断)、URX0IE(使能串口0接收中断)、URX1IE(使能串口1接收中断)、ENCIE、STIE、EA(使能总中断))
IEN1有(从低位到高位)(DMAIE、T1IE、T2IE、T3IE、T4、P0IE)
SFR(字节定义)
IEN2有(从低位到高位)(RFIE、P2IE、UTX0IE、UTX1IE、P1IE、WDTIE)

/*
====================中断函数的处理=====================
|    1、检测中断 if(p1If == 1)
|    2、检测引脚触发的中断(P1IFG&0X02)
|    3、清除中断标志 P1IFG &= ~0x04   中断标志位第二位
|                    0000 0100
|    4、总中断标志清0 P1IF = 0;  总中断标志清0
=======================================================
*/
#pragma vector = P1INT_VECTOR  //中断函数  pragma vector
__interrupt void KEY1_ISR(void)
{
  if(P1IF == 1){              //检测判断中断表示是否为按下
    if(P1IFG &= 0X04){        //检测引脚是否触发中断
      LED1 = !LED1;			  //LED灯切换
    }
  }
  //清空中断标志
  P1IF = 0;
  P1IFG &= ~0X04;
}

完整代码如下

#include"ioCC2530.h"
#define LED1 P1_0 //LED灯
#define LED2 P1_1 //0000 0010
#define KEY P1_2  //P1引脚 0000 0100

void delay(int mun){
  for(int i = 0;i < mun ;i++)
    for(int j = 0;j < 720;j++);
}

void LED_Init(){//灯的初始化
  P1SEL &= 0x03;
  P1DIR |= 0X03;
  LED1 = 0;
  LED2 = 0;
}

void KEY_Init(){//按键初始化
  P1SEL &= ~0X04;  //选择通用IO
  P1DIR &= ~0X04;  //选择输入
  P1INP &= ~0X04;  //设置P1引脚为上拉和下拉
  P2INP &= ~0X40;  //通过P2的
}

//按键中断初始化
void KEY1_ISR_Init(){
  //使能总开关
  EA = 1;
  //使能P1端口 IEN0 IEN1 IEN2 属于字节定义的 IEN2在第四位
  IEN2 |= 0x10;
  //使能P1_2的引脚    IEN为中断名字  
  //P1端口的中断使能
  P1IEN |= 0x04;
  //设置中断触发方式  PICTL
  PICTL |= 0x02;   
  
}

void main(){
  LED_Init();
  KEY_Init();
  KEY1_ISR_Init();
  while (1){
  delay(200);
  LED2 = !LED2;
  }
}

/*
===========中断函数的处理==============================
|    1、检测中断 if(p1If == 1)
|    2、检测引脚触发的中断(P1IFG&0X02)
|    3、清除中断标志 P1IFG &= ~0x04   中断标志位第二位
|                    0000 0100
|    4、总中断标志清0 P1IF = 0;  总中断标志清0
=======================================================
*/

#pragma vector = P1INT_VECTOR  //中断函数  pragma vector
__interrupt void KEY1_ISR(void)
{
  if(P1IF == 1){              //检测判断中断表示是否为按下
    if(P1IFG &= 0X04){        //检测引脚是否触发中断
      LED1 = !LED1;
    }
  }
  //清空中断标志
  P1IF = 0;
  P1IFG &= ~0X04;
}

总结

第一次写博客,有很多不懂的地方,请大家多多指教,不喜勿喷,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值