找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

3個IO口這樣能接6個按鍵嗎?

查看數(shù): 1542 | 評論數(shù): 26 | 收藏 1
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2025-1-14 00:39

正文摘要:

請完善程序

回復

ID:1143230 發(fā)表于 2025-1-20 14:02
也可以
ID:584814 發(fā)表于 2025-1-20 11:39
3個IO口這樣能接6個按鍵,是查理復用接法的上限,并不是51單片機能力的上限。
用電阻電壓法理論上可以單口無限,實際單口接三五個也很常見。
ID:69038 發(fā)表于 2025-1-17 14:29
太陽雨ZW 發(fā)表于 2025-1-17 11:01
手中還有過去買的幾十個,放著浪費了,現(xiàn)在用來做些小制做利用下。

也是哈,就DIY樂呵樂呵,真做項目不要再考慮用它了。
ID:69038 發(fā)表于 2025-1-17 14:27
xiaobendan001 發(fā)表于 2025-1-17 09:54
我手里還有一點庫存呢,你要不?

我要這東西做什么哎。。。
手里還的幾十個8G1K08A的,當時剛出來沒多久就買了,放在手里吃灰呢。。
ID:1136941 發(fā)表于 2025-1-17 12:15
devcang 發(fā)表于 2025-1-14 15:38
再加3只二極管,可以7個按鈕

也可以接10個按鍵,7個加B1-B2,B2-B3,B1-B3三個。
ID:1136941 發(fā)表于 2025-1-17 11:05
單片機學習習 發(fā)表于 2025-1-16 20:55
可以,但是那3個I/O必須帶ADC功能

3個口帶ADC,沒有搞懂
ID:1136941 發(fā)表于 2025-1-17 11:01
zhuls 發(fā)表于 2025-1-17 09:16
AT89C2051,可以說是史前文物了!
現(xiàn)在哪家上新項目還用這料?
現(xiàn)在新出的20腳MCU,哪個性能配置比不過 ...

手中還有過去買的幾十個,放著浪費了,現(xiàn)在用來做些小制做利用下。
ID:1109793 發(fā)表于 2025-1-17 09:54
zhuls 發(fā)表于 2025-1-17 09:16
AT89C2051,可以說是史前文物了!
現(xiàn)在哪家上新項目還用這料?
現(xiàn)在新出的20腳MCU,哪個性能配置比不過 ...

我手里還有一點庫存呢,你要不?
ID:69038 發(fā)表于 2025-1-17 09:16
太陽雨ZW 發(fā)表于 2025-1-15 13:31
用的是AT89C2051,不帶ADC

AT89C2051,可以說是史前文物了!
現(xiàn)在哪家上新項目還用這料?
現(xiàn)在新出的20腳MCU,哪個性能配置比不過它?除了固有的庫存,全新貨還貴的要人命。。
ID:264021 發(fā)表于 2025-1-16 20:55
可以,但是那3個I/O必須帶ADC功能
ID:1034262 發(fā)表于 2025-1-16 13:17

3個IO不需要節(jié)任何別的零件,可以節(jié)6個按鍵:
IO1、IO2、IO3分別對地接一個按鍵。
IO1-IO2、IO1-IO3、IO2-IO3接3個按鍵。
ID:1136941 發(fā)表于 2025-1-15 13:31
zhuls 發(fā)表于 2025-1-14 15:49
邏輯上沒啥問題。
但對于現(xiàn)在的MCU來說,意義不大,
6個4148不是錢?

用的是AT89C2051,不帶ADC
ID:161164 發(fā)表于 2025-1-15 09:44
太陽雨ZW 發(fā)表于 2025-1-14 16:48
這樣就很完善了,學習了。

5樓提醒了我,代碼可以簡化為

  1. sbit Pin_B1 = P3^2;
  2. sbit Pin_B2 = P3^3;
  3. sbit Pin_B3 = P3^4;
  4. u8 KeyVal = 0;//用完清零
  5. void key_Proc()//多鍵短按,1ms中斷內(nèi)運行
  6. {
  7.         static u8 Delay_XD=0; //消抖計數(shù)
  8.         static bit ons = 0;
  9.         u8 KeyTemp = 0;
  10.         if(!Pin_B1)KeyTemp |= 0x01;
  11.         if(!Pin_B2)KeyTemp |= 0x02;
  12.         if(!Pin_B3)KeyTemp |= 0x04;
  13.         if(KeyTemp)
  14.         {
  15.                 if(++Delay_XD>=20 && !ons) //消抖
  16.                 {
  17.                         ons = 1;
  18.                         KeyVal = KeyTemp;
  19.                 }
  20.         }
  21.         else //按鍵抬起
  22.         {
  23.                 Delay_XD=0; //Delay_XD清0
  24.                 ons = 0;
  25.         }
  26. }
復制代碼
ID:1109793 發(fā)表于 2025-1-14 18:50
這是都對地接,如果接兩個IO之間,是不是還能更多?
ID:1136941 發(fā)表于 2025-1-14 16:48

這樣就很完善了,學習了。
ID:446156 發(fā)表于 2025-1-14 16:37
注意按鍵不要同時按下多個就行
ID:69038 發(fā)表于 2025-1-14 15:49
邏輯上沒啥問題。
但對于現(xiàn)在的MCU來說,意義不大,
6個4148不是錢?
為什么不用AD口來測按鍵?還能少兩個IO。
要知道硬件成本遠大于軟件成本。
ID:277550 發(fā)表于 2025-1-14 15:38
再加3只二極管,可以7個按鈕
ID:277550 發(fā)表于 2025-1-14 15:26
邏輯像是 3 排列,取2個、和取1個。

這硬件電路沒有問題,測試過。
程序中,可以使用掃描,也可以用3個中斷、再判斷哪個按鈕
ID:1143011 發(fā)表于 2025-1-14 15:24
不知道什么原理 ,為何不用ADC口
ID:161164 發(fā)表于 2025-1-14 14:46

  1. sbit Pin_B1 = P3^2;
  2. sbit Pin_B2 = P3^3;
  3. sbit Pin_B3 = P3^4;
  4. u8 KeyVal = 0;//用完清零
  5. void key_Proc()//多鍵短按,1ms中斷內(nèi)運行
  6. {
  7.         static u8 Delay_XD=0; //消抖計數(shù)
  8.         static bit ons = 0;
  9.         if(!Pin_B1 || !Pin_B2 || !Pin_B3)
  10.         {
  11.                 if(++Delay_XD>=20 && !ons) //消抖
  12.                 {
  13.                         ons = 1;
  14.                         if(!Pin_B1 && !Pin_B2)
  15.                         {
  16.                                 KeyVal = SW2;
  17.                         }else if(!Pin_B2 && !Pin_B3)
  18.                         {
  19.                                 KeyVal = SW4;
  20.                         }else if(!Pin_B1 && !Pin_B3)
  21.                         {
  22.                                 KeyVal = SW6;
  23.                         }else{
  24.                                 if(!Pin_B1)
  25.                                 {
  26.                                         KeyVal = SW1;
  27.                                 }
  28.                                 if(!Pin_B2)
  29.                                 {
  30.                                         KeyVal = SW3;
  31.                                 }
  32.                                 if(!Pin_B3
  33.                                 {
  34.                                         KeyVal = SW5;
  35.                                 }                               
  36.                         }
  37.                 }
  38.         }
  39.         else //按鍵抬起
  40.         {
  41.                 Delay_XD=0; //Delay_XD清0
  42.                 ons = 0;
  43.         }
  44. }
復制代碼


ID:476244 發(fā)表于 2025-1-14 14:00
可以,也可以再接第7個開關(guān)同時拉低三個I/O口。
也可以只用3個開關(guān)組合使用。
二進制的 000-111 。
ID:1003477 發(fā)表于 2025-1-14 13:47
判斷B1、B2、B3的電平高低   b1低且b2、b3高對應sw1,b2低且b1、b3高對應sw3,b3低且b1、b2高對應sw5,b1、b2低且b3高對應sw2......
ID:1136941 發(fā)表于 2025-1-14 10:47
這樣寫可以實用吧,消抖用按鍵并電容,
char key()
{
  B1=1;
  B2=1;
  B3=1;
        if(B1==0)return 1;
else  if(B1==0&&B2==0)return 2;
else  if(B2==0)return 3;
else  if(B2==0&&B3==0)return 4;
else  if(B3==0)return 5;
else  if(B3==0&&B1==0)return 6;
else  return 0;
}
ID:526108 發(fā)表于 2025-1-14 10:28

什么亂七八糟的,來搞笑的吧

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表