日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Z-Stack通过按键中断实现长按功能

發布時間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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通过按键中断实现长按功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。