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

              上篇笔记介绍了通用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中断标
实验原理图:
这里写图片描述
这里用到的I/O口是P1_2
实验所用到的寄存器:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

编程步骤:
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; //清中断标志
}

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值