cc2530按键中断控制

2025-11-07 22:54:46

1、新建工程

首先新建工程,并加以简单配置,可以参考我的分享:《IAR如何建立工程》,如下为硬件电路图:

cc2530按键中断控制

2、cc2530 外部中断

查看cc2530 datasheet可以知道,2530的所有外部引脚均可以配置为中断模式,如下图所示:P0\P1\P2 中,P0.0-0.7共享一个中断地址,P1.0-1.7共享一个中断地址,P2.0-P2.3共享一个中断地址。

cc2530按键中断控制

3、PxIEN

在引脚中断功能配置时,常需要设置P0IEN,主要是开启/关闭引脚的中断功能。如下图所示,为1时开启,为0时关闭中断。

开启S1按钮中断:

P0IEN |= BIT4;

cc2530按键中断控制

4、PICTL

PICTL可以控制Px口中断触发信号:上升沿触发、下降沿触发。由于按键在未按下时处于高电平,按下后为低电平,松开后又为高电平,所以会产生下降沿触发信号,配置为下降沿触发即可:

PICTL |= BIT0;  //falling edge

5、IEN1

除了配置引脚,还需要开启端口引脚中断使能,如下所示开启PO口中断使能:

IEN1 |= BIT5; //P0 interrupt

6、PxIFG

在开启中断前需要先清除中断标志,以免误入中断造成系统混乱。

P0IFG &= ~BIT4;

7、系统中断使能

学习51都知道,在任何中断操作时,都需要开启系统中断:

EA = 1; //system interrupt open

8、中断函数书写

#pragma vector = P0INT_VECTOR

__interrupt void P0_isr(void)

{

  wg_waitUs(10);

  P0IFG &= ~BIT4;

  P0IF &= ~BIT4;

  P1_0 = ~P1_0; //led1 trigger

}

其中wg_waitUs()是延时函数,起到按键消抖作用。

9、代码框架

void wg_ledInit(void)

{

  P1DIR |= BIT0;

  P1 |= BIT0;

}

void wg_btnInit(void)

{

  P0IEN |= BIT4; // P0.4 button input

  PICTL |= BIT0;  //falling edge 

  IEN1 |= BIT5; //P0 interrupt

  P0IFG &= ~BIT4; 

  EA = 1; //system interrupt open

}

void wg_waitUs(uint16 duration)

{

  while (duration--)

  {

    asm("NOP");

    asm("NOP");

    asm("NOP");

    asm("NOP");

    asm("NOP");

    asm("NOP");

    asm("NOP");

    asm("NOP");

  }

}

void main(void)

{

  wg_ledInit();

  wg_btnInit();

  //loop 

  for(;;)

  {

     ;// 

  }

}

#pragma vector = P0INT_VECTOR

__interrupt void P0_isr(void)

{

  wg_waitUs(10);

  P0IFG &= ~BIT4;

  P0IF &= ~BIT4;

  P1_0 = ~P1_0; //led1 trigger

}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢