欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 圖中的4個(gè)按鍵,只有3個(gè)IO,如何實(shí)現(xiàn)按鍵檢測(cè)? [打印本頁(yè)]

作者: 打雜的    時(shí)間: 2025-1-11 09:15
標(biāo)題: 圖中的4個(gè)按鍵,只有3個(gè)IO,如何實(shí)現(xiàn)按鍵檢測(cè)?
      看到別人的電路圖,這4個(gè)按鍵怎么掃描檢測(cè)?求大神附上代碼謝謝。

bfbdc765-fd98-4fd4-89fd-a12ee5f9590a.png (32.33 KB, 下載次數(shù): 0)

bfbdc765-fd98-4fd4-89fd-a12ee5f9590a.png

作者: WL0123    時(shí)間: 2025-1-11 16:53
這只是讀鍵值的基本邏輯關(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;
}
作者: lei848200    時(shí)間: 2025-1-11 21:07
你這電路有問(wèn)題吧?B2、B3如果不接上拉電阻,按鍵相當(dāng)于直接短路路了。
作者: xiaobendan001    時(shí)間: 2025-1-12 07:34
WL0123 發(fā)表于 2025-1-11 16:53
這只是讀鍵值的基本邏輯關(guān)系,實(shí)用代碼需要補(bǔ)充完善。
char key_scan()
{

很明顯這個(gè)不對(duì),說(shuō)下怎么完善吧
作者: 人中狼    時(shí)間: 2025-1-12 09:21
xiaobendan001 發(fā)表于 2025-1-12 07:34
很明顯這個(gè)不對(duì),說(shuō)下怎么完善吧

先看懂電路和代碼再說(shuō)吧

作者: xiaobendan001    時(shí)間: 2025-1-12 14:20
人中狼 發(fā)表于 2025-1-12 09:21
先看懂電路和代碼再說(shuō)吧

B4=1時(shí),按S1我能理解,B4=0時(shí),我按的仍然是S1,你試試這個(gè)代碼返回的是幾?
作者: 人中狼    時(shí)間: 2025-1-12 16:28
xiaobendan001 發(fā)表于 2025-1-12 14:20
B4=1時(shí),按S1我能理解,B4=0時(shí),我按的仍然是S1,你試試這個(gè)代碼返回的是幾?

所以原代碼提供者說(shuō)明了實(shí)用代碼需要補(bǔ)充完善啊,先理解一下電路和掃描按鍵如何編程吧
作者: coody_sz    時(shí)間: 2025-1-12 20:04
B4=1,檢測(cè)B2、B3是否有鍵按下,
有則處理按鍵。
沒(méi)有,則B4=0,檢測(cè)B2、B3是否有鍵按下。

作者: WL0123    時(shí)間: 2025-1-12 20:34
xiaobendan001 發(fā)表于 2025-1-12 14:20
B4=1時(shí),按S1我能理解,B4=0時(shí),我按的仍然是S1,你試試這個(gè)代碼返回的是幾?

如果你按著S1不放,if(B2==0)return 1;,程序已經(jīng)返回,根本運(yùn)行不到下面代碼,只有S1和S2都沒(méi)有按下才能運(yùn)行到B4=0;,注意關(guān)鍵字return,這是基礎(chǔ)知識(shí)。
作者: hi等你    時(shí)間: 2025-1-13 08:58
本人不才,問(wèn)一下不按任何鍵,B2,B3讀出來(lái)數(shù)據(jù)是1還是0?
作者: jjy1039    時(shí)間: 2025-1-13 10:06
沙發(fā)的程序通過(guò)改變b4判斷按鍵,符合電路圖作者的思路,我下面還有另外一種思路,就是去掉電阻,利用改變b2和b3電平,也可以判斷,而且誤判可能性更小。
作者: jjy1039    時(shí)間: 2025-1-13 10:17
先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è)以上,就可以使用
作者: jjy1039    時(shí)間: 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
作者: yaosongjin    時(shí)間: 2025-1-13 14:13
IO口不夠用,還不如用ADC讀鍵值
作者: xianfajushi    時(shí)間: 2025-1-13 15:35
可以進(jìn)一步節(jié)省1個(gè)IO口,用2個(gè)IO口就能實(shí)現(xiàn)4個(gè)按鍵檢測(cè),2個(gè)電阻接地,2個(gè)電阻接電源,都當(dāng)獨(dú)立按鍵處理.
作者: lkc8210    時(shí)間: 2025-1-13 16:15
xianfajushi 發(fā)表于 2025-1-13 15:35
可以進(jìn)一步節(jié)省1個(gè)IO口,用2個(gè)IO口就能實(shí)現(xiàn)4個(gè)按鍵檢測(cè),2個(gè)電阻接地,2個(gè)電阻接電源,都當(dāng)獨(dú)立按鍵處理.

請(qǐng)問(wèn)接電源的按鍵如何判斷?
作者: wlefa    時(shí)間: 2025-1-13 21:13
WL0123 發(fā)表于 2025-1-12 20:34
如果你按著S1不放,if(B2==0)return 1;,程序已經(jīng)返回,根本運(yùn)行不到下面代碼,只有S1和S2都沒(méi)有按下才能 ...

如果恰巧在 if(B2==0)return 1;語(yǔ)句之后才按下S1呢?又或者恰巧在else if(B3==0)return 2;語(yǔ)句后才按下S2呢?會(huì)不會(huì)出錯(cuò)?
作者: xiaobendan001    時(shí)間: 2025-1-14 13:09
wlefa 發(fā)表于 2025-1-13 21:13
如果恰巧在 if(B2==0)return 1;語(yǔ)句之后才按下S1呢?又或者恰巧在else if(B3==0)return 2;語(yǔ)句后才按下S2 ...

大概是概率低到一定程度就忽略了。
作者: WL0123    時(shí)間: 2025-1-15 06:03
wlefa 發(fā)表于 2025-1-13 21:13
如果恰巧在 if(B2==0)return 1;語(yǔ)句之后才按下S1呢?又或者恰巧在else if(B3==0)return 2;語(yǔ)句后才按下S2 ...

你說(shuō)的“恰巧”有可能存在,也就是說(shuō)上述代碼確有漏洞。應(yīng)該加一個(gè)限制條件,有任何按鍵按下才開始判讀,規(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;
}
作者: 打雜的    時(shí)間: 2025-2-7 13:47
按照你們寫的程序,實(shí)際測(cè)試按鍵無(wú)效。能寫一個(gè)完整的程序嗎?感謝,最好是51單片機(jī),在學(xué)習(xí),電路是沒(méi)有問(wèn)題,是我們之前工程師做到一個(gè)遙控器。
作者: xianfajushi    時(shí)間: 2025-2-8 07:48
lkc8210 發(fā)表于 2025-1-13 16:15
請(qǐng)問(wèn)接電源的按鍵如何判斷?

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

51hei.gif (791.92 KB, 下載次數(shù): 0)

51hei.gif

作者: WL0123    時(shí)間: 2025-2-8 08:33
打雜的 發(fā)表于 2025-2-7 13:47
按照你們寫的程序,實(shí)際測(cè)試按鍵無(wú)效。能寫一個(gè)完整的程序嗎?感謝,最好是51單片機(jī),在學(xué)習(xí),電路是沒(méi)有問(wèn) ...

樓主搞了快1個(gè)月還沒(méi)有搞定?給你寫個(gè)測(cè)試程序,肯定沒(méi)有問(wèn)題。如果不穩(wěn)定把你電路中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;//消抖計(jì)數(shù)
  17.         static bit sign=0;  //按鍵狀態(tài)標(biāo)志
  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;//識(shí)別S1、S2
  25.                         _nop_();//小延時(shí)
  26.                         if(!B2)return 1;
  27.                         if(!B3)return 2;
  28.                         B4=0;//識(shí)別S3、S4
  29.                         _nop_();//小延時(shí)
  30.                         if(!B2)return 3;
  31.                         if(!B3)return 4;
  32.                 }
  33.         }
  34.         else //松手
  35.         {
  36.                 count=0;//消抖計(jì)數(shù)清0
  37.                 sign=0;//按鍵狀態(tài)標(biāo)志清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位驗(yàn)證鍵值
  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);//控制主循環(huán)周期
  59.         }
  60. }
復(fù)制代碼

作者: xianfajushi    時(shí)間: 2025-2-10 21:57
lkc8210 發(fā)表于 2025-1-13 16:15
請(qǐng)問(wèn)接電源的按鍵如何判斷?

除了P0外的都可用來(lái)制作1個(gè)IO檢測(cè)2個(gè)按鍵用,特別適合閑散IO,1個(gè)按鍵接地1個(gè)按鍵接電源,檢測(cè)接地按鍵時(shí)IO先賦值高電平再檢測(cè)是否低電平按下,同樣道理檢測(cè)接電源按鍵先賦值低電平再檢測(cè)是否高電平按下即可。
作者: vscos    時(shí)間: 2025-2-11 07:03
lei848200 發(fā)表于 2025-1-11 21:07
你這電路有問(wèn)題吧?B2、B3如果不接上拉電阻,按鍵相當(dāng)于直接短路路了。

單片機(jī)的引腳又不是不能短路的,人家只檢測(cè)低電平,短路沒(méi)問(wèn)題呀
作者: 646763038    時(shí)間: 2025-2-11 08:31
電路圖可以改一下
作者: runmuel    時(shí)間: 2025-2-11 16:19
電路沒(méi)問(wèn)題,就看怎么寫了,I/O口需要不斷變換實(shí)時(shí)檢測(cè)判斷,B4高低切換,配合B2、B3設(shè)置開漏(或高阻抗輸入)和標(biāo)準(zhǔn)I/O口設(shè)置切換來(lái)檢測(cè)判斷
作者: lkc8210    時(shí)間: 2025-2-12 10:06
xianfajushi 發(fā)表于 2025-2-10 21:57
除了P0外的都可用來(lái)制作1個(gè)IO檢測(cè)2個(gè)按鍵用,特別適合閑散IO,1個(gè)按鍵接地1個(gè)按鍵接電源,檢測(cè)接地按鍵時(shí) ...

?
“先賦值低電平再檢測(cè)是否高”
先賦值低電平不就打開了內(nèi)置對(duì)地的MOS管?
如果再按接電源正的按鍵不就短路?
作者: lkc8210    時(shí)間: 2025-2-12 10:21
wlefa 發(fā)表于 2025-1-13 21:13
如果恰巧在 if(B2==0)return 1;語(yǔ)句之后才按下S1呢?又或者恰巧在else if(B3==0)return 2;語(yǔ)句后才按下S2 ...

要加濾波消抖代碼


作者: 打雜的    時(shí)間: 2025-2-12 15:31
WL0123 發(fā)表于 2025-2-8 08:33
樓主搞了快1個(gè)月還沒(méi)有搞定?給你寫個(gè)測(cè)試程序,肯定沒(méi)有問(wèn)題。如果不穩(wěn)定把你電路中R5省略或改為1K

使用你們的代碼,編譯通不過(guò),報(bào)錯(cuò)not every exit path returns a value
作者: xianfajushi    時(shí)間: 2025-2-13 10:46
lkc8210 發(fā)表于 2025-2-12 10:06
?
“先賦值低電平再檢測(cè)是否高”
先賦值低電平不就打開了內(nèi)置對(duì)地的MOS管?

昨天查閱了IO內(nèi)部電路,確實(shí)有些冒險(xiǎn),只在仿真中試用過(guò),且仿真圖有黃顏色的點(diǎn),低壓極短時(shí)間內(nèi)仿真沒(méi)報(bào)錯(cuò),實(shí)際硬件沒(méi)用過(guò),請(qǐng)慎之。
作者: 打雜的    時(shí)間: 2025-2-18 16:40
我說(shuō)咋編譯不過(guò),大神故意留BUG讓我找?

51hei截圖_20250218163858.png (186.16 KB, 下載次數(shù): 0)

51hei截圖_20250218163858.png

作者: 188610329    時(shí)間: 2025-2-19 10:24
lkc8210 發(fā)表于 2025-1-13 16:15
請(qǐng)問(wèn)接電源的按鍵如何判斷?

雖然可以,但是,對(duì)單片機(jī)的要求比較高,需要有下拉電阻控制器的單片機(jī), 比如 STC8051U 系列,STC32系列等等。
IO設(shè)置為高祖,
1) 開內(nèi)部下拉,關(guān)內(nèi)部上拉,如果 IO = 1, 則: 接VCC的按鍵被按下。
2) 關(guān)內(nè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 按下。


作者: 打雜的    時(shí)間: 2025-2-20 09:26
這個(gè)是我的電路圖,我實(shí)測(cè)還是不能實(shí)現(xiàn)按鍵按下指示燈閃一下。目前可以實(shí)現(xiàn)S1和S2,S3和S4控制不了,一直為低電平

3853AAD458D49EA1346E36FE8830A633.png (91.82 KB, 下載次數(shù): 0)

3853AAD458D49EA1346E36FE8830A633.png





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1