0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

機智云Gokit3.0源代碼分析之按鍵處理機制

9GxC_IoTMaker ? 來源:未知 ? 作者:李倩 ? 2018-07-13 14:57 ? 次閱讀

按鍵的實現(xiàn)邏輯(包括長按、短按、雙擊等),在交互之中的用戶體驗尤為重要,機智云GoKit_STM32按鍵的實現(xiàn)邏輯,在我見過的按鍵模塊中算不錯的一個了!

上期我們分享了機智云串口的環(huán)形buff,相信大家在看了思維導(dǎo)圖之后對整個協(xié)議的結(jié)構(gòu)有了很好的理解,今天我們重點分析下機智云的按鍵處理機制。

在主程序main.c中,我們看到有2個定義

keyTypedef_tsingleKey[2];

keysTypedef_tkeys;

這個就是按鍵結(jié)構(gòu)體的相關(guān)定義了,我們先來看下singleKey[2],這是一個數(shù)組,類型為keyTypedef_t,我們看看具體定義:

__packed typedefstruct

{

uint8_tkeyNum;

uint32_tkeyRccPeriph;

GPIO_TypeDef *keyPort;

uint32_tkeyGpio;

gokitKeyFunction shortPress;

gokitKeyFunction longPress;

}keyTypedef_t;

結(jié)構(gòu)體包括第幾個按鍵、所屬按鍵時鐘、Port、Gpio、短按回調(diào)函數(shù)與長按回調(diào)函數(shù),gokitKeyFunction是一個函數(shù)指針類型的定義,使用回調(diào)的好處就是一次性定義好,之后按下去所做的事情直接在回調(diào)函數(shù)中寫就可以了,結(jié)構(gòu)比較明了。

接下來再看看keysTypedef_t的定義

__packed typedefstruct

{

uint8_tkeyNum;

keyTypedef_t*singleKey;

}keysTypedef_t;

這個比較簡單,定義了一個按鍵數(shù)量與 keyTypedef_t *類型的一個指針。然后我們看兩者怎么聯(lián)系的。

首先通過keyInitOne將按鍵0的相關(guān)信息定義到singleKey[0] 中,然后keys.keyNum++,之后將相關(guān)信息也定義到singleKey[1]中,之后將singleKey數(shù)組的指針賦值給 keys.singleKey ,之后通過keys就可以輕松調(diào)用2個按鍵的各項功能了。

在下面的keyParaInit中,實際初始化了按鍵IO的各項參數(shù),最后有一個定時器的初始化函數(shù)。timer2Init();主要初始化了定時器2,從預(yù)分頻與自動重裝初值我們判斷出定時器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、如果當(dāng)前獲取到的狀態(tài)與上次一樣,認(rèn)為按鍵確實按下了,將狀態(tài)更新為2,同時將哪個按鍵以及按鍵按下的值賦給keyReturn,通過這個就可以明確哪個按鍵按下了。

2、如果當(dāng)前獲取到的狀態(tài)與上次不一樣,認(rèn)為是按鍵抖動,不進行響應(yīng)。

第三個10ms來之后,進去狀態(tài)2(假如不是抖動),也是分2步

1、如果按鍵不等于上次的狀態(tài)(按下),則認(rèn)為按鍵松開,認(rèn)為一次按下完成,狀態(tài)清零,返回按鍵值。

2、如果狀態(tài)與上次還是一樣,則認(rèn)為一直在按著按鍵,就可以做長按功能了。返回按鍵值。

如果進去長按了,則將狀態(tài)更新為3。

第四個10ms到來之后,進去狀態(tài)3,用于判斷長按之后的松手狀態(tài)。就不多說了。

之后,通過keyReturn & KEY_UP判斷短按,keyReturn & KEY_LONG判斷長按,之后通過回掉函數(shù)進去相應(yīng)的函數(shù)執(zhí)行,這里的一個好處就是通過指針keys就可以調(diào)用所有的回調(diào)函數(shù)指針。

好,就先分析到這里,相信大家對按鍵部分的代碼都有一個比較詳細(xì)的了解了,但還是要一個一個分析,達(dá)到為我所用的地步,方可真正學(xué)會其中的精髓。覺得好的話可以下面點贊哦,你們的點贊是我最大的動力!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4260

    瀏覽量

    62231
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2943

    瀏覽量

    66570
  • 機智云
    +關(guān)注

    關(guān)注

    2

    文章

    572

    瀏覽量

    26349

原文標(biāo)題:Gokit3.0 STM32源代碼分析之四

文章出處:【微信號:IoTMaker,微信公眾號:機智云開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    GoKit試用體驗】+機智GoKit開發(fā)套件學(xué)習(xí)分享1開箱圖

    本帖最后由 孤雨冰狐 于 2015-6-9 10:34 編輯 機智GoKit開發(fā)套件學(xué)習(xí)分享1開箱圖今天我申請的機智
    發(fā)表于 06-08 17:13

    GoKit試用體驗】+機智GoKit開發(fā)套件學(xué)習(xí)分享2開發(fā)板初認(rèn)識

    GoKit試用體驗】+機智GoKit開發(fā)套件學(xué)習(xí)分享2開發(fā)板初認(rèn)識 好長時間沒有更新,被催了,實在很抱歉,不是因為不想發(fā)帖,只是我本人
    發(fā)表于 07-25 11:49

    【科技亦能傳承】轉(zhuǎn)贈 Gokit2.0,免費換加強版Gokit3.0

    閑置開發(fā)板已落滿灰塵?舍不得扔,又不適合送友人?為何不將它贈送給需要的人呢?只要你在此帖留言,并成功贈送出去,機智將免費贈送 10 塊首批限量加強版 Gokit3.0 開發(fā)板,包郵哦~活動時間
    發(fā)表于 06-21 15:25

    【萬元大獎】機智智能硬件創(chuàng)新大賽

    。//幸運觀眾獎的禮物設(shè)置:機智大禮包、Gokit3.0 、Gokit2.0 、T恤 、GoDay入場券、數(shù)據(jù)線(其他項目)2016.08.29~2016.08.30專家評審專家評審
    發(fā)表于 07-06 13:42

    Gokit 3試用體驗】(8)微信控制Gokit體驗機智寵物屋

    ,而實現(xiàn)微信控制Gokit的二維碼只有在紙字版的說明書上有,如下圖所示。于是悲劇了……  經(jīng)過機智網(wǎng)官網(wǎng)論壇查詢資料、機智網(wǎng)QQ群咨詢問題,最后拿到了相應(yīng)的控制二維碼,在Gokit S
    發(fā)表于 10-02 12:19

    重磅| Gokit1.0用戶真情回饋-Gokit3.0免費兌換

    表達(dá)機智由衷的謝意,特在金秋十月送上真誠回饋:Gokit1.0用戶憑Gokit1.0開發(fā)板,免費兌換Gokit3.0,
    發(fā)表于 10-16 19:16

    如何使用機智開發(fā)一款智能硬件產(chǎn)品

    Gokit3】序列2:Gokit3介紹第3篇:【原創(chuàng)】【魅力Gokit3】序列3:wifi控制走起第4篇:【原創(chuàng)】【魅力
    發(fā)表于 12-26 15:56

    機智在Amazon Alexa平臺發(fā)布Smarthome和Custom Skill,實現(xiàn)亞馬遜Echo直接控制Gokit

    控制機智開源套件Gokit(包括Gokit2.0和Gokit3.0)!這也將意味著:隨著機智
    發(fā)表于 03-31 11:54

    機智2016~2017優(yōu)秀項目盤點

    】之無線工業(yè)粉塵監(jiān)測儀【Gokit 3】倉鼠管家和OpenHamtaro開源項目【Gokit智慧宿舍【Gokit 3】
    發(fā)表于 09-22 13:03

    Cortex-M3的異常處理機制分析

    Cortex-M3的異常處理機制分析  詳細(xì)闡述CortexM3異常的分類、優(yōu)先級、進入和退出,以及在CortexM3異常處理機制中使用的新技術(shù)——遲到(late?arriving)和
    發(fā)表于 03-29 15:07 ?1950次閱讀
    Cortex-M3的異常<b class='flag-5'>處理機制</b><b class='flag-5'>分析</b>

    機智Gokit3.0源代碼分析協(xié)議結(jié)構(gòu)體的定義

    這里主要定義了一些gizwits協(xié)議的下發(fā)報文標(biāo)志、緩沖區(qū)、數(shù)據(jù)長度、sn、系統(tǒng)時間、上次上報數(shù)據(jù)的時間、重發(fā)機制定義、控制事件、WiFi狀態(tài)事件、上次上報的數(shù)據(jù)、云端下發(fā)的控制報文以及WiFi狀態(tài)信息這些數(shù)據(jù)的定義,這里我們重點關(guān)注幾個就行了。
    的頭像 發(fā)表于 07-13 14:53 ?4585次閱讀
    <b class='flag-5'>機智</b><b class='flag-5'>云</b><b class='flag-5'>Gokit3.0</b><b class='flag-5'>源代碼</b><b class='flag-5'>分析</b><b class='flag-5'>之</b>協(xié)議結(jié)構(gòu)體的定義

    總結(jié):ARM的異常處理機制分析資料下載

    電子發(fā)燒友網(wǎng)為你提供總結(jié):ARM的異常處理機制分析資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-15 08:45 ?7次下載
    總結(jié):ARM的異常<b class='flag-5'>處理機制</b><b class='flag-5'>分析</b>資料下載

    基于機智Gokit3.0的智能加濕器APP控制系統(tǒng)

    本文選用機智Gokit3.0開發(fā)板作為核心處理器,進行整個系統(tǒng)的控制和工作,GoKit采用可擴展式的硬件設(shè)計方案。核心硬件是包括:功能擴展
    的頭像 發(fā)表于 03-30 19:50 ?648次閱讀

    基于機智Gokit3.0的智能加濕器APP控制系統(tǒng)

    本文選用機智Gokit3.0開發(fā)板作為核心處理器,進行整個系統(tǒng)的控制和工作,GoKit采用可擴展式的硬件設(shè)計方案。核心硬件是包括:功能擴展
    的頭像 發(fā)表于 04-07 16:07 ?761次閱讀
    基于<b class='flag-5'>機智</b><b class='flag-5'>云</b><b class='flag-5'>Gokit3.0</b>的智能加濕器APP控制系統(tǒng)

    如何處理機智移動應(yīng)用的刪除問題

    如何處理機智移動應(yīng)用的刪除問題在日常使用機智移動應(yīng)用時,用戶可能會遇到無法自行刪除應(yīng)用的問題。根據(jù)最新版本的設(shè)計,機智
    的頭像 發(fā)表于 10-23 08:04 ?35次閱讀
    如何<b class='flag-5'>處理機智</b><b class='flag-5'>云</b>移動應(yīng)用的刪除問題