求一份CC2530,zigbee cc2530 教程手动按键入网的例子

【cc2530开发板】_cc2530开发板图片_价格 - 淘宝网
淘宝全球购为您提供最新最全面的包括美国、日本、澳洲等海外cc2530开发板代购,cc2530开发板洋货直邮,cc2530开发板海外品牌等全球购商品
您是不是想找:Zigbee 协议栈(CC2530开发板)--中断方式查询按键
您好,欢迎来到61ic!
&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&&.&
您现在的位置:&&>>&&>>&&>>&&>>&正文
Zigbee&协议栈(CC2530开发板)--中断方式查询按键
&&&热&&&&&★★★
【字体: 】
Zigbee&协议栈(CC2530开发板)--中断方式查询按键
作者:&&&&文章来源:&&&&点击数:&&&&更新时间:&&&&
板子上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 offosal_int_disable( INTS_ALL );// Turn all LEDs offHalLedSet( HAL_LED_ALL, HAL_LED_MODE_OFF );// Check for Brown-Out resetChkReset();}else // !OB_COLD{#ifdef ZTOOL_PORTMT_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 = interruptE
/* Register the callback fucntion */pHalKeyProcessFunction =
/* 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;#endifPICTL &= ~(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_KEYHAL_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 */}/* Store the current keys for comparation next time */halKeySavedKeys =}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_0PxIFG 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 txAif ( 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 endpointtxAddr.addrMode = Addr16BtxAddr.addr.shortAddr = 0x0000; // CoordinatorZDP_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 = AddrBtxAddr.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 )
至此,就修改完成了。别忘了保存文件哦,嘿嘿。
文章录入:admin&&&&责任编辑:admin&
上一篇文章: 下一篇文章:
【】【】【】【】【】
  网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)&&&&MSP430通过spi接口控制CC2530 zigbee模块开发例子
MSP430通过spi接口控制CC2530 zigbee模块开发例子
MSP430通过spi接口控制CC2530 zigbee模块开发例子 代码示例
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行“飞比”Zigbee论坛CC2530开发板学习教程-资料共享-电子开发网资料共享
&nbsp&nbsp
当前位置: &&
“飞比”Zigbee论坛CC2530开发板学习教程
“飞比”Zigbee论坛CC2530开发板学习教程
资料格式:&&doc
作者/开发商:&&
资料大小:&&190.5 KB
资料语言:&&简体中文
资料平台:&&Windows
软件类别:&&教程
相关地址:&&
评分等级:&&★★★★★
发布人:&&&
下载次数:&&9
由于我们极力倡导&开源Zigbee&,有网友对我们的CC2530开发板项目有所误解,认为我们的开发板是用freakz而不用TI提供的ZStack。实则不然,ZStack是由Zigbee组织认证通过的&Golden unit&Zigbee平台,或者叫Zigbee中的&明星工程&。而且TI公司免费提供了一整套的开发平台及代码。我们没有理由拒绝这么优秀的平台,选择freakz作为补充,只是为了深入到协议层的学习,了解更多的&为什么&。  一个有效的学习过程,应该是由浅入深,由表面到本质。我们将ZStack的学习定位为了解&是什么&和&怎么样&的过程。从上一篇SerialApp的讲解开始,到本篇的GenericApp和后面的SampleApp, TransmitApp与SimpleApp我们都会以了解例程功能,操作与基本原理为主,深入的学习将在&奥特曼Zigbee读书日记&中进行铺开。
&(需要下载点0点)()}

我要回帖

更多关于 zigbee cc2530编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信