女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

基于狀態(tài)機(jī)和面向?qū)ο蟮乃枷朐O(shè)計(jì)按鍵檢測模塊

工程師進(jìn)階筆記 ? 來源:工程師進(jìn)階筆記 ? 2024-11-14 11:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

以下是物理按鍵模塊的設(shè)計(jì)過程。

1、這個(gè)通用的物理按鍵模塊,主要是由4個(gè)源代碼文件組成,key_driver.c和key_driver.h主要是驅(qū)動(dòng)層接口,主要面向不同的單片機(jī)引腳適配。key_module.c和key_module.h主要是面向應(yīng)用層接口,與芯片硬件引腳無關(guān)。

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

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

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

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

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

4、在key_driver.c里面,定義了一個(gè)key_driver結(jié)構(gòu)體變量,記住這個(gè)變量,很重要,后面會(huì)被key_module進(jìn)行調(diào)用,key_driver的具體內(nèi)容如下圖所示。

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

5、在key_module.h里面,主要是聲明了兩個(gè)重要的結(jié)構(gòu)體,key_t結(jié)構(gòu)體是面向單個(gè)按鍵對象的,主要是包括按鍵ID以及按鍵狀態(tài)枚舉,還有一些變量是用來進(jìn)行按鍵檢測過程的,key_manager_t結(jié)構(gòu)體主要是用來管理多個(gè)按鍵對象的,包括各個(gè)按鍵動(dòng)作的函數(shù)接口,還有按鍵引腳的驅(qū)動(dòng)程序,如下圖所示。

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

6、按鍵模塊還對外提供了多個(gè)外部調(diào)用接口,包括模塊初始化,按鍵模塊時(shí)間更新,按鍵模塊的時(shí)基更新,按鍵模塊的按鍵動(dòng)作回調(diào)函數(shù)處理,如下圖所示。

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

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

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

8、在key_module_update()函數(shù)里面,主要是以狀態(tài)機(jī)和回調(diào)函數(shù)的方式,處理各個(gè)按鍵狀態(tài)和動(dòng)作,按鍵狀態(tài)有KEY_IDLE、KEY_PRESSED、KEY_RELEASED、KEY_SINGLE_CLICK、KEY_DOUBLE_CLICK、KEY_LONG_PRESS。代碼如下圖所示。

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

9、在各個(gè)不同的狀態(tài)里面,通過回調(diào)函數(shù)的方式,分別對按下、抬起、單擊、雙擊、長按、等按鍵動(dòng)作進(jìn)行處理,限于篇幅,這里只列出部分代碼,具體實(shí)現(xiàn)請參考具體源碼和注釋。

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

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

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

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

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

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

-END-

往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀

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

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

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

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

    關(guān)注

    2

    文章

    493

    瀏覽量

    28240
  • 按鍵檢測
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    4938

原文標(biāo)題:基于狀態(tài)機(jī)和面向?qū)ο蟮乃枷耄O(shè)計(jì)一個(gè)通用的按鍵檢測模塊。

文章出處:【微信號:工程師進(jìn)階筆記,微信公眾號:工程師進(jìn)階筆記】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32按鍵消抖——入門狀態(tài)機(jī)思維

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

    STM32按鍵狀態(tài)機(jī)2——狀態(tài)簡化與增加長按功能

    本篇繼續(xù)介紹狀態(tài)機(jī)的使用,在上篇的基礎(chǔ)上,通過簡化按鍵去抖邏輯,并增加按鍵長按功能,進(jìn)一步介紹狀態(tài)圖的修改與狀態(tài)機(jī)代碼的實(shí)現(xiàn),并通過實(shí)際測試
    的頭像 發(fā)表于 09-03 21:26 ?4691次閱讀
    STM32<b class='flag-5'>按鍵</b><b class='flag-5'>狀態(tài)機(jī)</b>2——<b class='flag-5'>狀態(tài)</b>簡化與增加長按功能

    狀態(tài)機(jī)編程實(shí)例-面向對象狀態(tài)設(shè)計(jì)模式

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

    玩轉(zhuǎn)Spring狀態(tài)機(jī)

    說起Spring狀態(tài)機(jī),大家很容易聯(lián)想到這個(gè)狀態(tài)機(jī)和設(shè)計(jì)模式中狀態(tài)模式的區(qū)別是啥呢?沒錯(cuò),Spring狀態(tài)機(jī)就是狀態(tài)模式的一種實(shí)現(xiàn),在介紹S
    的頭像 發(fā)表于 06-25 14:21 ?1311次閱讀
    玩轉(zhuǎn)Spring<b class='flag-5'>狀態(tài)機(jī)</b>

    狀態(tài)機(jī)編程

    狀態(tài)機(jī)編程基于狀態(tài)機(jī)按鍵輸入軟件接口設(shè)計(jì)一般的教課書中給出的按鍵輸入軟件接口程序通常非常簡單,在程序中一旦檢測
    發(fā)表于 07-10 18:00

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

    在面試時(shí)經(jīng)常會(huì)被問到面向過程和面向對象有什么區(qū)別,雖然都是編程的一種思想,但是他們的側(cè)重點(diǎn)不同,我們從以下幾個(gè)方面進(jìn)行簡單總結(jié)。1. 面向
    發(fā)表于 07-21 08:53

    利用狀態(tài)機(jī)按鍵消抖程序

    利用狀態(tài)機(jī)按鍵消抖程序講解,很好的資料下載吧。
    發(fā)表于 01-11 09:32 ?30次下載

    嵌入式軟件中狀態(tài)機(jī)的抽象與實(shí)現(xiàn)

    文中提出了 在嵌入式軟件中把狀態(tài)機(jī)作為一個(gè)獨(dú)立模塊從控制模塊中抽象出來的思想 , 描述了 抽象出來的狀態(tài)機(jī)
    發(fā)表于 03-22 15:47 ?1次下載

    基于狀態(tài)機(jī)的單片機(jī)按鍵短按長按功能的實(shí)現(xiàn)

    本文主要介紹了基于狀態(tài)機(jī)的單片機(jī)按鍵短按長按功能的實(shí)現(xiàn),按鍵的擊鍵過程也是一種狀態(tài)的切換,也可以看著是一個(gè)
    發(fā)表于 12-28 08:43 ?2w次閱讀
    基于<b class='flag-5'>狀態(tài)機(jī)</b>的單片<b class='flag-5'>機(jī)</b><b class='flag-5'>按鍵</b>短按長按功能的實(shí)現(xiàn)

    面向過程和面向對象有什么區(qū)別

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

    C++語言和面向對象程序設(shè)計(jì)教程

    章至第11章介紹符合C++國際標(biāo)準(zhǔn)的C++面向對象程序設(shè)計(jì)思想和方法;第12章和第13章分別介紹面向對象建模
    發(fā)表于 03-02 08:00 ?6次下載

    FPGA:狀態(tài)機(jī)簡述

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

    什么是狀態(tài)機(jī)狀態(tài)機(jī)5要素

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

    如何以面向對象思想設(shè)計(jì)有限狀態(tài)機(jī)

    有限狀態(tài)機(jī)又稱有限狀態(tài)自動(dòng)機(jī),簡稱狀態(tài)機(jī),是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)計(jì)算模型,用英文縮寫也被簡...
    發(fā)表于 02-07 11:23 ?4次下載
    如何以<b class='flag-5'>面向</b><b class='flag-5'>對象</b>的<b class='flag-5'>思想</b>設(shè)計(jì)有限<b class='flag-5'>狀態(tài)機(jī)</b>

    按鍵狀態(tài)機(jī)代碼

    自己寫的按鍵狀態(tài)機(jī),需要的時(shí)候根據(jù)情況修改一下
    發(fā)表于 03-27 10:42 ?8次下載