按键无线开关继电器-台灯风扇_第1页
按键无线开关继电器-台灯风扇_第2页
按键无线开关继电器-台灯风扇_第3页
按键无线开关继电器-台灯风扇_第4页
按键无线开关继电器-台灯风扇_第5页
已阅读5页,还剩18页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

按键无线开关继电器-台灯风扇通过实验掌握CC2530GPIO的配置方硬件:PC 一EB2530(底板、板、USB线 两仿真 一台灯或风扇、继电 一软件:XP、win7、8、8.1、10,IAR8.10P9P0.5口作为继电器的信号输入端,高电平继电器断开;低电平继打开..\CC2530\第5章zigbee协议栈应用与组网\11.按键无线控制台灯和LED灯继电器工程。voidSampleApp_HandleKeys(uint8shift,uint8keys{ ifkeys&HAL_KEY_SW_6 //S1{#if }if(keys&HAL_KEY_SW_1{/*TheFlashrCommandissenttoGroupThiskeytogglesthisdeviceinandoutofgroupIfthisdevicedoesn'tbelongtogroup1,thiswillnotreceivetheFlashcommandsenttogroupif(grp{//Removefromthe}{//Addtotheflash}}}void {uint8{case//继电器默认高电平触发1吸 0断if(data=={DATA_PIN }{DATA_PIN }case}}{LedState=LedState=if(AF_DataRequest(&SampleApp_Periodic_DstAddr,&SampleApp_epDesc,{if(LedState==0x31)}{//Erroroccurredinrequestto}}voidSampleApp_Init(uint8task_id{ =TRUE; //2x30don'tcare-seeuartdriver. =HAL_UART_BR_115200; =uartConfig.flowControlThreshold=SAMPLE_APP_THRESH;//2x30don'tcare-seeuartdriver. =SAMPLE_APP_RX_SZ; //2x30don'tcare-seeuartdriver. =SAMPLE_APP_TX_SZ; //2x30don'tcare-seeuartdriver. =SAMPLE_APP_IDLE; //2x30don'tcare-seeuartdriver. =TRUE; //2x30don'tcare-seeuartdriver. =rxCallBack;}staticvoidrxCallBack(uint8port,uint8event){uint8if((event&(HAL_UART_RX_FULL|HAL_UART_RX_ABOUT_FULL|{{if(SampleApp_TxBuf[00x300116{LedState=if(AF_DataRequest(&SampleApp_Periodic_DstAddr,&SampleApp_epDesc,{}}{LedState=if(AF_DataRequest(&SampleApp_Periodic_DstAddr,&SampleApp_epDesc,{}}}}}选择CoodinatorEB,到开发板A;作为协调D3D3器S1按键,会听到继电器吸合与断开,没有继电器请观察Led1灯的变化。Led1全一样。如果没有相关设备,看看Led1的变化也是可以的。一 /*中断使能和禁用#defineHAL_KEY_INTERRUPT_DISABLE #define /*Keystate-shiftornornal#defineHAL_KEY_STATE_NORMAL #defineHAL_KEY_STATE_SHIFT /*摇杆和按键定义#defineHAL_KEY_SW_1 //Joystick#defineHAL_KEY_SW_20x02 //Joystickright#defineHAL_KEY_SW_50x04 //Joystickcenter#defineHAL_KEY_SW_40x08 //Joystickleft#defineHAL_KEY_SW_30x10 //Joystickdown#defineHAL_KEY_SW_60x20 //ButtonS1ifavailable //ButtonS2if/*摇杆定义本开板没有使用摇杆,所以不用关心*/#defineHAL_KEY_UP //Joystickup#defineHAL_KEY_RIGHT //Joystickright#defineHAL_KEY_CENTER0x04 //Joystickcenter#defineHAL_KEY_LEFT //Joystickleft#defineHAL_KEY_DOWN #define #define #define /*配置按键和摇杆的中断状态寄存器*/#defineHAL_KEY_CPU_PORT_0_IFP0IF/*SW_6位P0.1#define #defineHAL_KEY_SW_6_BIT (1<<(n))BV(N)将1向左移动N位也就是将指定位置1#defineHAL_KEY_SW_6_SEL #define /*中断触发方式配置#define #define /*SW_6interrupts#define /*SW_6#defineHAL_KEY_SW_6_IENBIT BV(5)/*MaskbitforallofPort_0*/#defineHAL_KEY_SW_6_ICTL P0IEN/*SW_6位中断使能*/#defineHAL_KEY_SW_6_ICTLBIT BV(1/*P0IENP0.1enable/disablebit*/#defineHAL_KEY_SW_6_PXIFG P0IFG/*SW_6位中断标志寄存器*/#defineHAL_KEY_JOY_MOVE_PORT #defineHAL_KEY_JOY_MOVE_BIT #defineHAL_KEY_JOY_MOVE_SEL #define /*中断触发方式#define #define /*摇杆中断寄存器#defineHAL_KEY_JOY_MOVE_IEN IEN2 /*CPUinterruptmaskregister*/#defineHAL_KEY_JOY_MOVE_IENBIT BV(1)/*MaskbitforallofPort_2*/#defineHAL_KEY_JOY_MOVE_ICTL P2IEN/*PortInterruptControlregister*/#defineHAL_KEY_JOY_MOVE_ICTLBIT BV(0)/*P2IENL-P2.0<->P2.3enable/disablebit*/#defineHAL_KEY_JOY_MOVE_PXIFG P2IFG/*Interruptflagatsource*/三 mon/hal_drivers中的HalDriverInit()函数代码如下:/*KEY#if(definedHAL_KEY)&&(HAL_KEY==TRUE)voidHalKeyInit(void{/*0halKeySavedKeys=HAL_KEY_SW_6_SEL&=~(HAL_KEY_SW_6_BIT); /*设定引脚为普通IO*/HAL_KEY_SW_6_DIR&=~(HAL_KEY_SW_6_BIT); /*设定引脚为输入*/HAL_KEY_JOY_MOVE_SEL&~(HAL_KEY_JOY_MOVE_BIT*IO*/HAL_KEY_JOY_MOVE_DIR&=~(HAL_KEY_JOY_MOVE_BIT);/*设定引脚为输入*//*初始化按键回调函数为空*/ /**/HalKeyConfigured=FALSE;}halKeySaveKeys用来保存按键值;HalKeyConfigured用来标示按键是否被配置。InitBoardmain()中被调voidInitBoard(uint8level{if(level==OB_COLD{//IARdoesnotzero-outthisbytebelowthe*(uint8*)0x0=//Interruptsoff//CheckforBrown-Outreset} //{/*InitializeKeystuff}}我们可以看到默认情况下按键配置函数HalKeyConfig()的第一个参数为{/*Enable/DisableInterruptor/*Registerthecallback pHalKeyProcessFunction=cback;/*Determineifinterruptisenableornot*/if(Hal_KeyIntEnable) {/*Rising/FallingedgeconfiguratinnPICTL&= Cleartheedgebit/*Forfallingedge,thebitmustbeset.#if(HAL_KEY_SW_6_EDGE==HAL_KEY_FALLING_EDGE)PICTL|=HAL_KEY_SW_6_EDGEBIT;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); //清除中断标志位/*Rising/FallingedgeconfiguratinnHAL_KEY_JOY_MOVE_ICTL&=~(HAL_KEY_JOY_MOVE_EDGEBIT); /*Cleartheedgebit*//*Forfallingedge,thebitmustbeset.#if(HAL_KEY_JOY_MOVE_EDGE==HAL_KEY_FALLING_EDGE)HAL_KEY_JOY_MOVE_ICTL|=HAL_KEY_JOY_MOVE_EDGEBIT;/*Interrupt-Enableinterruptgenerationatthe-EnableCPU-ClearanypendingHAL_KEY_JOY_MOVE_IEN|=HAL_KEY_JOY_MOVE_IENBIT;HAL_KEY_JOY_MOVE_PXIFG=~(HAL_KEY_JOY_MOVE_BIT);/*Dothisonlyafterthehal_keyisconfigured-toworkwithsleepstuff*/if(HalKeyConfigured==TRUE){ /*Cancelpollingifactive}} /*InterruptsNOT {HAL_KEY_SW_6_ICTL&=~(HAL_KEY_SW_6_ICTLBIT);/*don'tgenerateinterruptHAL_KEY_SW_6_IEN&= /*Clearinterruptenablebitosal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,HAL_KEY_POLLING_VALUE); /*Kickoffpolling*/}/*Keynowisconfigured*/HalKeyConfigured=}轮询方式为按键的默认处理方式。在轮询方式完成后,调用函数检测到事件HAL_KEY_EVENT,则调用相应的处理函数Hal_ProcessEvent()。如果按键设置为中断方式,需要设置按键是上升沿还是下降沿触发,同时需要将按键对应的IO口配触发HAL_KEY_EVENT的事件,而是交由中断函数处理,当有按键按下时中断函数就会捕获中断,四 轮询方式配置完成后,Zstack调用函数osal_set_event(Hal_TaskID,HAL_KEY_EVENT)触发事件则调用相应的HAL层的事件处理函数Hal_ProcessEvent(),在 mon/hal_drivers.c中if(events&HAL_KEY_EVENT){#if(definedHAL_KEY)&&(HAL_KEY==/*Checkforkeys/*ifinterruptdisabled,donextpolling*/if(!Hal_KeyIntEnable){}#endif//returnevents^}HalKeyPoll(ififosal_start_timeEx()定时HAL_KEY_EVENT100msHAL_KEY_EVENTvoidHalKeyPoll(void){uint8keys=if((HAL_KEY_JOY_MOVE_PORT&HAL_KEY_JOY_MOVE_BIT)) /*摇杆按下,KeyisactiveHIGH{keys }if{if(keys=={/*Exit-sincenokeyshavechanged}/*StorethecurrentkeysforcomparationnexttimehalKeySavedKeys=}{/*中断方式下按键处理}if(!HAL_PUSH_BUTTON2()){keys|=}if(!HAL_PUSH_BUTTON1()){keys|=}/*InvokeCallbackifnewkeysweredepressed*/if(keys&&(pHalKeyProcessFunction)){}}在HalKeyPoll中对所有按键都进行了检测,首先判断是否是摇杆按下,如果是,则通过调用函数否有按键按下,如果没有,则返回不进行处理;如果有,则把按键状态赋值给全局变量时,即可用回调函数对按键进行处理。回调函数OnBoard_KeyCallback()的代码如下:voidOnBoard_KeyCallback(uint8keys,uint8state{uint8shift=(keys&HAL_KEY_SW_6)?true:if(OnBoard_SendKeys(keys,shift)!=ZSuccess{}按键在O_l()函数中调用了OB_ee()进一步处理。OB_()中将会将按键的值和按键的状态进行"打包发送到过按键的那一层。具体代码如下:uint8OnBoard_SendKeys(uint8keys,uint8state{ {//SendtheaddresstothemsgPtr=(keyChange_t*)osal_msg_allocate(sizeof(keyChange_t));if(msgPtr){msgPtr->state=}return(ZSuccess}return(ZFailure如果要使用按键必须给按键,但按键只能给一个任务层,Zstack对按键信息进行打包处理,msgPtrKEY_CHANGEstatekeys封装。然后调用osal_msg_send()将按键的到按键的应用层。按键函数代码如下:uint8RegisterForKeys(uint8task_id){//Allowonlythefirst{return(true}return(false}处理函数KEY_CHANGE事件,代码如下:{ //Intentionallyunreferencedif(events&SYS_EVENT_MSG{ while(MSGpkt{{//Receivedwhenakeyiscase voidSampleApp_HandleKeys(uint8shift,uint8keys{ if(keys&HAL_KEY_SW_6 {#if }if(keys&HAL_KEY_SW_1{/*TheFlashrCommandissenttoGroupThiskeytogglesthisdeviceinandoutofgroupIfthisdevicedoesn'tbelongtogroup1,thiswillnotreceivetheFlashcommandsenttogroupif(grp{//Removefromthe}{//Addtotheflash}}}五 中断方式按键处理(由于没有使用有的大家可自行阅读P0端口中断处理函数在 {{}CleartheCPUinterruptflagforPort_2PxIFGhast

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论