按鍵的實現(xiàn)邏輯(包括長按、短按、雙擊等),在交互之中的用戶體驗尤為重要,機智云GoKit_STM32按鍵的實現(xiàn)邏輯,在我見過的按鍵模塊中算不錯的一個了!
上期我們分享了機智云串口的環(huán)形buff,相信大家在看了思維導圖之后對整個協(xié)議的結構有了很好的理解,今天我們重點分析下機智云的按鍵處理機制。
在主程序main.c中,我們看到有2個定義
keyTypedef_tsingleKey[2];
keysTypedef_tkeys;
這個就是按鍵結構體的相關定義了,我們先來看下singleKey[2],這是一個數(shù)組,類型為keyTypedef_t,我們看看具體定義:
__packed typedefstruct
{
uint8_tkeyNum;
uint32_tkeyRccPeriph;
GPIO_TypeDef *keyPort;
uint32_tkeyGpio;
gokitKeyFunction shortPress;
gokitKeyFunction longPress;
}keyTypedef_t;
結構體包括第幾個按鍵、所屬按鍵時鐘、Port、Gpio、短按回調函數(shù)與長按回調函數(shù),gokitKeyFunction是一個函數(shù)指針類型的定義,使用回調的好處就是一次性定義好,之后按下去所做的事情直接在回調函數(shù)中寫就可以了,結構比較明了。
接下來再看看keysTypedef_t的定義
__packed typedefstruct
{
uint8_tkeyNum;
keyTypedef_t*singleKey;
}keysTypedef_t;
這個比較簡單,定義了一個按鍵數(shù)量與 keyTypedef_t *類型的一個指針。然后我們看兩者怎么聯(lián)系的。
首先通過keyInitOne將按鍵0的相關信息定義到singleKey[0] 中,然后keys.keyNum++,之后將相關信息也定義到singleKey[1]中,之后將singleKey數(shù)組的指針賦值給 keys.singleKey ,之后通過keys就可以輕松調用2個按鍵的各項功能了。
在下面的keyParaInit中,實際初始化了按鍵IO的各項參數(shù),最后有一個定時器的初始化函數(shù)。timer2Init();主要初始化了定時器2,從預分頻與自動重裝初值我們判斷出定時器1ms中斷一次,那么每1ms中斷一次做什么呢?我們追蹤到定時器2的中斷函數(shù),
我們看到,中斷中只做了一件事,按鍵句柄,我們具體看
keyHandle((keysTypedef_t*)&keys),
首先是讀取按鍵值,這個比較重點,也是精髓,我們進去看看,里面會對keyCountTime進行累加10次,用來消抖,確定之后去得到按鍵真正的值
PRESS_KEY1與PRESS_KEY2定義如下
#define PRESS_KEY1 0x01
#define PRESS_KEY2 0x02
之后返回的readKey便是按鍵的值,函數(shù)返回值賦給keyPress,接下來便是一個狀態(tài)機。
具體的過程為:
開始keyState為0,第一個10ms進來,如果檢測到keyPress!=0,證明有按鍵按下,將keyState狀態(tài)更新為1,keyPrev = keyPress;并將keyPress賦值給上一次的按鍵值。下一個10ms的時候我們進去狀態(tài)1的地方執(zhí)行,分為2步,
1、如果當前獲取到的狀態(tài)與上次一樣,認為按鍵確實按下了,將狀態(tài)更新為2,同時將哪個按鍵以及按鍵按下的值賦給keyReturn,通過這個就可以明確哪個按鍵按下了。
2、如果當前獲取到的狀態(tài)與上次不一樣,認為是按鍵抖動,不進行響應。
第三個10ms來之后,進去狀態(tài)2(假如不是抖動),也是分2步
1、如果按鍵不等于上次的狀態(tài)(按下),則認為按鍵松開,認為一次按下完成,狀態(tài)清零,返回按鍵值。
2、如果狀態(tài)與上次還是一樣,則認為一直在按著按鍵,就可以做長按功能了。返回按鍵值。
如果進去長按了,則將狀態(tài)更新為3。
第四個10ms到來之后,進去狀態(tài)3,用于判斷長按之后的松手狀態(tài)。就不多說了。
之后,通過keyReturn & KEY_UP判斷短按,keyReturn & KEY_LONG判斷長按,之后通過回掉函數(shù)進去相應的函數(shù)執(zhí)行,這里的一個好處就是通過指針keys就可以調用所有的回調函數(shù)指針。
好,就先分析到這里,相信大家對按鍵部分的代碼都有一個比較詳細的了解了,但還是要一個一個分析,達到為我所用的地步,方可真正學會其中的精髓。覺得好的話可以下面點贊哦,你們的點贊是我最大的動力!
-
函數(shù)
+關注
關注
3文章
4284瀏覽量
62325 -
源代碼
+關注
關注
96文章
2943瀏覽量
66619 -
機智云
+關注
關注
2文章
573瀏覽量
26361
原文標題:Gokit3.0 STM32源代碼分析之四
文章出處:【微信號:IoTMaker,微信公眾號:機智云開發(fā)者】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論