久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1916|回復: 32
收起左側

圖中的4個按鍵,只有3個IO,如何實現按鍵檢測?

  [復制鏈接]
ID:218360 發表于 2025-1-11 09:15 | 顯示全部樓層 |閱讀模式
      看到別人的電路圖,這4個按鍵怎么掃描檢測?求大神附上代碼謝謝。
bfbdc765-fd98-4fd4-89fd-a12ee5f9590a.png
回復

使用道具 舉報

ID:1133081 發表于 2025-1-11 16:53 | 顯示全部樓層
這只是讀鍵值的基本邏輯關系,實用代碼需要補充完善。
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;
}
回復

使用道具 舉報

ID:1041695 發表于 2025-1-11 21:07 | 顯示全部樓層
你這電路有問題吧?B2、B3如果不接上拉電阻,按鍵相當于直接短路路了。
回復

使用道具 舉報

ID:1109793 發表于 2025-1-12 07:34 | 顯示全部樓層
WL0123 發表于 2025-1-11 16:53
這只是讀鍵值的基本邏輯關系,實用代碼需要補充完善。
char key_scan()
{

很明顯這個不對,說下怎么完善吧
回復

使用道具 舉報

ID:384109 發表于 2025-1-12 09:21 | 顯示全部樓層
xiaobendan001 發表于 2025-1-12 07:34
很明顯這個不對,說下怎么完善吧

先看懂電路和代碼再說吧
回復

使用道具 舉報

ID:1109793 發表于 2025-1-12 14:20 | 顯示全部樓層
人中狼 發表于 2025-1-12 09:21
先看懂電路和代碼再說吧

B4=1時,按S1我能理解,B4=0時,我按的仍然是S1,你試試這個代碼返回的是幾?
回復

使用道具 舉報

ID:384109 發表于 2025-1-12 16:28 | 顯示全部樓層
xiaobendan001 發表于 2025-1-12 14:20
B4=1時,按S1我能理解,B4=0時,我按的仍然是S1,你試試這個代碼返回的是幾?

所以原代碼提供者說明了實用代碼需要補充完善啊,先理解一下電路和掃描按鍵如何編程吧
回復

使用道具 舉報

ID:1034262 發表于 2025-1-12 20:04 | 顯示全部樓層
B4=1,檢測B2、B3是否有鍵按下,
有則處理按鍵。
沒有,則B4=0,檢測B2、B3是否有鍵按下。
回復

使用道具 舉報

ID:1133081 發表于 2025-1-12 20:34 | 顯示全部樓層
xiaobendan001 發表于 2025-1-12 14:20
B4=1時,按S1我能理解,B4=0時,我按的仍然是S1,你試試這個代碼返回的是幾?

如果你按著S1不放,if(B2==0)return 1;,程序已經返回,根本運行不到下面代碼,只有S1和S2都沒有按下才能運行到B4=0;,注意關鍵字return,這是基礎知識。
回復

使用道具 舉報

ID:996773 發表于 2025-1-13 08:58 | 顯示全部樓層
本人不才,問一下不按任何鍵,B2,B3讀出來數據是1還是0?
回復

使用道具 舉報

ID:92781 發表于 2025-1-13 10:06 | 顯示全部樓層
沙發的程序通過改變b4判斷按鍵,符合電路圖作者的思路,我下面還有另外一種思路,就是去掉電阻,利用改變b2和b3電平,也可以判斷,而且誤判可能性更小。
回復

使用道具 舉報

ID:92781 發表于 2025-1-13 10:17 | 顯示全部樓層
先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
以上缺點是,同時按下兩個以上按鈕,會導致誤判,但是只要不同時按下兩個以上,就可以使用
回復

使用道具 舉報

ID:92781 發表于 2025-1-13 10:36 | 顯示全部樓層
本帖最后由 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
回復

使用道具 舉報

ID:23640 發表于 2025-1-13 14:13 | 顯示全部樓層
IO口不夠用,還不如用ADC讀鍵值
回復

使用道具 舉報

ID:332444 發表于 2025-1-13 15:35 | 顯示全部樓層
可以進一步節省1個IO口,用2個IO口就能實現4個按鍵檢測,2個電阻接地,2個電阻接電源,都當獨立按鍵處理.
回復

使用道具 舉報

ID:161164 發表于 2025-1-13 16:15 | 顯示全部樓層
xianfajushi 發表于 2025-1-13 15:35
可以進一步節省1個IO口,用2個IO口就能實現4個按鍵檢測,2個電阻接地,2個電阻接電源,都當獨立按鍵處理.

請問接電源的按鍵如何判斷?
回復

使用道具 舉報

ID:380037 發表于 2025-1-13 21:13 | 顯示全部樓層
WL0123 發表于 2025-1-12 20:34
如果你按著S1不放,if(B2==0)return 1;,程序已經返回,根本運行不到下面代碼,只有S1和S2都沒有按下才能 ...

如果恰巧在 if(B2==0)return 1;語句之后才按下S1呢?又或者恰巧在else if(B3==0)return 2;語句后才按下S2呢?會不會出錯?
回復

使用道具 舉報

ID:1109793 發表于 2025-1-14 13:09 | 顯示全部樓層
wlefa 發表于 2025-1-13 21:13
如果恰巧在 if(B2==0)return 1;語句之后才按下S1呢?又或者恰巧在else if(B3==0)return 2;語句后才按下S2 ...

大概是概率低到一定程度就忽略了。
回復

使用道具 舉報

ID:1133081 發表于 2025-1-15 06:03 | 顯示全部樓層
wlefa 發表于 2025-1-13 21:13
如果恰巧在 if(B2==0)return 1;語句之后才按下S1呢?又或者恰巧在else if(B3==0)return 2;語句后才按下S2 ...

你說的“恰巧”有可能存在,也就是說上述代碼確有漏洞。應該加一個限制條件,有任何按鍵按下才開始判讀,規避“恰巧”。
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;
}
回復

使用道具 舉報

ID:218360 發表于 2025-2-7 13:47 | 顯示全部樓層
按照你們寫的程序,實際測試按鍵無效。能寫一個完整的程序嗎?感謝,最好是51單片機,在學習,電路是沒有問題,是我們之前工程師做到一個遙控器。
回復

使用道具 舉報

ID:332444 發表于 2025-2-8 07:48 | 顯示全部樓層
lkc8210 發表于 2025-1-13 16:15
請問接電源的按鍵如何判斷?

可參看我的博文https://blog.csdn.net/xianfajushi/article/details/106518315

51hei.gif
回復

使用道具 舉報

ID:1133081 發表于 2025-2-8 08:33 | 顯示全部樓層
打雜的 發表于 2025-2-7 13:47
按照你們寫的程序,實際測試按鍵無效。能寫一個完整的程序嗎?感謝,最好是51單片機,在學習,電路是沒有問 ...

樓主搞了快1個月還沒有搞定?給你寫個測試程序,肯定沒有問題。如果不穩定把你電路中R5省略或改為1K
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit B2=P3^0;
  4. sbit B3=P3^1;
  5. sbit B4=P3^2;

  6. #define uint unsigned int
  7. #define uchar unsigned char

  8. void Delay_ms(uint t)//@12MHz
  9. {
  10.         uint i,j;
  11.         for(i=t;i>0;i--)
  12.                 for(j=120;j>0;j--);
  13. }

  14. char key_scan()
  15. {
  16.         static uint count=0;//消抖計數
  17.         static bit sign=0;  //按鍵狀態標志
  18.         B4=0;B3=1;B2=1;//B4初始為0
  19.         if(!B2 || !B3)//有任何按鍵按下條件成立
  20.         {
  21.                 if(++count>=20 && sign==0)//約20ms消抖
  22.                 {
  23.                         sign=1;
  24.                         B4=1;//識別S1、S2
  25.                         _nop_();//小延時
  26.                         if(!B2)return 1;
  27.                         if(!B3)return 2;
  28.                         B4=0;//識別S3、S4
  29.                         _nop_();//小延時
  30.                         if(!B2)return 3;
  31.                         if(!B3)return 4;
  32.                 }
  33.         }
  34.         else //松手
  35.         {
  36.                 count=0;//消抖計數清0
  37.                 sign=0;//按鍵狀態標志清0               
  38.                 return 0;//返回0
  39.         }
  40. }

  41. void key_service()
  42. {
  43.         uchar i;
  44.         i=key_scan();
  45.         switch(i)
  46.         {//用P1低4位驗證鍵值
  47.                 case 1: P1=0xfe; i=0; break;
  48.                 case 2: P1=0xfd; i=0; break;
  49.                 case 3: P1=0xfb; i=0; break;
  50.                 case 4: P1=0xf7; i=0; break;
  51.         }
  52. }

  53. void main()
  54. {
  55.         while (1)
  56.         {
  57.                 key_service();
  58.                 Delay_ms(1);//控制主循環周期
  59.         }
  60. }
復制代碼
回復

使用道具 舉報

ID:332444 發表于 2025-2-10 21:57 | 顯示全部樓層
lkc8210 發表于 2025-1-13 16:15
請問接電源的按鍵如何判斷?

除了P0外的都可用來制作1個IO檢測2個按鍵用,特別適合閑散IO,1個按鍵接地1個按鍵接電源,檢測接地按鍵時IO先賦值高電平再檢測是否低電平按下,同樣道理檢測接電源按鍵先賦值低電平再檢測是否高電平按下即可。
回復

使用道具 舉報

ID:654797 發表于 2025-2-11 07:03 | 顯示全部樓層
lei848200 發表于 2025-1-11 21:07
你這電路有問題吧?B2、B3如果不接上拉電阻,按鍵相當于直接短路路了。

單片機的引腳又不是不能短路的,人家只檢測低電平,短路沒問題呀
回復

使用道具 舉報

ID:1137088 發表于 2025-2-11 08:31 | 顯示全部樓層
電路圖可以改一下
回復

使用道具 舉報

ID:60370 發表于 2025-2-11 16:19 | 顯示全部樓層
電路沒問題,就看怎么寫了,I/O口需要不斷變換實時檢測判斷,B4高低切換,配合B2、B3設置開漏(或高阻抗輸入)和標準I/O口設置切換來檢測判斷
回復

使用道具 舉報

ID:161164 發表于 2025-2-12 10:06 | 顯示全部樓層
xianfajushi 發表于 2025-2-10 21:57
除了P0外的都可用來制作1個IO檢測2個按鍵用,特別適合閑散IO,1個按鍵接地1個按鍵接電源,檢測接地按鍵時 ...

?
“先賦值低電平再檢測是否高”
先賦值低電平不就打開了內置對地的MOS管?
如果再按接電源正的按鍵不就短路?
回復

使用道具 舉報

ID:161164 發表于 2025-2-12 10:21 | 顯示全部樓層
wlefa 發表于 2025-1-13 21:13
如果恰巧在 if(B2==0)return 1;語句之后才按下S1呢?又或者恰巧在else if(B3==0)return 2;語句后才按下S2 ...

要加濾波消抖代碼 2025-02-12_101846.png

回復

使用道具 舉報

ID:218360 發表于 2025-2-12 15:31 | 顯示全部樓層
WL0123 發表于 2025-2-8 08:33
樓主搞了快1個月還沒有搞定?給你寫個測試程序,肯定沒有問題。如果不穩定把你電路中R5省略或改為1K

使用你們的代碼,編譯通不過,報錯not every exit path returns a value
回復

使用道具 舉報

ID:332444 發表于 2025-2-13 10:46 | 顯示全部樓層
lkc8210 發表于 2025-2-12 10:06
?
“先賦值低電平再檢測是否高”
先賦值低電平不就打開了內置對地的MOS管?

昨天查閱了IO內部電路,確實有些冒險,只在仿真中試用過,且仿真圖有黃顏色的點,低壓極短時間內仿真沒報錯,實際硬件沒用過,請慎之。
回復

使用道具 舉報

ID:218360 發表于 2025-2-18 16:40 | 顯示全部樓層
我說咋編譯不過,大神故意留BUG讓我找?
51hei截圖_20250218163858.png
回復

使用道具 舉報

ID:624769 發表于 2025-2-19 10:24 | 顯示全部樓層
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 按下。

回復

使用道具 舉報

ID:218360 發表于 2025-2-20 09:26 | 顯示全部樓層
這個是我的電路圖,我實測還是不能實現按鍵按下指示燈閃一下。目前可以實現S1和S2,S3和S4控制不了,一直為低電平
3853AAD458D49EA1346E36FE8830A633.png
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品国产精品青草 | 国产99久久久国产精品 | 国产不卡在线 | 国产欧美精品一区二区 | 国产精品18久久久久久久 | 亚洲综合在线网 | 在线观看国产视频 | 日韩三级 | 欧美xxxx性xxxxx高清 | avhd101在线成人播放 | 亚洲欧美视频一区 | 国产欧美在线 | 99精品国产一区二区三区 | 久久午夜视频 | 一本大道久久a久久精二百 国产成人免费在线 | 久久一| 美国一级片在线观看 | 亚洲一级黄色 | 在线亚洲人成电影网站色www | 久久成人免费 | 欧美激情欧美激情在线五月 | 欧美综合一区二区 | 国产精品久久久 | 亚洲精品久久久久avwww潮水 | 蜜桃视频在线观看免费视频网站www | 久久久av | 欧美视频在线观看 | 在线看一区二区三区 | 欧美在线视频一区二区 | 欧美性视频在线播放 | 天天干亚洲 | 久久久久久免费观看 | 91精品久久久久久久久 | 天久久| 欧美精品欧美精品系列 | 91亚洲国产亚洲国产 | 国产精品18久久久久久久 | 日本三级电影在线看 | 日本粉嫩一区二区三区视频 | 久久专区 | 免费观看视频www |