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