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; //清中断标志
}
上一篇: C++基于栈的深搜算法实现马踏棋盘
推荐阅读
-
韦东山uboot_内核_根文件系统学习笔记5.8-第005课_字符设备驱动_第008节_第008节_字符设备驱动程序之中断方式的按键驱动_编写代码
-
STM32单片机外部中断实现按键控制
-
ESP32 开发笔记(三)源码示例 5_KEY_Short_Long 使用IO中断和系统时间来检测按键时长实现长按短按
-
Linux内核学习笔记 -29 动手实践 - 中断下半部的代码分析与应用
-
Zigbee-cc2530笔记---按键与外部中断
-
linux驱动学习笔记 中断方式的按键驱动
-
STM32F407学习笔记(1)-EXTI中断事件与NVIC寄存器
-
51单片机学习笔记之中断与定时器(一)
-
Part14: 按键中断与定时器
-
外部中断与定时器中断实验