在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于狀態機和面向對象的思想設計按鍵檢測模塊

工程師進階筆記 ? 來源:工程師進階筆記 ? 2024-11-14 11:44 ? 次閱讀

物理按鍵,在很多嵌入式產品里面應用得非常廣泛,很多嵌入式軟件工程師在剛剛開始入門的時候,點完燈之后就開始學習按鍵輸入檢測。按鍵輸入可以說是繼點燈之后,又一經典的嵌入式入門必學內容之一。 在很多嵌入式入門學習的教程里面,按鍵原理普遍被認為是“很簡單”的知識點之一,按鍵輸入檢測的原理,無非就是通過CPU不斷掃描按鍵引腳的電平狀態,或者采用單片機引腳外部中斷方式,然后在死循環或者中斷服務程序里面處理按鍵被按下后的邏輯。 然而,在這個“很簡單的高低電平檢測”的原理背后,通過產品經理給物理按鍵各個動作賦予的(難以理解的)意義,一個小小的物理按鍵開始變得復雜起來,這些動作包括:按下、抬起、單擊、雙擊、點動、長按、組合按鍵。。。等等。 以上這些復雜的按鍵動作,已經不是一個“簡單的高低電平檢測”所能描述清楚的了,成熟的單片機按鍵檢測模塊,必須能很好地處理以上按鍵動作,并且具有很高的內聚度,與單片機的底層引腳盡量低耦合,且能提供靈活的應用層調用接口。 采用嵌入式 C 語言面向對象的思想,通過狀態機和回調函數的方式,我們來編寫一個通用的按鍵檢測模塊,以更好地覆蓋單片機的物理按鍵應用場合。

以下是物理按鍵模塊的設計過程。

1、這個通用的物理按鍵模塊,主要是由4個源代碼文件組成,key_driver.c和key_driver.h主要是驅動層接口,主要面向不同的單片機引腳適配。key_module.c和key_module.h主要是面向應用層接口,與芯片硬件引腳無關。

1ddeec5c-906b-11ef-a511-92fbcf53809c.jpg

2、key_driver.c 和 key_driver.h主要是用來適配不同的單片機GPIO外設的,在key_driver.h里面,聲明了一個key_driver_t類型的結構體,主要提供GPIO引腳初始化接口以及引腳電平讀取接口,如下圖所示。

1de7b116-906b-11ef-a511-92fbcf53809c.jpg

3、在key_driver.c里面,主要是對初始化接口和引腳電平讀取接口的具體實現,比如,引腳初始化接口_init()函數和電平讀取接口_read_pin_state(),其具體實現如下圖所示。

1dee39f0-906b-11ef-a511-92fbcf53809c.jpg

4、在key_driver.c里面,定義了一個key_driver結構體變量,記住這個變量,很重要,后面會被key_module進行調用,key_driver的具體內容如下圖所示。

1e11f39a-906b-11ef-a511-92fbcf53809c.jpg

5、在key_module.h里面,主要是聲明了兩個重要的結構體,key_t結構體是面向單個按鍵對象的,主要是包括按鍵ID以及按鍵狀態枚舉,還有一些變量是用來進行按鍵檢測過程的,key_manager_t結構體主要是用來管理多個按鍵對象的,包括各個按鍵動作的函數接口,還有按鍵引腳的驅動程序,如下圖所示。

1e1630f4-906b-11ef-a511-92fbcf53809c.jpg

6、按鍵模塊還對外提供了多個外部調用接口,包括模塊初始化,按鍵模塊時間更新,按鍵模塊的時基更新,按鍵模塊的按鍵動作回調函數處理,如下圖所示。

1e1a5652-906b-11ef-a511-92fbcf53809c.jpg

7、在key_module.c里面,主要是對以上外部接口的具體實現,比如,key_module_init()主要是對按鍵模塊的各個參數初始化,以及注冊按鍵模塊的引腳驅動程序,代碼如下圖所示。

1e24c740-906b-11ef-a511-92fbcf53809c.jpg

8、在key_module_update()函數里面,主要是以狀態機和回調函數的方式,處理各個按鍵狀態和動作,按鍵狀態有KEY_IDLE、KEY_PRESSED、KEY_RELEASED、KEY_SINGLE_CLICK、KEY_DOUBLE_CLICK、KEY_LONG_PRESS。代碼如下圖所示。

1e2932e4-906b-11ef-a511-92fbcf53809c.jpg

9、在各個不同的狀態里面,通過回調函數的方式,分別對按下、抬起、單擊、雙擊、長按、等按鍵動作進行處理,限于篇幅,這里只列出部分代碼,具體實現請參考具體源碼和注釋。

1e418c0e-906b-11ef-a511-92fbcf53809c.jpg

10、按鍵模塊需要對其提供系統時基,通常以1毫秒或者10毫秒作為時間基準,key_module_ticks_update()主要是在外部定時器或者外部1毫秒線程中被調用,key_module_set_event_handler()主要是用來設置各個按鍵狀態的回調函數,如下圖所示。

1e5838e6-906b-11ef-a511-92fbcf53809c.jpg

11、如何使用key_module?假如項目采用RT-Thread進行調度,在main()函數里面,先創建一個key_module_thread()線程,然后在該線程里面先對按鍵管理器進行初始化,然后注冊各種按鍵狀態的回調函數,最后在while循環里面,更新按鍵管理器的時基以及狀態更新函數,線程主體以1毫秒的間隔進行調度,如下圖所示。

1e5e1356-906b-11ef-a511-92fbcf53809c.jpg

12、以上,就是一個通用的單片機按鍵模塊具體設計,通過這個按鍵檢測模塊,可以很好地處理各種按鍵狀態事件,并且該按鍵模塊在設計上遵循設備與驅動分離的原則,盡量做到了高內聚低耦合,具體很好的移植性和單片機平臺適配性。 13、美中不足的是,這個模塊還沒有加入組合按鍵處理,感興趣的讀者,可以下載該模塊的源碼,對其進行修改和擴展。源碼獲取請點擊【閱讀原文】。

-END-

往期推薦:點擊圖片即可跳轉閱讀

1e63b892-906b-11ef-a511-92fbcf53809c.jpg

試了一下 GPT-4o,讓它幫我分析電路原理圖。

1e6f2af6-906b-11ef-a511-92fbcf53809c.jpg

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27539
  • 按鍵檢測
    +關注

    關注

    0

    文章

    23

    瀏覽量

    4836

原文標題:基于狀態機和面向對象的思想,設計一個通用的按鍵檢測模塊。

文章出處:【微信號:工程師進階筆記,微信公眾號:工程師進階筆記】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    STM32按鍵消抖——入門狀態機思維

    本篇介紹了嵌入式軟件開發中常用的狀態機編程實現,并通過按鍵消抖實例,以常用的switch-case形式,實現了對應的狀態機編程代碼實現,并通過測試,串口打印對應狀態,分析
    的頭像 發表于 09-02 21:54 ?4824次閱讀
    STM32<b class='flag-5'>按鍵</b>消抖——入門<b class='flag-5'>狀態機</b>思維

    STM32按鍵狀態機2——狀態簡化與增加長按功能

    本篇繼續介紹狀態機的使用,在上篇的基礎上,通過簡化按鍵去抖邏輯,并增加按鍵長按功能,進一步介紹狀態圖的修改與狀態機代碼的實現,并通過實際測試
    的頭像 發表于 09-03 21:26 ?4124次閱讀
    STM32<b class='flag-5'>按鍵</b><b class='flag-5'>狀態機</b>2——<b class='flag-5'>狀態</b>簡化與增加長按功能

    狀態機編程實例-面向對象狀態設計模式

    本編介紹了狀態機編程的第3種方法——面向對象狀態設計模式,通過C++的繼承特性,以及類指針,實現炸彈拆除小游戲中的狀態機功能。
    的頭像 發表于 06-28 09:04 ?1519次閱讀
    <b class='flag-5'>狀態機</b>編程實例-<b class='flag-5'>面向</b><b class='flag-5'>對象</b>的<b class='flag-5'>狀態</b>設計模式

    玩轉Spring狀態機

    說起Spring狀態機,大家很容易聯想到這個狀態機和設計模式中狀態模式的區別是啥呢?沒錯,Spring狀態機就是狀態模式的一種實現,在介紹S
    的頭像 發表于 06-25 14:21 ?953次閱讀
    玩轉Spring<b class='flag-5'>狀態機</b>

    狀態機編程

    狀態機編程基于狀態機按鍵輸入軟件接口設計一般的教課書中給出的按鍵輸入軟件接口程序通常非常簡單,在程序中一旦檢測
    發表于 07-10 18:00

    你真的知道面向過程和面向對象的區別嗎?精選資料分享

    在面試時經常會被問到面向過程和面向對象有什么區別,雖然都是編程的一種思想,但是他們的側重點不同,我們從以下幾個方面進行簡單總結。1. 面向
    發表于 07-21 08:53

    利用狀態機按鍵消抖程序

    利用狀態機按鍵消抖程序講解,很好的資料下載吧。
    發表于 01-11 09:32 ?30次下載

    嵌入式軟件中狀態機的抽象與實現

    文中提出了 在嵌入式軟件中把狀態機作為一個獨立模塊從控制模塊中抽象出來的思想 , 描述了 抽象出來的狀態機
    發表于 03-22 15:47 ?1次下載

    基于狀態機的單片按鍵短按長按功能的實現

    本文主要介紹了基于狀態機的單片按鍵短按長按功能的實現,按鍵的擊鍵過程也是一種狀態的切換,也可以看著是一個
    發表于 12-28 08:43 ?1.9w次閱讀
    基于<b class='flag-5'>狀態機</b>的單片<b class='flag-5'>機</b><b class='flag-5'>按鍵</b>短按長按功能的實現

    面向過程和面向對象有什么區別

    面向過程(pop)和面向對象(oop)是什么  1. pop(Process-oriented programming)的縮寫,“面向過程”是一種是事件為中心的編程
    發表于 05-13 18:12 ?2次下載
    <b class='flag-5'>面向</b>過程<b class='flag-5'>和面向</b><b class='flag-5'>對象</b>有什么區別

    C++語言和面向對象程序設計教程

    章至第11章介紹符合C++國際標準的C++面向對象程序設計思想和方法;第12章和第13章分別介紹面向對象建模
    發表于 03-02 08:00 ?6次下載

    FPGA:狀態機簡述

    是FPGA設計中一種非常重要、非常根基的設計思想,堪稱FPGA的靈魂,貫穿FPGA設計的始終。 02. 狀態機簡介 什么是狀態機狀態機通過不同的
    的頭像 發表于 11-05 17:58 ?7401次閱讀
    FPGA:<b class='flag-5'>狀態機</b>簡述

    什么是狀態機狀態機5要素

    玩單片還可以,各個外設也都會驅動,但是如果讓你完整的寫一套代碼時,卻無邏輯與框架可言。這說明編程還處于比較低的水平,你需要學會一種好的編程框架或者一種編程思想!比如模塊化編程、狀態機
    的頭像 發表于 07-27 11:23 ?2w次閱讀
    什么是<b class='flag-5'>狀態機</b>?<b class='flag-5'>狀態機</b>5要素

    如何以面向對象思想設計有限狀態機

    有限狀態機又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學計算模型,用英文縮寫也被簡...
    發表于 02-07 11:23 ?4次下載
    如何以<b class='flag-5'>面向</b><b class='flag-5'>對象</b>的<b class='flag-5'>思想</b>設計有限<b class='flag-5'>狀態機</b>

    按鍵狀態機代碼

    自己寫的按鍵狀態機,需要的時候根據情況修改一下
    發表于 03-27 10:42 ?8次下載
    主站蜘蛛池模板: 天天翘夜夜洗澡天天做| 在线观看一级毛片| 788gao这里只有精品| 奇米影视7777久久精品| 特黄特色大片免费播放路01| 色秀视频免费网站在线观看| 国产码一区二区三区| 国产aaaaaa| 国产综合视频在线| 91久久澡人人爽人人添| 美女视频黄色的免费| 人人艹人人干| 被男同桌摸内裤好爽视频| 免费四虎永久在线精品| 手机看福利片| 九九精品免费观看在线| 免费看 s色| 免费网站在线视频美女被| 啪啪免费看视频| 美女扒尿口给男人桶到爽 | h网站亚洲| 久久精品亚洲青青草原| 加勒比在线免费视频| 亚洲四虎| 高清不卡日本v在线二区| 国产毛片精品| 一级特黄a大片免费| 婷婷午夜天| 欧美精品二区| 国产区一区二区三| 国产免费高清视频在线观看不卡| 亚洲国产日韩精品怡红院| 黑人破乌克兰美女处| 国产小视频在线观看www| 一级毛片子| 国产999星空传媒在线观看| 最近最新免费视频| 四虎永久在线精品免费影视| 日本www色视频成人免费网站| 午夜视频在线观看一区| 九九热在线视频观看 |