找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5501|回復(fù): 26
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)多按鍵按下的檢測(cè)程序問(wèn)題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
我是初學(xué)單片機(jī)和C語(yǔ)言,覺(jué)得很有意思。所以在網(wǎng)上買了套件。學(xué)到4*4矩陣鍵盤(pán)的時(shí)候,一開(kāi)始就發(fā)現(xiàn)這個(gè)教程的程序太低級(jí),用while去卡住cpu只為了檢測(cè)一個(gè)按鍵是否松開(kāi),商家說(shuō)沒(méi)有更好的辦法,太扯淡了,絕不可能!
所以這幾天在找一些資料,也沒(méi)找到。自己也過(guò)一些辦法嘗試寫(xiě)過(guò),但始終無(wú)法跳出教程給的框架。
所以在論壇發(fā)了求助帖,也有大神回復(fù)了辦法,可能我悟性確實(shí)太低,沒(méi)代碼根本想不通,即使有代碼沒(méi)注釋可能也看不懂。有那么難嗎?可能我不適合學(xué)編程吧,我想我最終也能解決這個(gè)問(wèn)題,不過(guò)估計(jì)是幾年后了。

1.jpg (64.59 KB, 下載次數(shù): 102)

1

1

2.jpg (53.72 KB, 下載次數(shù): 92)

2

2

3.jpg (18.48 KB, 下載次數(shù): 104)

3

3

4.jpg (74.09 KB, 下載次數(shù): 94)

4

4
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:807591 發(fā)表于 2021-1-28 17:04 | 只看該作者
那些客服就是糊弄人的,度娘一圈應(yīng)該能找到你想要的,不要拘泥于別人的套路,自己得思考,也不要看那些代碼寫(xiě)的多高端,甚至一段時(shí)間后自己都看不懂,編譯器很可能會(huì)把那看似高級(jí)的代碼編譯成效率更低下的
回復(fù)

使用道具 舉報(bào)

板凳
ID:516612 發(fā)表于 2021-1-28 17:24 | 只看該作者
szb314 發(fā)表于 2021-1-28 17:04
那些客服就是糊弄人的,度娘一圈應(yīng)該能找到你想要的,不要拘泥于別人的套路,自己得思考,也不要看那些代碼 ...

我就是找了幾天沒(méi)找到才去問(wèn)的,結(jié)果商家的技術(shù)水平這么低。有點(diǎn)失望。其實(shí)實(shí)現(xiàn)什么功能倒是次要的,重要的是實(shí)現(xiàn)按鍵不沖突的編程思路。有些老哥回答的又看不懂,說(shuō)的很簡(jiǎn)單,但實(shí)際又寫(xiě)不出來(lái)。這東西對(duì)新手太勸退了,跟著教程走一點(diǎn)拔高的思維都沒(méi)有,要我照本宣科,講的比他們還好些。
回復(fù)

使用道具 舉報(bào)

地板
ID:633344 發(fā)表于 2021-1-28 18:09 | 只看該作者
就我的認(rèn)知來(lái)說(shuō)鍵盤(pán)分兩種,有些老式的電腦的鍵盤(pán)是編碼鍵盤(pán)(電路設(shè)計(jì)復(fù)雜編程簡(jiǎn)單)早期IBM的個(gè)人計(jì)算機(jī)鍵盤(pán)是非編碼式的,現(xiàn)在的部分薄膜鍵盤(pán)也是非編碼鍵盤(pán)(電路簡(jiǎn)單編程稍復(fù)雜)單片機(jī)使用最多的就是非編碼按鍵也就是需要行和列掃描通過(guò)電平的高低來(lái)實(shí)現(xiàn)檢測(cè)按鍵是否按下
回復(fù)

使用道具 舉報(bào)

5#
ID:633344 發(fā)表于 2021-1-28 18:13 | 只看該作者
還有CPU和MCU是兩個(gè)不同的東西哦,可以MCU是將計(jì)算機(jī)的CPU、RAM、ROM、定時(shí)計(jì)數(shù)器和多種I/O接口集成在一片芯片上,形成芯片級(jí)的芯片,內(nèi)部除了CPU外還有RAM、ROM,可以直接加簡(jiǎn)單的外圍器件(電阻,電容)就可以運(yùn)行代碼了。
回復(fù)

使用道具 舉報(bào)

6#
ID:232366 發(fā)表于 2021-1-28 18:14 來(lái)自手機(jī) | 只看該作者
也有別的辦法  多加學(xué)習(xí)已經(jīng)就知道了我也是這樣的
回復(fù)

使用道具 舉報(bào)

7#
ID:633344 發(fā)表于 2021-1-28 18:17 | 只看該作者
https://blog.csdn.net/andrewniu/article/details/53315881對(duì)于你說(shuō)的鍵盤(pán)沖突可以參見(jiàn)這篇文章,講解了如何處理非編碼鍵盤(pán)的沖突
回復(fù)

使用道具 舉報(bào)

8#
ID:390416 發(fā)表于 2021-1-28 18:29 | 只看該作者
不就是矩陣鍵盤(pán)嗎 你早說(shuō)啊。給你一個(gè) 自己看圖片
回復(fù)

使用道具 舉報(bào)

9#
ID:390416 發(fā)表于 2021-1-28 18:29 | 只看該作者
  1. u8 xdata Key4x4_Read_Byte=3;//矩陣結(jié)果輸出變量
  2. u8 code Key4x4_Buffer[4]={0xfe,0xfd,0xfb,0xf7};
  3. void Key4x4_Scan_Drive()
  4. {
  5.         static xdata u16 count=0;
  6.         u8 i,j,Value;
  7.         count++;
  8.         if(count>1000)
  9.         {
  10.                 count=0;
  11.                 IE2&=~0x08;
  12.                 for(i=0;i<4;i++)
  13.                 {
  14.                         P0=Key4x4_Buffer[i];
  15.                         Value=0x80;
  16.                         for(j=0;j<4;j++)
  17.                         {
  18.                                 if((P0&Value)==0)
  19.                                 {
  20.                                         Key4x4_Read_Byte=j*4+i+1;
  21.                                 }
  22.                                 Value>>=1;
  23.                         }
  24.                 }
  25.                 P0=0xff;
  26.                 IE2|=0x08;
  27.         }
  28. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

10#
ID:516612 發(fā)表于 2021-1-28 18:40 | 只看該作者
yousir 發(fā)表于 2021-1-28 18:13
還有CPU和MCU是兩個(gè)不同的東西哦,可以MCU是將計(jì)算機(jī)的CPU、RAM、ROM、定時(shí)計(jì)數(shù)器和多種I/O接口集成在一片 ...

哎。這我當(dāng)然知道,你都把重點(diǎn)搞錯(cuò)了。重點(diǎn)是那個(gè)技術(shù)用這種話騙我好讓我打消問(wèn)他的念頭
回復(fù)

使用道具 舉報(bào)

11#
ID:516612 發(fā)表于 2021-1-28 18:54 | 只看該作者
yousir 發(fā)表于 2021-1-28 18:09
就我的認(rèn)知來(lái)說(shuō)鍵盤(pán)分兩種,有些老式的電腦的鍵盤(pán)是編碼鍵盤(pán)(電路設(shè)計(jì)復(fù)雜編程簡(jiǎn)單)早期IBM的個(gè)人計(jì)算機(jī) ...

按鍵檢測(cè)不是重點(diǎn),重點(diǎn)是無(wú)沖突,和按鍵松開(kāi)后的檢測(cè)問(wèn)題,電腦鍵盤(pán)就可以實(shí)現(xiàn)這個(gè)功能,一般都是3鍵無(wú)沖,高級(jí)點(diǎn)的6鍵無(wú)沖,有的甚至是全鍵無(wú)沖。這個(gè)功能是肯定能實(shí)現(xiàn)的,而且應(yīng)該不是太難的東西。PC鍵盤(pán)的資料我也查過(guò),都是發(fā)通斷碼的,我這里說(shuō)的是燈,其實(shí)是一個(gè)道理,無(wú)非就是改燈的電平,實(shí)現(xiàn)什么功能是次要的。包括多個(gè)按鍵按下之后的檢測(cè),看起來(lái)也是沒(méi)問(wèn)題的,可是當(dāng)按鍵松開(kāi)的時(shí)候,比如現(xiàn)在按順序按下123,這3個(gè)鍵,當(dāng)1鍵松開(kāi)后怎么檢測(cè)是1鍵松開(kāi)了,而且這時(shí)候2和3還在工作。
回復(fù)

使用道具 舉報(bào)

12#
ID:879809 發(fā)表于 2021-1-28 19:08 | 只看該作者
18674201426 發(fā)表于 2021-1-28 18:54
按鍵檢測(cè)不是重點(diǎn),重點(diǎn)是無(wú)沖突,和按鍵松開(kāi)后的檢測(cè)問(wèn)題,電腦鍵盤(pán)就可以實(shí)現(xiàn)這個(gè)功能,一般都是3鍵無(wú) ...


想要任意按鍵同時(shí)按下無(wú)沖突需要硬件支持,樓主的開(kāi)發(fā)板顯然沒(méi)有。純軟件實(shí)現(xiàn)無(wú)沖突那是白日做夢(mèng)。
回復(fù)

使用道具 舉報(bào)

13#
ID:516612 發(fā)表于 2021-1-28 19:39 | 只看該作者
rundstedt 發(fā)表于 2021-1-28 19:08
想要任意按鍵同時(shí)按下無(wú)沖突需要硬件支持,樓主的開(kāi)發(fā)板顯然沒(méi)有。純軟件實(shí)現(xiàn)無(wú)沖突那是白日做夢(mèng)。

嗯,那我知道,這種是極端情況,因?yàn)椴粌H要考慮軟件的沖突,還要考慮硬件的沖突,因?yàn)榘存I都是并聯(lián)的。我想知道的是,至少軟件上不能有沖突,這樣我們就能挑選出無(wú)硬件沖突的按鍵來(lái)制作擴(kuò)展功能,畢竟那個(gè)教程里面給的用while來(lái)檢測(cè)按鍵松開(kāi)是不科學(xué)的。
回復(fù)

使用道具 舉報(bào)

14#
ID:516612 發(fā)表于 2021-1-28 23:21 | 只看該作者
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2021-1-28 18:29
u8 xdata Key4x4_Read_Byte=3;//矩陣結(jié)果輸出變量
u8 code Key4x4_Buffer[4]={0xfe,0xfd,0xfb,0xf7};
v ...

研究了一下,大概看懂了,這個(gè)應(yīng)該是逐行掃描法吧。
那個(gè)count++應(yīng)該就是延時(shí)吧,每隔10ms運(yùn)行一次掃描程序,然后通過(guò)Key4x4_Read_Byte來(lái)判斷鍵位,繼而可以通過(guò)數(shù)組來(lái)發(fā)送數(shù)據(jù)。
但是這個(gè)應(yīng)該還是不行,當(dāng)按下多個(gè)鍵的時(shí)候,那每隔10ms就會(huì)從最靠近第一個(gè)鍵位的地方依次連續(xù)發(fā)送多個(gè)數(shù)據(jù),而且沒(méi)有按鍵松開(kāi)的檢測(cè),那按鍵松開(kāi)需要執(zhí)行的就沒(méi)法操作了。
回復(fù)

使用道具 舉報(bào)

15#
ID:798201 發(fā)表于 2021-1-29 00:23 | 只看該作者
請(qǐng)看這個(gè)大神的貼,里面有解決方法
http://www.torrancerestoration.com/bbs/dpj-162218-1.html
回復(fù)

使用道具 舉報(bào)

16#
ID:235954 發(fā)表于 2021-1-29 09:01 | 只看該作者
  1.                         if(key_pumb!=0) // 按鍵沒(méi)有按下的時(shí)候
  2.                         {
  3.                                 key_pumb_flag=0;// 標(biāo)志位清零
  4.                         }
  5.                 //按住開(kāi)始跑燈,抽氣(與開(kāi)瓶不能同時(shí)按下兼容)       
  6.                 if(key_pumb==0&&key_motor==0)
  7.                 {
  8.                         delay100us(100);// 消除抖動(dòng)延時(shí)       
  9.                 if(key_pumb==0&&key_motor==0)
  10.                  {
  11.                         //while(key_pumb==0);
  12.                         L_time_all=288;
  13.                         if(key_pumb_flag==0)// 消除抖動(dòng)后再次判斷按鍵是否按下
  14.                         {
  15.                                 key_pumb_num++;if(key_pumb_num>=2){key_pumb_num=0;}//按下抽氣,再按下關(guān)閉
  16.                                 if(key_pumb_num==1){work=1;pumb=1;num++;auto_led_on(4,num);led_start_68();led_start_6A();}
  17.                                 if(key_pumb_num==0){work=0;pumb=0;}
  18.                         }
  19.                         key_pumb_flag=1;// 將標(biāo)志位置1鎖住 表示已經(jīng)按下
  20.                  }
  21.                 }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

17#
ID:420836 發(fā)表于 2021-1-29 09:19 | 只看該作者
感謝樓主的分享。 希望您很快就能解決。
回復(fù)

使用道具 舉報(bào)

18#
ID:330938 發(fā)表于 2021-1-29 09:24 | 只看該作者
樓主不必糾結(jié)了,51開(kāi)發(fā)板現(xiàn)在很多都做的很全面,很顯然你買的這個(gè)牌子是個(gè)不咋樣,至于這個(gè)技術(shù)人員目前還沒(méi)法確定是不是垃圾,但溝通理解能力明顯有缺陷,他根本就沒(méi)有理解你的問(wèn)題就瞎回答.
至于樓主適不適合編程這個(gè)還不能下結(jié)論,至少你能發(fā)現(xiàn)問(wèn)題,沒(méi)法解決問(wèn)題只是你經(jīng)驗(yàn)和能力還需要積累.
WHILE做按鍵是新手入門最常用的方式,等你學(xué)多了之后這個(gè)問(wèn)題自然就能理解了
回復(fù)

使用道具 舉報(bào)

19#
ID:332444 發(fā)表于 2021-1-29 09:28 | 只看該作者
要能自主寫(xiě)矩陣驅(qū)動(dòng)就得充分了解工作原理才能發(fā)揮得淋漓盡致,多看看其他人寫(xiě)的驅(qū)動(dòng)代碼,這個(gè)看看能否有點(diǎn)啟示https://blog.csdn.net/xianfajushi/article/details/80884859
回復(fù)

使用道具 舉報(bào)

20#
ID:451718 發(fā)表于 2021-1-29 11:51 | 只看該作者
你要的應(yīng)該是類似這樣的解決方案吧?
http://www.torrancerestoration.com/bbs/dpj-161402-1.html

把每個(gè)鍵都對(duì)應(yīng)一個(gè)鍵值,組合鍵也對(duì)應(yīng)一個(gè)鍵值, 沒(méi)有按鍵也對(duì)應(yīng)一個(gè)鍵值,你的問(wèn)題不就解決了?
回復(fù)

使用道具 舉報(bào)

21#
ID:516612 發(fā)表于 2021-1-29 12:39 | 只看該作者
yousir 發(fā)表于 2021-1-28 18:17
https://blog.csdn.net/andrewniu/article/details/53315881對(duì)于你說(shuō)的鍵盤(pán)沖突可以參見(jiàn)這篇文章,講解了如 ...

這個(gè)我很早就看過(guò)了,他這主要講的是PC鍵盤(pán)與PC機(jī)的PS2通信協(xié)議,然后大概的講了一下沖突的產(chǎn)生原因,但是并沒(méi)有講解如何從軟件和硬件層面去解決這個(gè)問(wèn)題,如果我現(xiàn)在連軟件層面的問(wèn)題都解決不了,贏了做了也沒(méi)用。
回復(fù)

使用道具 舉報(bào)

22#
ID:392485 發(fā)表于 2021-1-29 14:23 | 只看該作者
不考慮硬件沖突的原因,但從軟件方面說(shuō)可以嘗試將讀回來(lái)的鍵值放在一個(gè)變量里。讓這個(gè)變量每一位代表一個(gè)按鍵,然后判斷每一位的變化,應(yīng)該可以實(shí)現(xiàn)。
回復(fù)

使用道具 舉報(bào)

23#
ID:516612 發(fā)表于 2021-1-29 16:10 | 只看該作者
robinsonlin 發(fā)表于 2021-1-29 11:51
你要的應(yīng)該是類似這樣的解決方案吧?
http://www.torrancerestoration.com/bbs/dpj-161402-1.html

昨天有個(gè)老鐵也說(shuō)用標(biāo)識(shí)位的方式試試,通過(guò)數(shù)組對(duì)應(yīng)按鍵,但是沒(méi)有辦法解決按鍵松開(kāi)的問(wèn)題,并且多鍵位按下時(shí)掃描鍵盤(pán)狀態(tài)會(huì)順序發(fā)送按鍵值,但是他的示例給了我一些靈感,好像有點(diǎn)眉目,所以我也還在考慮標(biāo)識(shí)位這種方式。
回復(fù)

使用道具 舉報(bào)

24#
ID:516612 發(fā)表于 2021-1-29 16:12 | 只看該作者
xianfajushi 發(fā)表于 2021-1-29 09:28
要能自主寫(xiě)矩陣驅(qū)動(dòng)就得充分了解工作原理才能發(fā)揮得淋漓盡致,多看看其他人寫(xiě)的驅(qū)動(dòng)代碼,這個(gè)看看能否有點(diǎn)啟 ...

就是因?yàn)槟壳跋氩怀鲇终也坏竭@個(gè)原理,所以才來(lái)問(wèn),你發(fā)的那些都是基礎(chǔ)的按鍵檢測(cè)方式,和教程一樣的。
回復(fù)

使用道具 舉報(bào)

25#
ID:516612 發(fā)表于 2021-1-29 16:20 | 只看該作者
zwf33 發(fā)表于 2021-1-29 00:23
請(qǐng)看這個(gè)大神的貼,里面有解決方法
http://www.torrancerestoration.com/bbs/dpj-162218-1.html

嗯,這個(gè)我很早就看過(guò)了,他的示例是有借鑒的價(jià)值的。
回復(fù)

使用道具 舉報(bào)

26#
ID:392485 發(fā)表于 2021-1-30 12:36 | 只看該作者
18674201426 發(fā)表于 2021-1-29 16:10
昨天有個(gè)老鐵也說(shuō)用標(biāo)識(shí)位的方式試試,通過(guò)數(shù)組對(duì)應(yīng)按鍵,但是沒(méi)有辦法解決按鍵松開(kāi)的問(wèn)題,并且多鍵位按 ...

可以檢測(cè)的,當(dāng)按鍵按下的時(shí)候相應(yīng)位是0,松開(kāi)后相應(yīng)位變?yōu)?,你只需要檢測(cè)相應(yīng)的位的變化就可以了。只要和前一次的不同就說(shuō)明按鍵有變化了。
回復(fù)

使用道具 舉報(bào)

27#
ID:275826 發(fā)表于 2021-1-31 16:10 | 只看該作者
送你一個(gè)程序,可以滿足你的按鍵要求
#include<reg51.h>
#define uchar unsigned char
#define keyport P1

void scan1(void);

/****************************************************************/
void        tim0()        interrupt    1       
{            
         TH0=(65536-10000)/256;
     TL0=(65536-10000)%256;
         scan1();
          
}
       
/****************************************************************/                       
unsigned tmp[4];               

/****************************************************************/
void scan1(void)       
{  unsigned        char j;
   unsigned int itmp=0;
   for(j=0;j<4;j++)       
   {keyport=~(0x10<<j);       
        tmp[j]=~(keyport&0x0f)&0x0f;
        itmp=itmp|(tmp[j]<<(4*j));
        }
        itmp=~itmp;
        P0=itmp;
        P2=itmp>>8;               
                    
}                       
/****************************************************************/                       

void main(void)
  {        TH0=(65536-10000)/256;
    TL0=(65536-10000)%256;
        TMOD=0x01;
        EA=ET0=TR0=1;
       
        while(1);
  }
/****************************************************************/
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表