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

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

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

用一條IO口實現(xiàn)兩個按鍵功能

聚豐開發(fā) ? 2018-10-24 11:24 ? 次閱讀

注:本文是作者以前發(fā)表在其個人博客,現(xiàn)在發(fā)布到“聚豐開發(fā)”專欄



之前去到一個朋友那里,提到現(xiàn)在客戶對成本要求非常之高,尤其是玩具行業(yè),已經(jīng)是一分一厘的去計算產(chǎn)品成本。朋友感慨為了省成本,方案商是絞盡腦汁地去想各種實現(xiàn)方法,說遇到過為了節(jié)省成本,硬是用單片機(jī)一條IO實現(xiàn)了兩個按鍵的功能,讓他頗為詫異,好久都沒想明白原理。


一條IO實現(xiàn)兩個按鍵,聽上去確實挺新奇,既然別人能夠?qū)崿F(xiàn),我想我也應(yīng)該可以做到,看來得找找實現(xiàn)的方法。我有一個習(xí)慣,遇到某些問題的時候,會在睡覺前想解決方法,想著想著就會睡著了,問題的答案有沒有找到則不一定。



我知道有用一條IO實現(xiàn)多個按鍵的方法,這樣的方法大多是選用的IO支持ADC功能,用電阻分壓后通過讀電壓判斷鍵值。如果IO不支持ADC功能,也不是不行,可以用電容充放電的方法實現(xiàn)ADC,從而用普通IO間接進(jìn)行測量。(參見我之前關(guān)于鍵盤掃描的文章)

這樣用一條IO實現(xiàn)兩個按鍵給我的第一感覺是可能需要利用到電容充放電原理,于是在半夢半醒之中找到了實現(xiàn)的方法。



先看上圖左邊部分,如果MCU_IO1為雙向IO口,假設(shè)單片機(jī)程序按以下流程處理,看看會得到什么樣的結(jié)果?

1.MCU_IO1設(shè)定為輸出,輸出高電平一段時間,此時電容C1會充電,最后C1上的電壓接近電源電壓。


2.MCU_IO1設(shè)定為輸入,如果J1、J2均不按下,此時MCU_IO1可以理解成一個阻值很大的電阻接地,電容C1上的電荷會通過這個電阻逐漸釋放掉,這樣C1上的電壓會逐漸降低到零。因為C1上的電壓下降需要一個過程,當(dāng)MCU_IO1設(shè)為輸入后馬上讀一下MCU_IO1的狀態(tài),此時會讀到什么結(jié)果?顯然是高電平狀態(tài)1。


3.再將MCU_IO1設(shè)定為輸出,輸出低電平一段時間,顯然不管電容C1處于什么狀態(tài),只要MCU_IO1輸出低電平時間足夠長,最后C1上的電壓應(yīng)該接近零。


4.再將MCU_IO1設(shè)定為輸入,如果J1、J2同樣不按下,MCU_IO1讀到的是低電平狀態(tài)0。

如果J1按下,再來看看這四步,此時電容C1已經(jīng)被強(qiáng)制接到電源上,MCU_IO1對其的充放電已經(jīng)不起作用,在步驟2中MCU_IO1讀到的狀態(tài)依然是1,但在步驟4中MCU_IO1讀到的狀態(tài)就不再是0,而是變?yōu)?。

如果J2按下,同樣看這四步,此時電容C1被強(qiáng)制接到地,MCU_IO1對其充放電也失去作用,在步驟2中MCU_IO1讀到的狀態(tài)變?yōu)?,但在步驟4中MCU_IO1讀到的狀態(tài)保持為1。

到這里我想大家應(yīng)該已經(jīng)明白了實現(xiàn)方法,根據(jù)此四步中讀到的MCU_IO1狀態(tài),就可以判斷出J1、J2是否按下。

既然已經(jīng)找到方法,是不是就萬事大吉了呢?不然,我們還得回過頭去看看此方法是不是足夠可靠。如果J1按下,電容C1直接接到電源上,當(dāng)MCU_IO1輸出低時,MCU_IO1輸出的低電平直接與電源短路,弄不好就會燒壞MCU_IO1,同理當(dāng)J2按下時MCU_IO1輸出高也存在同樣的問題。


還有比這更嚴(yán)重的問題,如果用戶同時按下J1和J2,哈!居然是電源和地直接短路,這樣的后果很可能就是整個產(chǎn)品的電源部分一股青煙了事,就別想產(chǎn)品還能不能工作了。

不用擔(dān)心,看一看前面電路圖中的右半部分,在開關(guān)J3和J4上分別串聯(lián)了一個220歐的電阻,這個電路不管J3和J4如何按,都不會出現(xiàn)短路的情況,按前面的四個步驟即可判斷出J3和J4有沒有按下,不過如果J3和J4同時按下并不能進(jìn)行識別判斷。

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

    關(guān)注

    6026

    文章

    44455

    瀏覽量

    630962
收藏 人收藏

    評論

    相關(guān)推薦

    遲滯比較器的輸出為一條直線的原因

    ,如果遲滯比較器的輸出為一條直線,這可能是由于多種原因造成的。 遲滯比較器的工作原理 在討論遲滯比較器輸出為一條直線的原因之前,我們首先需要了解其工作原理。遲滯比較器通常由運算放大
    的頭像 發(fā)表于 07-11 09:36 ?440次閱讀

    CW32數(shù)字電壓電流表軟件教程-實驗二:按鍵檢測

    3.1.獨立按鍵基礎(chǔ)知識 3.1.1.獨立按鍵結(jié)構(gòu)組成 獨立按鍵實際上是非自鎖的輕觸開關(guān),有左右兩個
    的頭像 發(fā)表于 05-31 15:16 ?766次閱讀
    CW32數(shù)字電壓電流表軟件教程-實驗二:<b class='flag-5'>按鍵</b>檢測

    STM32矩陣按鍵造成IO口的損壞的原因?

    看了網(wǎng)上的4*4矩陣按鍵,不帶外部中斷,可實現(xiàn)多個按鍵同時按下。發(fā)現(xiàn)行線都配置成GPIO_Mode_Out_PP推挽輸出,我認(rèn)為當(dāng)同一個列線上有兩個
    發(fā)表于 05-17 06:02

    兩個STM32的IO口連接到起,其中IO口被燒壞的原因?

    如題:兩個STM32的IO口連接到起,單片機(jī)IO設(shè)置為輸出模式(發(fā)送數(shù)據(jù)),另
    發(fā)表于 04-24 07:53

    節(jié)省IO的小技巧:GD32 MCU如何使用GPIO實現(xiàn)串口半雙工收發(fā)

    般情況串口的接受和發(fā)送分別需要使用TX和RX兩個引腳來實現(xiàn),但在些UART的實際應(yīng)用中,通信雙方身份為主機(jī)和從機(jī),數(shù)據(jù)流是半雙工的,那么當(dāng)IO
    的頭像 發(fā)表于 03-15 09:39 ?1675次閱讀
    節(jié)省<b class='flag-5'>IO</b>的小技巧:GD32 MCU如何使用<b class='flag-5'>一</b><b class='flag-5'>個</b>GPIO<b class='flag-5'>實現(xiàn)</b>串口半雙工收發(fā)

    arcgis中如何關(guān)聯(lián)兩個屬性表

    在ArcGIS中,關(guān)聯(lián)兩個屬性表是重要的操作,可以通過此操作將兩個表中的數(shù)據(jù)關(guān)聯(lián)起來,以便進(jìn)行分析和查詢。下面是詳細(xì)介紹如何在ArcGIS中實現(xiàn)
    的頭像 發(fā)表于 02-25 11:01 ?3639次閱讀

    USB使用兩條CC線,是否可以在任何CC線路上的2PD源之間進(jìn)行選擇?

    我知道USB PD通常只使用一條CC線,但是如果使用兩條CC線,是否可以在者之間切換并發(fā)送數(shù)據(jù)包或決定連接到哪一條,同時存在兩個Rd下拉?
    發(fā)表于 02-23 08:05

    沒有電位器,兩個按鈕可以實現(xiàn)變頻器調(diào)速嗎?

    沒有電位器,兩個按鈕可以實現(xiàn)變頻器調(diào)速嗎? 變頻器是種廣泛應(yīng)用于電機(jī)調(diào)速的設(shè)備,它能夠調(diào)節(jié)電機(jī)的轉(zhuǎn)速,提高電機(jī)的效率,并且降低能耗。電位器是變頻器調(diào)速中常用的組件,但是在某些情況下
    的頭像 發(fā)表于 02-18 16:55 ?1563次閱讀

    兩個電位器地控制變頻器,如何接線?

    兩個電位器地控制變頻器,如何接線? 接線方式如下: 1. 首先,明確需要使用的電器設(shè)備。在這個場景中,我們需要兩個電位器(即可變電阻器
    的頭像 發(fā)表于 02-05 10:13 ?4414次閱讀

    UCB_SWAP配置信息共16,寫入一條有效配置后,上一條需寫1使配置無效是為什么?

    死鎖。 綜上,UCB_SWAP寫入一條有效配置后,上一條需寫1使配置無效具體作用是什么。 有了解該功能大佬幫忙解釋下,感謝! Infineon-AURIX_TC3xx_Part1-UserManual-v02_00-EN.pdf
    發(fā)表于 01-24 08:31

    單片機(jī)的GPIO如何實現(xiàn)觸摸按鍵功能呢?

    單片機(jī)的GPIO如何實現(xiàn)觸摸按鍵功能呢? 觸摸按鍵種使用觸摸電容技術(shù)實現(xiàn)
    的頭像 發(fā)表于 12-07 11:43 ?3510次閱讀

    兩個硬盤2系統(tǒng)開機(jī)切換

    準(zhǔn)備、系統(tǒng)安裝、系統(tǒng)切換和注意事項。 、硬件準(zhǔn)備 在開始之前,我們首先要確保我們有兩個可用的硬盤,每個硬盤上都可以安裝操作系統(tǒng)。我們建議使用
    的頭像 發(fā)表于 11-28 15:08 ?6750次閱讀

    如何連接兩個單片機(jī)實現(xiàn)IO口模擬數(shù)據(jù)的接受發(fā)送?

    如何連接兩個51單片機(jī),實現(xiàn)IO口模擬數(shù)據(jù)的接受發(fā)送
    發(fā)表于 11-03 06:56

    ch340怎么實現(xiàn)兩個單片機(jī)之間的io口通信?

    使用ch340,怎么實現(xiàn)兩個單片機(jī)之間的io口通信
    發(fā)表于 11-03 06:33

    使用兩個SN74181芯片級聯(lián)實現(xiàn)8位ALU

    ”前面的文章介紹邏輯算術(shù)運算芯片(SN74181)實現(xiàn)4位的邏輯和算術(shù)運算,兩個芯片級連實現(xiàn)8位運算。目標(biāo)是逐步實現(xiàn)
    的頭像 發(fā)表于 10-31 10:24 ?3369次閱讀
    使用<b class='flag-5'>兩個</b>SN74181芯片級聯(lián)<b class='flag-5'>實現(xiàn)</b>8位ALU