熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
lkc8210 發(fā)表于 2025-1-13 16:15 雖然可以,但是,對(duì)單片機(jī)的要求比較高,需要有下拉電阻控制器的單片機(jī), 比如 STC8051U 系列,STC32系列等等。 IO設(shè)置為高祖, 1) 開(kāi)內(nèi)部下拉,關(guān)內(nèi)部上拉,如果 IO = 1, 則: 接VCC的按鍵被按下。 2) 關(guān)內(nèi)部下拉,開(kāi)內(nèi)部上拉,如果 IO = 0, 則: 接GND的按鍵被按下。 以上皆否則沒(méi)有按鍵被按下。 然后,還有另一種雙按鍵方案,需要單片機(jī)IO 支持強(qiáng)推挽輸出。 IO出來(lái),接一個(gè)電阻,然后對(duì)地電容,然后,接兩個(gè)按鍵,按鍵A直接接地,按鍵B接一個(gè)等值電阻后接地。 IO強(qiáng)推挽,先充電5us, 然后,切換高阻,檢測(cè)IO, IO 為 0, 則 按鍵 A 按下。 否則 5us 后再檢測(cè),IO 為 0 則按鍵B 按下, 反之 沒(méi)有按鍵 按下。 如 判定為 按鍵B 按下,需要 再 充電一次復(fù)驗(yàn), 防止是 在第二次檢測(cè)時(shí),實(shí)際按鍵A 按下。 |
lkc8210 發(fā)表于 2025-2-12 10:06 昨天查閱了IO內(nèi)部電路,確實(shí)有些冒險(xiǎn),只在仿真中試用過(guò),且仿真圖有黃顏色的點(diǎn),低壓極短時(shí)間內(nèi)仿真沒(méi)報(bào)錯(cuò),實(shí)際硬件沒(méi)用過(guò),請(qǐng)慎之。 |
WL0123 發(fā)表于 2025-2-8 08:33 使用你們的代碼,編譯通不過(guò),報(bào)錯(cuò)not every exit path returns a value |
wlefa 發(fā)表于 2025-1-13 21:13 要加濾波消抖代碼 ![]() |
xianfajushi 發(fā)表于 2025-2-10 21:57 ? “先賦值低電平再檢測(cè)是否高” 先賦值低電平不就打開(kāi)了內(nèi)置對(duì)地的MOS管? 如果再按接電源正的按鍵不就短路? |
電路沒(méi)問(wèn)題,就看怎么寫(xiě)了,I/O口需要不斷變換實(shí)時(shí)檢測(cè)判斷,B4高低切換,配合B2、B3設(shè)置開(kāi)漏(或高阻抗輸入)和標(biāo)準(zhǔn)I/O口設(shè)置切換來(lái)檢測(cè)判斷 |
電路圖可以改一下 |
lei848200 發(fā)表于 2025-1-11 21:07 單片機(jī)的引腳又不是不能短路的,人家只檢測(cè)低電平,短路沒(méi)問(wèn)題呀 |
lkc8210 發(fā)表于 2025-1-13 16:15 除了P0外的都可用來(lái)制作1個(gè)IO檢測(cè)2個(gè)按鍵用,特別適合閑散IO,1個(gè)按鍵接地1個(gè)按鍵接電源,檢測(cè)接地按鍵時(shí)IO先賦值高電平再檢測(cè)是否低電平按下,同樣道理檢測(cè)接電源按鍵先賦值低電平再檢測(cè)是否高電平按下即可。 |
打雜的 發(fā)表于 2025-2-7 13:47 樓主搞了快1個(gè)月還沒(méi)有搞定?給你寫(xiě)個(gè)測(cè)試程序,肯定沒(méi)有問(wèn)題。如果不穩(wěn)定把你電路中R5省略或改為1K
|
lkc8210 發(fā)表于 2025-1-13 16:15 可參看我的博文https://blog.csdn.net/xianfajushi/article/details/106518315 |
51hei.gif (791.92 KB, 下載次數(shù): 0)
按照你們寫(xiě)的程序,實(shí)際測(cè)試按鍵無(wú)效。能寫(xiě)一個(gè)完整的程序嗎?感謝,最好是51單片機(jī),在學(xué)習(xí),電路是沒(méi)有問(wèn)題,是我們之前工程師做到一個(gè)遙控器。 |
wlefa 發(fā)表于 2025-1-13 21:13 你說(shuō)的“恰巧”有可能存在,也就是說(shuō)上述代碼確有漏洞。應(yīng)該加一個(gè)限制條件,有任何按鍵按下才開(kāi)始判讀,規(guī)避“恰巧”。 char key_scan() { B4=0;B3=1;B2=1;//B4初始為0 if(!B2 || !B3)//有任何按鍵按下條件成立 { B4=1;//識(shí)別S1、S2 if(!B2)return 1; if(!B3)return 2; B4=0;//識(shí)別S3、S4 if(!B2)return 3; if(!B3)return 4; } return 0; } |
wlefa 發(fā)表于 2025-1-13 21:13 大概是概率低到一定程度就忽略了。 |
WL0123 發(fā)表于 2025-1-12 20:34 如果恰巧在 if(B2==0)return 1;語(yǔ)句之后才按下S1呢?又或者恰巧在else if(B3==0)return 2;語(yǔ)句后才按下S2呢?會(huì)不會(huì)出錯(cuò)? |
xianfajushi 發(fā)表于 2025-1-13 15:35 請(qǐng)問(wèn)接電源的按鍵如何判斷? |
可以進(jìn)一步節(jié)省1個(gè)IO口,用2個(gè)IO口就能實(shí)現(xiàn)4個(gè)按鍵檢測(cè),2個(gè)電阻接地,2個(gè)電阻接電源,都當(dāng)獨(dú)立按鍵處理. |
IO口不夠用,還不如用ADC讀鍵值 |
本帖最后由 jjy1039 于 2025-1-15 10:10 編輯 b2=1;b3=1;b4=1; if(b2==0){ }//S1 if(b3==0){ }//S2 b2=1;b3=0;b4=1; if(b2==0){ }//S1 if(b4==0){ }//S4 b2=0;b3=1;b4=1; if(b3==0){ }//S2 if(b4==0){ }//S3 |
先b2、b3、b4都置1,此時(shí)s3、s4無(wú)效,可以讀取s1和s2, 再b3置0,b2、b4置1,此時(shí)s2、s3無(wú)效,可以讀取s1和s4, 再b2置0、b3、b4置1,此時(shí)s1、s4無(wú)效,可以讀取s3和s2 以上缺點(diǎn)是,同時(shí)按下兩個(gè)以上按鈕,會(huì)導(dǎo)致誤判,但是只要不同時(shí)按下兩個(gè)以上,就可以使用 |
沙發(fā)的程序通過(guò)改變b4判斷按鍵,符合電路圖作者的思路,我下面還有另外一種思路,就是去掉電阻,利用改變b2和b3電平,也可以判斷,而且誤判可能性更小。 |
本人不才,問(wèn)一下不按任何鍵,B2,B3讀出來(lái)數(shù)據(jù)是1還是0? |
xiaobendan001 發(fā)表于 2025-1-12 14:20 如果你按著S1不放,if(B2==0)return 1;,程序已經(jīng)返回,根本運(yùn)行不到下面代碼,只有S1和S2都沒(méi)有按下才能運(yùn)行到B4=0;,注意關(guān)鍵字return,這是基礎(chǔ)知識(shí)。 |
B4=1,檢測(cè)B2、B3是否有鍵按下, 有則處理按鍵。 沒(méi)有,則B4=0,檢測(cè)B2、B3是否有鍵按下。 |
xiaobendan001 發(fā)表于 2025-1-12 14:20 所以原代碼提供者說(shuō)明了實(shí)用代碼需要補(bǔ)充完善啊,先理解一下電路和掃描按鍵如何編程吧 |
人中狼 發(fā)表于 2025-1-12 09:21 B4=1時(shí),按S1我能理解,B4=0時(shí),我按的仍然是S1,你試試這個(gè)代碼返回的是幾? |
xiaobendan001 發(fā)表于 2025-1-12 07:34 先看懂電路和代碼再說(shuō)吧 |
WL0123 發(fā)表于 2025-1-11 16:53 很明顯這個(gè)不對(duì),說(shuō)下怎么完善吧 |
你這電路有問(wèn)題吧?B2、B3如果不接上拉電阻,按鍵相當(dāng)于直接短路路了。 |
這只是讀鍵值的基本邏輯關(guān)系,實(shí)用代碼需要補(bǔ)充完善。 char key_scan() { B4=1;B3=1;B2=1; if(B2==0)return 1; else if(B3==0)return 2; B4=0; if(B2==0)return 3; else if(B3==0)return 4; else return 0; } |
Powered by 單片機(jī)教程網(wǎng)