博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

5、按键中断实验

Posted on 2020-02-06 13:03  兰智杰  阅读(723)  评论(0编辑  收藏  举报

中断方式——按键控制LED亮灭(外部信号输入读取)

  电路依然没变,若要使用CC2530的外部中断需要使用P0IEN、PICTL、P0IFG、INE1寄存器

  

  通用I/O 引脚设置为输入后,可以用于产生中断,中断可以设置在外部信号的上升或下降沿触发,P0、P1或P2 端口都有中断使能位,对位于IENl(端口中断使能寄存器)寄存器内的端口所有的位都是公共的

  IEN1.P0IE:P0 中断使能

  IEN2.P1IE:P1 中断使能

  IEN2.P2IE:P2 中断使能

  

  除了这些公共中断使能之外,每个端口的位都有位于SFR 寄存器P0IEN、P1IEN 和P2IEN(单独引脚中断使能寄存器)的单独的中断使能,即使配置为外设I/O 或通用输出的I/O 引脚使能时都有中断产生

  

  使能中断时候,还需要配置中断方式,这里需要用到PICTRL寄存器(配置中断方式)

  

  当中断条件发生在I/O 引脚之一上面,P0-P2 中断标志寄存器P0IFG、P1IFG 或P2IFG(中断标志寄存器)中相应的中断状态标志将设置为1,不管引脚是否设置了它的中断使能位,中断状态标志都被设置,当中断已经执行,中断状态标志被清除,该标志写入0

  

  这个标志必须在清除CPU 端口中断标志(PxIF)之前被清除,寄存器总结如下:

  P0IEN:   P0 中断使能

  P1IEN: P1 中断使能

  P2IEN: P2 中断使能

  PICTL: P0、P1 和P2 触发沿设置

  P0IFG: P0 中断标志

  P1IFG: P1 中断标志

  P2IFG: P2 中断标志

#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P1_0       // P1.0口控制LED1
#define KEY1 P0_1       // P0.1口控制S1

void DelayMS(uint msec)
{ 
    uint i,j;   
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

void InitLed(void)
{
    P1DIR |= 0x01;      //P1.0定义为输出口
    LED1 = 1;           //LED1灯上电默认为熄灭 
}

void InitKey()
{
    P0IEN |= 0x02;      // P0.1 设置为中断方式 1:中断使能
    PICTL |= 0x01;      //下降沿触发   
    IEN1 |= 0x20;       //允许P0口中断; 
    P0IFG = 0x00;       //初始化中断标志位
    EA = 1;             //打开总中断
}

#pragma vector = P0INT_VECTOR    
__interrupt void P0_ISR(void) 
{ 
    DelayMS(10);      //延时去抖
    LED1 = ~LED1;     //改变LED1状态
    P0IFG = 0;        //清中断标志 
    P0IF = 0;         //清中断标志 
} 

void main(void)
{
    InitLed();        //设置LED灯相应的IO口
    InitKey();        //设置S1相应的IO口
    while(1)
    {
    }
}