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

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

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

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

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

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



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


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



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

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



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

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


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


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


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

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

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

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

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


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

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

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

    關(guān)注

    6030

    文章

    44489

    瀏覽量

    631981
收藏 人收藏

    評論

    相關(guān)推薦

    使用片TLV320ADC3101芯片接到同一條i2s總線上,能實(shí)現(xiàn)音頻數(shù)據(jù)的同時(shí)采集嗎?

    我想 請問下,使用片TLV320ADC3101芯片接到同 一條 i2s總線上,能實(shí)現(xiàn)音頻數(shù)據(jù)的同時(shí)采集嗎?目前只實(shí)現(xiàn)
    發(fā)表于 10-24 07:03

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    想用TC275控制兩個(gè)永磁電機(jī),GPT12能不能實(shí)現(xiàn)兩個(gè)QEP功能

    想用TC275控制兩個(gè)永磁電機(jī),不知道GPT12能不能實(shí)現(xiàn)兩個(gè)QEP功能,供路電機(jī)使用
    發(fā)表于 02-05 07:14

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

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

    stm32個(gè)定時(shí)器能同時(shí)控制兩個(gè)燈以不同頻率閃爍嗎?

    STM32的定時(shí)器功能強(qiáng)大,**STM32的定時(shí)器可以同時(shí)控制兩個(gè)燈以不同頻率閃爍** 。
    的頭像 發(fā)表于 12-13 10:43 ?1900次閱讀

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

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

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

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