zigbee外部中断

今天开始学习买了好久的zigbee开发板。跟着送的教材学习,发现教材有些许错误,就是那本《zigbee实战演练》。

外部中断那个实验,教材只是简单介绍了一下寄存器设置。我看了一下cc2530的手册,写下了这个程序。

首先外部中断的设置分为这几步骤(直接上代码了):

①  P0IEN |= 0x30; //P0_4设为中断
 ②PICTL |= 0x01; //P0口下降沿触发
 ③IEN1  |= 0x20; //P0口中断允许
  ④P0IFG = 0x00; //清除状态位,中断产生,相应比特位为置位
  ⑤EA = 1; //开总中断

设置没得说,看到中断处理函数,教材就写的不是特别清楚了。

教材的中断处理函数:

#pragma vector = P0INT_VECTOR    //格式:#pragma vector = 中断向量,紧接着是中断处理程序
  __interrupt void P0_ISR(void)
 {
  Delayms(10);            //去除抖动
  LED1=~LED1;             //改变LED1状态
  P0IFG = 0;             //清中断标志
  P0IF = 0;             //清中断标志
 }
学过51单片都知道,常用51有两个外部中断,对应两个中断向量,可以分别写两个中断函数。而zigbee有18个外部中断,P0口只是其中之一,所以P0口只能写一个中断函数,那么如果把P0的每个引脚都作为外部中断,怎么管理这些中断呢,我从数据手册的中断开关图,写了下面这个函数,有可能理解有些偏颇,请大家指教。如果P0产生中断,就会进入中断函数,我们在中断函数里可以通过判断P0IFG来确定是哪个引脚产生的中断。

我写的中断处理函数:

#pragma vector = P0INT_VECTOR

__interrupt void P0_ISR(void)
{
 
  if(P0IFG >>4 & 0x01)
  {
    led2 = ~led2;
  }
 
  if(P0IFG >>5 & 0x01)
  {
    led1 = ~led1;
  }
  P0IFG = 0;
  P0IF = 0; 
}

 

你可能感兴趣的:(zigbee)