欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Zigbee-cc2530笔记---按键与外部中断

程序员文章站 2022-06-09 16:47:24
...
              上篇笔记介绍了通用I/o的设置,这次来介绍下外部中断功能。

通用 I/O引脚设置为输入后,可以用于产生中断。中断可以设置在外部信号的上升或下降沿触发。 P0、 P1
或P2端口都有中断使能位,对位于IENl-2寄存器内的端口所有的位都是公共的,如下:
� IENI.P0IE: P0中断使能
� IEN2.PIIE: P1中断使能
� IEN2.P2IE: P2中断使能
除了这些公共中断使能之外, 每个端口的位都有位于SFR寄存器P0IEN、 P1IEN和P2IEN的单独的中断使
能。即使配置为外设I/O或通用输出的I/O引脚使能时都有中断产生
当中断条件发生在 I/O引脚之一上面, P0-P2中断标志寄存器 P0IFG、 P1IFG或P2IFG中相应的中断状态
标志将设置为1。不管引脚是否设置了它的中断使能位,中断状态标志都被设置。当中断已经执行,中断状态
标志被清除,该标志写入0。 这个标志必须在清除CPU端口中断标志( PxIF)之前被清除。
用于中断的SFR寄存器描述在下一节。寄存器总结如下:
P0IEN: P0中断使能
P1IEN: P1中断使能
P2IEN: P2中断使能
PICTL: P0、 P1和P2触发沿设置
P0FG: P0中断标志
P1IFG: P1中断标志
P2IFG: P2中断标
实验原理图:
Zigbee-cc2530笔记---按键与外部中断
这里用到的I/O口是P1_2
实验所用到的寄存器:
Zigbee-cc2530笔记---按键与外部中断
Zigbee-cc2530笔记---按键与外部中断
Zigbee-cc2530笔记---按键与外部中断
Zigbee-cc2530笔记---按键与外部中断
Zigbee-cc2530笔记---按键与外部中断

编程步骤:
1.配置P1_2I/O的状态
void Key_init()
{
P1SEL &= ~0X04; // 00000100 设置 P1.2 为通用 IO 口
P1DIR &= ~0X04; // 00000100 设置 P1.2 为输入模式
P1INP |= 0x04; //上拉

}
2.配置P1_2的中断寄存器
void Interrupt_Init()
{

  P1INP &= ~0x04; //上拉  0000 0100
  P1IEN |= 0X04; //P1.2 设置为中断方式
  PICTL |= 0X01; //下降沿触发
  EA = 1;
  IEN2 |= 0X10; // 端口 1 输入进行中断使能
  P1IFG |= 0x00; //初始化中断标志位

}
3.按键消抖处理与键值的读取
uchar Key_Scan()
{
if(Key == 0) //低电平有效
{
Delayms(10);
if(Key==0)
{ //有按键按下
do
{
while(!Key); //松手检测
Delayms(100);
}while(!Key);
return (1);
}
}
return(0);
}
4.清除中断标志位
void Interrupt_CleanFlag()
{
P1IFG = 0; //清中断标志
P1IF = 0; //清中断标
}
5.main函数(编写中断服务程序)

include

include”Key.h”

include”leds.h”

uchar KeyTouchtimes=0;

void main()
{
// uchar KeyValue=0;

Interrupt_Init();

// Key_init();
LEDxInit(LED0);
LEDxInit(LED1);
LEDxSet( LED0, OFF);
LEDxSet( LED1, OFF);

while(1)
{
  //    KeyValue=Key_Scan(); 
 if(KeyTouchtimes==2)
  {
        while(1)
        {
LEDxSet( LED0, OFF);
    LEDxSet( LED1, ON );
    Delayms(1000);

    LEDxSet( LED0, ON);
    LEDxSet( LED1, OFF );
    Delayms(1000);
        }
}   

}

}

//中断服务程序的编写

pragma vector = P1INT_VECTOR

__interrupt void P1_ISR(void)
{
Delayms(10); //去除抖动
do
{
while(!Key); //松手检测
Delayms(10);
while(!Key); //松手检测
Delayms(10);
}while(!Key); //双重松手检测,去抖动
Interrupt_CleanFlag();
if (KeyTouchtimes >= 4)
KeyTouchtimes = 1;
else
KeyTouchtimes ++; // 按键次数加 1
P1IF = 0; //清中断标志
}