Z-Stack通过按键中断实现长按功能
生活随笔
收集整理的這篇文章主要介紹了
Z-Stack通过按键中断实现长按功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、功能介紹
項目需要實現長按功能,實現按鍵有2種方式,一種是通過中斷、一種KEY_CHANGE事件輪詢的方式。由于中斷更加的靈敏,這里選擇中斷的方式。意外的發現,如果開啟了中斷,那么按鍵就不會觸發KEY_CHANGE事件了。下面說下按鍵中斷實現長按功能的思路:
1. 按下按鍵 下降沿觸發中斷(記錄觸發時間)
2. 更改觸發方式為上升沿觸發(這樣釋放按鍵的時候就會觸發中斷了)
3. 上升沿觸發中斷(記錄觸發時間)
4. 計算時間差,滿足條件執行相應功能
5. 別忘了,將觸發方式改回來,改成下降沿觸發
二、代碼實現
我們用的是Z-Stack Home 1.2版本的協議棧。在hal_key.c中已經給出中斷處理服務函數
/**************************************************************************************************** INTERRUPT SERVICE ROUTINE***************************************************************************************************//*************************************************************************************************** @fn halKeyPort0Isr** @brief Port0 ISR** @param** @return**************************************************************************************************/ HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) {HAL_ENTER_ISR();if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_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;CLEAR_SLEEP_MODE();HAL_EXIT_ISR(); }我們只需要實現halProcessKeyInterrupt方法就行了。我這里的按鍵是P0_5。
/*************************************************************************************************** @fn halProcessKeyInterrupt** @brief p0端口中斷回到函數*** @param** @return**************************************************************************************************/ void halProcessKeyInterrupt( void ) { bool valid = FALSE; uint32 HAL_KEY_interval_time; if( HAL_KEY_PXIFG & HAL_KEY_BIT5 ) /* Interrupt Flag has been set */ { HAL_KEY_PXIFG &= ~HAL_KEY_BIT5; if(PICTL & 1) //當前下降沿觸發(按下按鍵),記錄初始時間 { Onboard_wait(50);//消除抖動 if(P0_5==1) return; HAL_KEY_starting_time = HAL_KEY_starting_time == 0 ? osal_GetSystemClock():HAL_KEY_starting_time ; }else //當前上升沿觸發(釋放按鍵),計算時間 { HAL_KEY_interval_time = osal_GetSystemClock()-HAL_KEY_starting_time; if(HAL_KEY_interval_time > HAL_KEY_FILTER_TIME)//小于HAL_KEY_FILTER_TIME ms的電平變化都會被過濾掉 { valid = TRUE; } if(valid) { osal_set_event(PersonalEmergencyDev_TaskID,Motion_RESET_TIMEOUT_EVT);//觸發事件執行自己的業務邏輯 } } PICTL ^= 1; //p0觸發方式<--取反 } }最后別忘了,開啟按鍵中斷,通過宏變量。下面是添加的一些全局變量和宏定義。
#define ISR_KEYINTERRUPT 1 #define HAL_KEY TRUE //按鍵長按5s 設置 static uint32 HAL_KEY_starting_time = 0; #define HAL_KEY_FILTER_TIME 4950總結
以上是生活随笔為你收集整理的Z-Stack通过按键中断实现长按功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++:Windows获取电脑机器指
- 下一篇: 3. OD-爆破有钥匙的exe(有验证文