文档章节

Zigbee 协议栈(CC2530开发板)--中断方式查询按键

DB_Terrill
 DB_Terrill
发布于 2014/09/18 16:11
字数 1550
阅读 87
收藏 1

板子上UP、DOWN、LEFT和RIGHT 四个键原先是通过AD转换来判断的,OK键和CANCEL键是直接连接I/O的.将电容C20和电子R13去掉,将R4改成10K电阻,那么RIGHT键也将是直接连接I/O了。接下来,我将通过一系列的改动,将OK、CANCEL和RIGHT三个键改成中断方式来查询其状态。

首先,要使能中断方式查询按键状态。在OnBoard.c文件,修改InitBoard()函数,如下面红色部分所示:

void InitBoard( byte level )
{
if ( level == OB_COLD )
{
// Interrupts off
osal_int_disable( INTS_ALL );
// Turn all LEDs off
HalLedSet( HAL_LED_ALL, HAL_LED_MODE_OFF );
// Check for Brown-Out reset
ChkReset();
}
else // !OB_COLD
{
#ifdef ZTOOL_PORT
MT_SysResetInd();
#endif

//*********** 自己修改 ******************************
/* Initialize Key stuff */
//OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;//DISABLE 按键中断
OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;//使能按键中断
//****************************************************

HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
}
}//end of InitBoard( byte level )

由于CANCEL、OK和RIGHT键分别连接在P0的4、5、6三个引脚,所以还需要修改P0口的初始化。CANCEL和OK两键已经初始化过了,接下来要添加RIGHT键的初始化。先要定义几个宏哦。在hal_key.c文件,添加:

//******* 自己添加 **************
/* P0.6_ADC_KEY is at P0.6 */
#define HAL_KEY_SW_8_PORT P0
#define HAL_KEY_SW_8_BIT BV(6)
#define HAL_KEY_SW_8_SEL P0SEL
#define HAL_KEY_SW_8_DIR P0DIR

/* edge interrupt */
#define HAL_KEY_SW_8_EDGEBIT BV(0)
#define HAL_KEY_SW_8_EDGE HAL_KEY_FALLING_EDGE

/*P0.6_ADC_KEY interrupts */
#define HAL_KEY_SW_8_IEN P0
#define HAL_KEY_SW_8_IENBIT BV(6)
#define HAL_KEY_SW_8_ICTL P0IEN
#define HAL_KEY_SW_8_ICTLBIT BV(6)
#define HAL_KEY_SW_8_PXIFG P0IFG

//**********************************
这几个宏定义很重要,可以参考CANCEL键和OK键的宏定义进行定义。

接下来,也是在hal_key.c文件,修改 HalKeyInit( void )函数,如下面红色部分所示:

void HalKeyInit( void )
{
/* Initialize previous key to 0 */
halKeySavedKeys = 0;

HAL_KEY_SW_6_SEL &= ~(HAL_KEY_SW_6_BIT); /* Set pin function to GPIO */
HAL_KEY_SW_6_DIR &= ~(HAL_KEY_SW_6_BIT); /* Set pin direction to Input */

HAL_KEY_SW_7_SEL &= ~(HAL_KEY_SW_7_BIT); /* Set pin function to GPIO */
HAL_KEY_SW_7_DIR &= ~(HAL_KEY_SW_7_BIT); /* Set pin direction to Input */

//********** 自己添加 *********************
//P0.6_ADC_KEY
HAL_KEY_SW_8_SEL &= ~(HAL_KEY_SW_8_BIT); /* Set pin function to GPIO */
HAL_KEY_SW_8_DIR &= ~(HAL_KEY_SW_8_BIT); /* Set pin direction to Input */
//*****************************************

// HAL_KEY_JOY_MOVE_SEL &= ~(HAL_KEY_JOY_MOVE_BIT); /* Set pin function to GPIO */
// HAL_KEY_JOY_MOVE_DIR &= ~(HAL_KEY_JOY_MOVE_BIT); /* Set pin direction to Input */


/* Initialize callback function */
pHalKeyProcessFunction = NULL;

/* Start with key is not configured */
HalKeyConfigured = FALSE;
}

另外,还要修改HalKeyConfig (bool interruptEnable, halKeyCBack_t cback)函数,如下面红色部分所示:

void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback)
{
/* Enable/Disable Interrupt or */
Hal_KeyIntEnable = interruptEnable;

/* Register the callback fucntion */
pHalKeyProcessFunction = cback;

/* Determine if interrupt is enable or not */
if (Hal_KeyIntEnable)//如果使能按键中断
{
/* Rising/Falling edge configuratinn */

PICTL &= ~(HAL_KEY_SW_6_EDGEBIT); /* Clear the edge bit */
/* For falling edge, the bit must be set. */
#if (HAL_KEY_SW_6_EDGE == HAL_KEY_FALLING_EDGE)
PICTL |= HAL_KEY_SW_6_EDGEBIT;
#endif
PICTL &= ~(HAL_KEY_SW_7_EDGEBIT); /* Clear the edge bit */
/* For falling edge, the bit must be set. */
#if (HAL_KEY_SW_7_EDGE == HAL_KEY_FALLING_EDGE)
PICTL |= HAL_KEY_SW_7_EDGEBIT;
#endif

//************** 自己添加 ****************
//P0.6_ADC_KEY
PICTL &= ~(HAL_KEY_SW_8_EDGEBIT); /* Clear the edge bit */
/* For falling edge, the bit must be set. */
#if (HAL_KEY_SW_8_EDGE == HAL_KEY_FALLING_EDGE)
PICTL |= HAL_KEY_SW_8_EDGEBIT;
#endif
//****************************************

/* Interrupt configuration:
* - Enable interrupt generation at the port
* - Enable CPU interrupt
* - Clear any pending interrupt
*/
HAL_KEY_SW_6_ICTL |= HAL_KEY_SW_6_ICTLBIT;
HAL_KEY_SW_6_IEN |= HAL_KEY_SW_6_IENBIT;
HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT);

HAL_KEY_SW_7_ICTL |= HAL_KEY_SW_7_ICTLBIT;
HAL_KEY_SW_7_IEN |= HAL_KEY_SW_7_IENBIT;
HAL_KEY_SW_7_PXIFG = ~(HAL_KEY_SW_7_BIT);

//********** 自己添加 *******************
//P0.6_ADC_KEY
HAL_KEY_SW_8_ICTL |= HAL_KEY_SW_8_ICTLBIT;//使能P0.6中断
HAL_KEY_SW_8_IEN |= HAL_KEY_SW_8_IENBIT;
HAL_KEY_SW_8_PXIFG = ~(HAL_KEY_SW_8_BIT); //清中断标记
//****************************************

/* Rising/Falling edge configuratinn */

// HAL_KEY_JOY_MOVE_ICTL &= ~(HAL_KEY_JOY_MOVE_EDGEBIT); /* Clear the edge bit */
/* For falling edge, the bit must be set. */
#if (HAL_KEY_JOY_MOVE_EDGE == HAL_KEY_FALLING_EDGE)
// HAL_KEY_JOY_MOVE_ICTL |= HAL_KEY_JOY_MOVE_EDGEBIT;
#endif


/* Interrupt configuration:
* - Enable interrupt generation at the port
* - Enable CPU interrupt
* - Clear any pending interrupt
*/
// HAL_KEY_JOY_MOVE_ICTL |= HAL_KEY_JOY_MOVE_ICTLBIT;
// HAL_KEY_JOY_MOVE_IEN |= HAL_KEY_JOY_MOVE_IENBIT;
// HAL_KEY_JOY_MOVE_PXIFG = ~(HAL_KEY_JOY_MOVE_BIT);


/* Do this only after the hal_key is configured - to work with sleep stuff */
if (HalKeyConfigured == TRUE)
{
osal_stop_timerEx( Hal_TaskID, HAL_KEY_EVENT); /* Cancel polling if active */
}
}
else /* Interrupts NOT enabled */
{
HAL_KEY_SW_6_ICTL &= ~(HAL_KEY_SW_6_ICTLBIT); /* don't generate interrupt */
HAL_KEY_SW_6_IEN &= ~(HAL_KEY_SW_6_IENBIT); /* Clear interrupt enable bit */
HAL_KEY_SW_7_ICTL &= ~(HAL_KEY_SW_7_ICTLBIT); /* don't generate interrupt */
HAL_KEY_SW_7_IEN &= ~(HAL_KEY_SW_7_IENBIT); /* Clear interrupt enable bit */

osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE); /* Kick off polling */
}

/* Key now is configured */
HalKeyConfigured = TRUE;
}

接下来,还要修改两个重要的函数:HalKeyPoll (void) 和 halProcessKeyInterrupt (void)。分别如下面红色部分所示:

void HalKeyPoll (void)
{
uint8 keys = 0;

if (!(HAL_KEY_SW_6_PORT & HAL_KEY_SW_6_BIT)) /* Key is active low *///OK键,P0.5
{
keys |= HAL_KEY_SW_6;
}
if (!(HAL_KEY_SW_7_PORT & HAL_KEY_SW_7_BIT)) /* Key is active low *///CANCEL键,P0.4
{
keys |= HAL_KEY_SW_7;
}

//***************** 自己添加 *****************
if (!(HAL_KEY_SW_8_PORT & HAL_KEY_SW_8_BIT)) /* Key is active low *///,P0.6
{
keys |= HAL_KEY_SW_8;
}
//********************************************

// if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active HIGH */
{
// keys |= halGetJoyKeyInput();//通过AD转换来判断按键
}

/* If interrupts are not enabled, previous key status and current key status
* are compared to find out if a key has changed status.
*/
if (!Hal_KeyIntEnable)//如果没有使能按键中断
{
if (keys == halKeySavedKeys)
{
/* Exit - since no keys have changed */
return;
}
/* Store the current keys for comparation next time */
halKeySavedKeys = keys;
}
else//如果使能了按键中断
{
/* Key interrupt handled here */
asm("nop");
}

/* Invoke Callback if new keys were depressed */
if (keys && (pHalKeyProcessFunction))
{
(pHalKeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);
}
}//end of HalKeyPoll (void)

void halProcessKeyInterrupt (void)
{
bool valid=FALSE;

if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT) /* Interrupt Flag has been set *///P0.5
{
HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT); /* Clear Interrupt Flag */
valid = TRUE;
}
if (HAL_KEY_SW_7_PXIFG & HAL_KEY_SW_7_BIT) /* Interrupt Flag has been set *///P0.4
{
HAL_KEY_SW_7_PXIFG = ~(HAL_KEY_SW_7_BIT); /* Clear Interrupt Flag */
valid = TRUE;
}

//********** 自己添加 ****************
if (HAL_KEY_SW_8_PXIFG & HAL_KEY_SW_8_BIT) /* Interrupt Flag has been set *///P0.4
{
HAL_KEY_SW_8_PXIFG = ~(HAL_KEY_SW_8_BIT); /* Clear Interrupt Flag */
valid = TRUE;
}
//************************************

if (HAL_KEY_JOY_MOVE_PXIFG & HAL_KEY_JOY_MOVE_BIT) /* Interrupt Flag has been set */
{
HAL_KEY_JOY_MOVE_PXIFG = ~(HAL_KEY_JOY_MOVE_BIT); /* Clear Interrupt Flag */
valid = TRUE;
}

if (valid)
{
osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE);
}
}

P0口外部中断的函数,要修改一下if语句的判断条件,否则就前功尽弃了。如下面红色部分所示:

HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
{
// if ((HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)||(HAL_KEY_SW_7_PXIFG & HAL_KEY_SW_7_BIT))
//自己修改
if ((HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)||(HAL_KEY_SW_7_PXIFG & HAL_KEY_SW_7_BIT) || (HAL_KEY_SW_8_PXIFG & HAL_KEY_SW_8_BIT))
{
halProcessKeyInterrupt();
}

/*
Clear the CPU interrupt flag for Port_0
PxIFG has to be cleared before PxIF
*/
HAL_KEY_SW_6_PXIFG = 0;
HAL_KEY_CPU_PORT_0_IF = 0;
}

最后,别忘了修改应用层的SerialApp.c文件中的SerialApp_HandleKeys( uint8 shift, uint8 keys ) 函数。因为,每一个按键要对应一个功能,那么就在这里添加功能吧。修改如下面红色部分所示:

void SerialApp_HandleKeys( uint8 shift, uint8 keys )
{
zAddrType_t txAddr;

if ( shift )
{
if ( keys & HAL_KEY_SW_1 )
{
}
if ( keys & HAL_KEY_SW_2 )
{
}
if ( keys & HAL_KEY_SW_3 )
{
}
if ( keys & HAL_KEY_SW_4 )
{
}
}
else
{
if ( keys & HAL_KEY_SW_1 )//UP 键
{
asm("nop");//自己添加
}

if ( keys & HAL_KEY_SW_2 )//RIGHT 键
{
HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

// Initiate an End Device Bind Request for the mandatory endpoint
txAddr.addrMode = Addr16Bit;
txAddr.addr.shortAddr = 0x0000; // Coordinator
ZDP_EndDeviceBindReq( &txAddr, NLME_GetShortAddr(),
SerialApp_epDesc.endPoint,
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
FALSE );
}

if ( keys & HAL_KEY_SW_3 )//DOWN 键
{
asm("nop");//自己添加
}

if ( keys & HAL_KEY_SW_4 )//LEFT 键
{
HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

// Initiate a Match Description Request (Service Discovery)
txAddr.addrMode = AddrBroadcast;
txAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
ZDP_MatchDescReq( &txAddr, NWK_BROADCAST_SHORTADDR,
SERIALAPP_PROFID,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
SERIALAPP_MAX_CLUSTERS, (cId_t *)SerialApp_ClusterList,
FALSE );
}

//*********** 自己添加 *********

if( keys & HAL_KEY_SW_6)//OK键,P0.5
{
asm("nop");
//添加按键服务程序
}

if( keys & HAL_KEY_SW_7)//CANCEL键,P0.4
{
asm("nop");
//添加按键服务程序
}

if( keys & HAL_KEY_SW_8)//P0.6_ADC_KEY 键(对应开发板上的RIGHT键)
{
asm("nop");
//添加按键服务程序
}
//*******************************
}
}//end of SerialApp_HandleKeys( uint8 shift, uint8 keys )


至此,就修改完成了。别忘了保存文件哦,嘿嘿。

本文转载自:http://www.61ic.com/Article/MSP430/ZigBee/201104/33315.html

上一篇: 免费VPN
下一篇: zigbee 802.15.4
DB_Terrill
粉丝 23
博文 143
码字总数 27267
作品 0
大连
其他
私信 提问
[ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)

1、Zigbee协议栈简介   协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通...

史迪奇2号
2018/01/01
0
0
TI 的zigbee方案选型指南

一直想写点关于zigbee方案选型的东西,TI关于芯片方案选型的guide几乎是没有的,包括e2e社区,也没有相关的指导,都是各种技术问题,再次希望给予那些后来者一些借鉴意义。走过弯路,但是幸运...

code_style
2018/04/13
0
0
[ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)

说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c...

史迪奇2号
2018/01/10
0
0
Zigbee在.Net Micro Framework系统中的应用

Zigbee是IEEE 802.15.4协议的代名词。根据这个协议规定的技术是一种短距离、低功耗的无线通信技术。这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”...

技术小美
2017/11/17
0
0
基于Android平台的无线传感器网络(ZigBee)监控系统

过去包括将来,从别人开源项目上和博客学到太多,实在是很欣赏开源的精神。这段时间,review了下做过的东西,毕业后不再做这个方向的东西了。陆续也有不少网上或者低届的同学问我讨要论文相关...

Change_Ty
2013/05/30
0
44

没有更多内容

加载失败,请刷新页面

加载更多

C 语言 二级指针的使用

#include <stdio.h>#include <stdlib.h>typedef struct node Node;struct node {int data;struct node* next;struct node* prev;};Node head;Node* insert(Node......

小张525
3分钟前
0
0
【大数据技术】——Hadoop(1)

什么是大数据 基本概念 《数据处理》 在互联网技术发展到现今阶段,大量日常、工作等事务产生的数据都已经信息化,人类产生的数据量相比以前有了爆炸式的增长,以前的传统的数据处理技术已经...

须臾之余
17分钟前
5
0
比特币从地址逆向计算私钥

区块链 区块链简介 说到比特币,就不得不提区块链。那什么是区块链呢? 区块链本质是一个数据集,只不过数据的组织采用了比较特殊的方式,就是把数据拆分为一块一块的小数据集。 为什么要进行...

trayvon
31分钟前
0
0
TypeScript……真香

写前端或者用 node 写命令行小工具一直采用的 es6 的语法,对于 TypeScript 则是秉持敬而远之的态度,毕竟团队中多推广一门语言所需要花费的精力都是让人望而却步的。所以对于 JavaScript 的...

郁也风
37分钟前
3
0
shell基本案例

1、自定义rm linux系统的rm命令太危险,一不小心就会删除掉系统文件。 写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。下面分两种情况,做...

寰宇01
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部