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

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

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

STM32按鍵檢測(cè)之短按與長(zhǎng)按方法

冬至子 ? 來源:奇遇單片機(jī) ? 作者:奇遇單片機(jī) ? 2023-06-12 11:41 ? 次閱讀

電路設(shè)計(jì)中,我們經(jīng)常需要讀取外部的電平信號(hào)。比如,在項(xiàng)目中,我們需要通過按鍵來輸入一些數(shù)據(jù),那么就需要檢測(cè)按鍵是否被按下。電平分為高電平讀取和低電平讀取,讀取高電平,需要設(shè)置IO為下拉電阻輸入模式,反之,設(shè)置IO為上拉電阻輸入模式。

圖片

S4按下時(shí),單片機(jī)IO為高電平,S1-S3按下時(shí),為低電平。我們?cè)O(shè)置S1為上拉輸入模式,S4為下拉輸入模式。本節(jié)使用按鍵實(shí)現(xiàn)2個(gè)功能:

S1短按一次,LED2點(diǎn)亮,S1再短按一次,LED2熄滅。S1長(zhǎng)按,LED1點(diǎn)亮,S1再長(zhǎng)按,LED1熄滅。這種方式可以用來實(shí)現(xiàn)短按調(diào)節(jié)菜單,長(zhǎng)按保存參數(shù)。

S4短按一次,LED4點(diǎn)亮,S4再短按一次,LED4熄滅。S4長(zhǎng)按且不松手,LED4閃爍。這種方式可以用來實(shí)現(xiàn)短按調(diào)節(jié)數(shù)字,長(zhǎng)按快速調(diào)節(jié)數(shù)字。在下一節(jié),我們講解數(shù)碼管數(shù)字顯示時(shí),再來實(shí)現(xiàn)數(shù)字慢調(diào)和快調(diào)這個(gè)功能。下圖是程序的大概流程思路以及框架:

圖片

關(guān)于IO輸入輸出初始化,上一節(jié)講過如何配置。這里按鍵設(shè)置上拉輸入和下拉輸入,LED設(shè)置推挽低速輸出。一般來說,我們會(huì)把應(yīng)用代碼寫在單獨(dú)的一個(gè)文件里,比如按鍵檢測(cè)就是KEY.c,然后其他文件用到的函數(shù)和宏定義,可以直接寫在對(duì)應(yīng)的頭文件里KEY.h。在哪個(gè)文件里使用,就在該文件里include頭文件即可。每個(gè)外設(shè)電路都由一組C文件和H文件組成,一般來說,在復(fù)雜的項(xiàng)目中,在USER.c文件里調(diào)用外設(shè)函數(shù)編寫用戶程序,在主函數(shù)里調(diào)用用戶函數(shù)即可。下圖就是一個(gè)按鍵的頭文件。

圖片

下圖列出了一些按鍵檢測(cè)的核心代碼,KEY.c部分代碼:

圖片

ScanKey()函數(shù)中的if語(yǔ)句是用來判斷鍵值是否變化的,如果鍵值變化,則執(zhí)行按鍵處理函數(shù)keyDeal();

按鍵鍵值讀取的思路:while語(yǔ)句每循環(huán)一次所需時(shí)間是已知的,假設(shè)是100us,按鍵在被按下的過程中,IO的電平是劇烈變化的,只有完全按下時(shí),IO的電平才會(huì)穩(wěn)定。因此,當(dāng)檢測(cè)到低電平時(shí),開始計(jì)數(shù),每100us檢測(cè)一次,假設(shè)檢測(cè)了100次都是低電平,那么就可以確定按鍵真的被按下了。這里千萬別采用長(zhǎng)延時(shí),防止程序被堵塞,一直空等待。

有的人是這樣設(shè)計(jì)的,當(dāng)檢測(cè)到低電平時(shí),就開始延遲100ms,然后再次檢測(cè)到低電平,就認(rèn)為按鍵被按下一次。這種方式是不合理的,在這100ms延時(shí)期間,CPU什么也沒干,一直在那空運(yùn)行,以至于其他程序無法被執(zhí)行。而我們現(xiàn)在采用的策略是,while循環(huán)體里一般會(huì)有一些程序要被執(zhí)行,這些程序執(zhí)行是需要花時(shí)間的,那么循環(huán)一次花的時(shí)間,乘以循環(huán)次數(shù),就可以達(dá)到延遲的目的。這樣做,既可以延遲,也不影響其他程序執(zhí)行。下面列出一些按鍵檢測(cè)的核心代碼。

圖片

關(guān)于長(zhǎng)按,短按,是根據(jù)不同的循環(huán)次數(shù)來區(qū)分的。當(dāng)達(dá)到長(zhǎng)循環(huán)次數(shù)時(shí),就認(rèn)為長(zhǎng)按,在鍵值上加上長(zhǎng)按標(biāo)志。如果松手后,循環(huán)次數(shù)沒有達(dá)到長(zhǎng)按次數(shù),就認(rèn)為是短按。如果檢測(cè)到長(zhǎng)按,就在長(zhǎng)按執(zhí)行代碼里,設(shè)置另一個(gè)變量,每循環(huán)幾次就執(zhí)行數(shù)字遞增或者遞減。這就是長(zhǎng)按快速計(jì)數(shù)的原理。

如果長(zhǎng)按用來實(shí)現(xiàn)數(shù)據(jù)保存,那么,就直接在長(zhǎng)按執(zhí)行代碼里設(shè)置保存標(biāo)志位或者直接保存數(shù)據(jù)。這里KEY4按鍵長(zhǎng)按LED閃爍是在按鍵檢測(cè)函數(shù)里直接執(zhí)行的,而短按是在鍵值處理函數(shù)里執(zhí)行的。之所以這么做,是因?yàn)榘存I長(zhǎng)按不松手,鍵值一直不變,按鍵處理函數(shù)只會(huì)被執(zhí)行一次,請(qǐng)看前文的ScanKey函數(shù)。KEY1長(zhǎng)按,短按都是在鍵值處理函數(shù)里執(zhí)行的。

在按鍵處理函數(shù)中,首先分離出長(zhǎng)按標(biāo)志位,然后根據(jù)鍵值去匹配是哪個(gè)按鍵被按下。在鍵值處理代碼段里,根據(jù)長(zhǎng)按標(biāo)志位來判斷執(zhí)行短按操作還是長(zhǎng)按操作。

圖片

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

    關(guān)注

    5

    文章

    360

    瀏覽量

    30653
  • 下拉電阻
    +關(guān)注

    關(guān)注

    4

    文章

    147

    瀏覽量

    20564
  • led燈
    +關(guān)注

    關(guān)注

    22

    文章

    1592

    瀏覽量

    108182
  • STM32單片機(jī)
    +關(guān)注

    關(guān)注

    59

    文章

    549

    瀏覽量

    58750
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    跪求基于verilog的短按鍵,長(zhǎng)按鍵的程序

    小弟新手,只會(huì)短按鍵的程序,跪求基于verilog的短按鍵長(zhǎng)按鍵的程序,不勝感激
    發(fā)表于 03-18 14:47

    mico按鍵長(zhǎng)按短按怎么實(shí)現(xiàn)

    mico按鍵長(zhǎng)按短按怎么實(shí)現(xiàn)?
    發(fā)表于 07-31 17:02

    stm32按鍵是如何去實(shí)現(xiàn)長(zhǎng)按及其短按

    stm32按鍵是如何去實(shí)現(xiàn)長(zhǎng)按及其短按的?具體實(shí)現(xiàn)過程是怎樣的?
    發(fā)表于 12-01 08:06

    stm32按鍵長(zhǎng)按/短按怎么實(shí)現(xiàn)?

    stm32按鍵長(zhǎng)按/短按怎么實(shí)現(xiàn)?
    發(fā)表于 12-02 07:41

    實(shí)現(xiàn)單片機(jī)按鍵長(zhǎng)按短按功能的方法

    寫在前面?一般我們?cè)趯憜纹瑱C(jī)程序的時(shí)候都要用到按鍵,在按鍵較少的情況下我們需要一個(gè)按鍵可以返回不同的按下結(jié)果,也就是長(zhǎng)按短按。程序?qū)崿F(xiàn)?大
    發(fā)表于 12-06 07:40

    stm32f103按鍵長(zhǎng)短按得識(shí)別原理是什么

    stm32f103按鍵長(zhǎng)短按得識(shí)別原理需要一個(gè)定時(shí)器,用來計(jì)算按鍵按下的時(shí)間,可以一秒鐘檢測(cè)100次, 設(shè)置初始化為10ms的中斷,比如使用
    發(fā)表于 01-06 07:03

    STM32按鍵短按加一次而長(zhǎng)按連續(xù)加的功能實(shí)現(xiàn)

    STM32按鍵短按加一次而長(zhǎng)按連續(xù)加的功能題目要求思路過程解決過程anjian.c注意anjian.htimer.c注意timer.h題目
    發(fā)表于 01-06 07:03

    MCU里按鍵短按長(zhǎng)按功能如何實(shí)現(xiàn)?

    MCU里按鍵短按長(zhǎng)按功能如何實(shí)現(xiàn)?
    發(fā)表于 02-09 06:54

    STM32按鍵長(zhǎng)按短按控制指示燈閃爍

    大佬們,這個(gè)怎么寫呀利用狀態(tài)機(jī)設(shè)計(jì)思想,編寫按鍵長(zhǎng)按短按處理程序,按鍵B1長(zhǎng)按則控制指示燈LD2閃爍2次后關(guān)閉;
    發(fā)表于 10-12 22:05

    按鍵長(zhǎng)按短按效果

    按鍵長(zhǎng)按短按效果 C51單片機(jī)源碼,KEIL源文件,C語(yǔ)言編寫
    發(fā)表于 06-20 16:15 ?64次下載

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

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

    使用單片機(jī)實(shí)現(xiàn)按鍵長(zhǎng)按短按效果的C語(yǔ)言程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用單片機(jī)實(shí)現(xiàn)按鍵長(zhǎng)按短按效果的C語(yǔ)言程序免費(fèi)下載。
    發(fā)表于 11-26 17:31 ?56次下載

    瑞薩單片機(jī)之外部中斷實(shí)現(xiàn)按鍵長(zhǎng)按短按(二)

    瑞薩單片機(jī)通過外部中斷實(shí)現(xiàn)按鍵長(zhǎng)按短按
    發(fā)表于 11-22 14:21 ?20次下載
    瑞薩單片機(jī)之外部中斷實(shí)現(xiàn)<b class='flag-5'>按鍵</b>的<b class='flag-5'>長(zhǎng)按</b>與<b class='flag-5'>短按</b>(二)

    基于STM32F103C8T6的多按鍵檢測(cè) | 有限狀態(tài)機(jī)短按、長(zhǎng)按識(shí)別 | 標(biāo)準(zhǔn)庫(kù)函數(shù)實(shí)現(xiàn)方法

    制作航模遙控器需要用到多按鍵檢測(cè),使用有限狀態(tài)機(jī)實(shí)現(xiàn)檢測(cè)短按長(zhǎng)按,修正了原文中的一些錯(cuò)誤
    發(fā)表于 11-26 11:21 ?36次下載
    基于<b class='flag-5'>STM32</b>F103C8T6的多<b class='flag-5'>按鍵</b><b class='flag-5'>檢測(cè)</b> | 有限狀態(tài)機(jī)<b class='flag-5'>短按</b>、<b class='flag-5'>長(zhǎng)按</b>識(shí)別 | 標(biāo)準(zhǔn)庫(kù)函數(shù)實(shí)現(xiàn)<b class='flag-5'>方法</b>

    基于89C51單片機(jī)的按鍵長(zhǎng)按短按效果源程序

    基于89C51單片機(jī)的按鍵長(zhǎng)按短按效果源程序
    發(fā)表于 05-16 09:45 ?18次下載