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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5418|回復: 26
收起左側

關于單片機多按鍵按下的檢測程序問題

  [復制鏈接]
ID:516612 發表于 2021-1-28 16:32 | 顯示全部樓層 |閱讀模式
我是初學單片機和C語言,覺得很有意思。所以在網上買了套件。學到4*4矩陣鍵盤的時候,一開始就發現這個教程的程序太低級,用while去卡住cpu只為了檢測一個按鍵是否松開,商家說沒有更好的辦法,太扯淡了,絕不可能!
所以這幾天在找一些資料,也沒找到。自己也過一些辦法嘗試寫過,但始終無法跳出教程給的框架。
所以在論壇發了求助帖,也有大神回復了辦法,可能我悟性確實太低,沒代碼根本想不通,即使有代碼沒注釋可能也看不懂。有那么難嗎?可能我不適合學編程吧,我想我最終也能解決這個問題,不過估計是幾年后了。

1

1

2

2

3

3

4

4
回復

使用道具 舉報

ID:807591 發表于 2021-1-28 17:04 | 顯示全部樓層
那些客服就是糊弄人的,度娘一圈應該能找到你想要的,不要拘泥于別人的套路,自己得思考,也不要看那些代碼寫的多高端,甚至一段時間后自己都看不懂,編譯器很可能會把那看似高級的代碼編譯成效率更低下的
回復

使用道具 舉報

ID:516612 發表于 2021-1-28 17:24 | 顯示全部樓層
szb314 發表于 2021-1-28 17:04
那些客服就是糊弄人的,度娘一圈應該能找到你想要的,不要拘泥于別人的套路,自己得思考,也不要看那些代碼 ...

我就是找了幾天沒找到才去問的,結果商家的技術水平這么低。有點失望。其實實現什么功能倒是次要的,重要的是實現按鍵不沖突的編程思路。有些老哥回答的又看不懂,說的很簡單,但實際又寫不出來。這東西對新手太勸退了,跟著教程走一點拔高的思維都沒有,要我照本宣科,講的比他們還好些。
回復

使用道具 舉報

ID:633344 發表于 2021-1-28 18:09 | 顯示全部樓層
就我的認知來說鍵盤分兩種,有些老式的電腦的鍵盤是編碼鍵盤(電路設計復雜編程簡單)早期IBM的個人計算機鍵盤是非編碼式的,現在的部分薄膜鍵盤也是非編碼鍵盤(電路簡單編程稍復雜)單片機使用最多的就是非編碼按鍵也就是需要行和列掃描通過電平的高低來實現檢測按鍵是否按下
回復

使用道具 舉報

ID:633344 發表于 2021-1-28 18:13 | 顯示全部樓層
還有CPU和MCU是兩個不同的東西哦,可以MCU是將計算機的CPU、RAM、ROM、定時計數器和多種I/O接口集成在一片芯片上,形成芯片級的芯片,內部除了CPU外還有RAM、ROM,可以直接加簡單的外圍器件(電阻,電容)就可以運行代碼了。
回復

使用道具 舉報

ID:232366 發表于 2021-1-28 18:14 來自手機 | 顯示全部樓層
也有別的辦法  多加學習已經就知道了我也是這樣的
回復

使用道具 舉報

ID:633344 發表于 2021-1-28 18:17 | 顯示全部樓層
https://blog.csdn.net/andrewniu/article/details/53315881對于你說的鍵盤沖突可以參見這篇文章,講解了如何處理非編碼鍵盤的沖突
回復

使用道具 舉報

ID:390416 發表于 2021-1-28 18:29 | 顯示全部樓層
代碼 矩陣鍵盤.jpg 不就是矩陣鍵盤嗎 你早說啊。給你一個 自己看圖片
回復

使用道具 舉報

ID:390416 發表于 2021-1-28 18:29 | 顯示全部樓層
  1. u8 xdata Key4x4_Read_Byte=3;//矩陣結果輸出變量
  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. }
復制代碼
回復

使用道具 舉報

ID:516612 發表于 2021-1-28 18:40 | 顯示全部樓層
yousir 發表于 2021-1-28 18:13
還有CPU和MCU是兩個不同的東西哦,可以MCU是將計算機的CPU、RAM、ROM、定時計數器和多種I/O接口集成在一片 ...

哎。這我當然知道,你都把重點搞錯了。重點是那個技術用這種話騙我好讓我打消問他的念頭
回復

使用道具 舉報

ID:516612 發表于 2021-1-28 18:54 | 顯示全部樓層
yousir 發表于 2021-1-28 18:09
就我的認知來說鍵盤分兩種,有些老式的電腦的鍵盤是編碼鍵盤(電路設計復雜編程簡單)早期IBM的個人計算機 ...

按鍵檢測不是重點,重點是無沖突,和按鍵松開后的檢測問題,電腦鍵盤就可以實現這個功能,一般都是3鍵無沖,高級點的6鍵無沖,有的甚至是全鍵無沖。這個功能是肯定能實現的,而且應該不是太難的東西。PC鍵盤的資料我也查過,都是發通斷碼的,我這里說的是燈,其實是一個道理,無非就是改燈的電平,實現什么功能是次要的。包括多個按鍵按下之后的檢測,看起來也是沒問題的,可是當按鍵松開的時候,比如現在按順序按下123,這3個鍵,當1鍵松開后怎么檢測是1鍵松開了,而且這時候2和3還在工作。
回復

使用道具 舉報

ID:879809 發表于 2021-1-28 19:08 | 顯示全部樓層
18674201426 發表于 2021-1-28 18:54
按鍵檢測不是重點,重點是無沖突,和按鍵松開后的檢測問題,電腦鍵盤就可以實現這個功能,一般都是3鍵無 ...

Rf0c80fc1455509fe0ad497cee4ee4cbd.png
想要任意按鍵同時按下無沖突需要硬件支持,樓主的開發板顯然沒有。純軟件實現無沖突那是白日做夢。
回復

使用道具 舉報

ID:516612 發表于 2021-1-28 19:39 | 顯示全部樓層
rundstedt 發表于 2021-1-28 19:08
想要任意按鍵同時按下無沖突需要硬件支持,樓主的開發板顯然沒有。純軟件實現無沖突那是白日做夢。

嗯,那我知道,這種是極端情況,因為不僅要考慮軟件的沖突,還要考慮硬件的沖突,因為按鍵都是并聯的。我想知道的是,至少軟件上不能有沖突,這樣我們就能挑選出無硬件沖突的按鍵來制作擴展功能,畢竟那個教程里面給的用while來檢測按鍵松開是不科學的。
回復

使用道具 舉報

ID:516612 發表于 2021-1-28 23:21 | 顯示全部樓層
人人學會單片機 發表于 2021-1-28 18:29
u8 xdata Key4x4_Read_Byte=3;//矩陣結果輸出變量
u8 code Key4x4_Buffer[4]={0xfe,0xfd,0xfb,0xf7};
v ...

研究了一下,大概看懂了,這個應該是逐行掃描法吧。
那個count++應該就是延時吧,每隔10ms運行一次掃描程序,然后通過Key4x4_Read_Byte來判斷鍵位,繼而可以通過數組來發送數據。
但是這個應該還是不行,當按下多個鍵的時候,那每隔10ms就會從最靠近第一個鍵位的地方依次連續發送多個數據,而且沒有按鍵松開的檢測,那按鍵松開需要執行的就沒法操作了。
回復

使用道具 舉報

ID:798201 發表于 2021-1-29 00:23 | 顯示全部樓層
請看這個大神的貼,里面有解決方法
http://www.zg4o1577.cn/bbs/dpj-162218-1.html
回復

使用道具 舉報

ID:235954 發表于 2021-1-29 09:01 | 顯示全部樓層
  1.                         if(key_pumb!=0) // 按鍵沒有按下的時候
  2.                         {
  3.                                 key_pumb_flag=0;// 標志位清零
  4.                         }
  5.                 //按住開始跑燈,抽氣(與開瓶不能同時按下兼容)       
  6.                 if(key_pumb==0&&key_motor==0)
  7.                 {
  8.                         delay100us(100);// 消除抖動延時       
  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)// 消除抖動后再次判斷按鍵是否按下
  14.                         {
  15.                                 key_pumb_num++;if(key_pumb_num>=2){key_pumb_num=0;}//按下抽氣,再按下關閉
  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;// 將標志位置1鎖住 表示已經按下
  20.                  }
  21.                 }
復制代碼
回復

使用道具 舉報

ID:420836 發表于 2021-1-29 09:19 | 顯示全部樓層
感謝樓主的分享。 希望您很快就能解決。
回復

使用道具 舉報

ID:330938 發表于 2021-1-29 09:24 | 顯示全部樓層
樓主不必糾結了,51開發板現在很多都做的很全面,很顯然你買的這個牌子是個不咋樣,至于這個技術人員目前還沒法確定是不是垃圾,但溝通理解能力明顯有缺陷,他根本就沒有理解你的問題就瞎回答.
至于樓主適不適合編程這個還不能下結論,至少你能發現問題,沒法解決問題只是你經驗和能力還需要積累.
WHILE做按鍵是新手入門最常用的方式,等你學多了之后這個問題自然就能理解了
回復

使用道具 舉報

ID:332444 發表于 2021-1-29 09:28 | 顯示全部樓層
要能自主寫矩陣驅動就得充分了解工作原理才能發揮得淋漓盡致,多看看其他人寫的驅動代碼,這個看看能否有點啟示https://blog.csdn.net/xianfajushi/article/details/80884859
回復

使用道具 舉報

ID:451718 發表于 2021-1-29 11:51 | 顯示全部樓層
你要的應該是類似這樣的解決方案吧?
http://www.zg4o1577.cn/bbs/dpj-161402-1.html

把每個鍵都對應一個鍵值,組合鍵也對應一個鍵值, 沒有按鍵也對應一個鍵值,你的問題不就解決了?
回復

使用道具 舉報

ID:516612 發表于 2021-1-29 12:39 | 顯示全部樓層
yousir 發表于 2021-1-28 18:17
https://blog.csdn.net/andrewniu/article/details/53315881對于你說的鍵盤沖突可以參見這篇文章,講解了如 ...

這個我很早就看過了,他這主要講的是PC鍵盤與PC機的PS2通信協議,然后大概的講了一下沖突的產生原因,但是并沒有講解如何從軟件和硬件層面去解決這個問題,如果我現在連軟件層面的問題都解決不了,贏了做了也沒用。
回復

使用道具 舉報

ID:392485 發表于 2021-1-29 14:23 | 顯示全部樓層
不考慮硬件沖突的原因,但從軟件方面說可以嘗試將讀回來的鍵值放在一個變量里。讓這個變量每一位代表一個按鍵,然后判斷每一位的變化,應該可以實現。
回復

使用道具 舉報

ID:516612 發表于 2021-1-29 16:10 | 顯示全部樓層
robinsonlin 發表于 2021-1-29 11:51
你要的應該是類似這樣的解決方案吧?
http://www.zg4o1577.cn/bbs/dpj-161402-1.html

昨天有個老鐵也說用標識位的方式試試,通過數組對應按鍵,但是沒有辦法解決按鍵松開的問題,并且多鍵位按下時掃描鍵盤狀態會順序發送按鍵值,但是他的示例給了我一些靈感,好像有點眉目,所以我也還在考慮標識位這種方式。
回復

使用道具 舉報

ID:516612 發表于 2021-1-29 16:12 | 顯示全部樓層
xianfajushi 發表于 2021-1-29 09:28
要能自主寫矩陣驅動就得充分了解工作原理才能發揮得淋漓盡致,多看看其他人寫的驅動代碼,這個看看能否有點啟 ...

就是因為目前想不出又找不到這個原理,所以才來問,你發的那些都是基礎的按鍵檢測方式,和教程一樣的。
回復

使用道具 舉報

ID:516612 發表于 2021-1-29 16:20 | 顯示全部樓層
zwf33 發表于 2021-1-29 00:23
請看這個大神的貼,里面有解決方法
http://www.zg4o1577.cn/bbs/dpj-162218-1.html

嗯,這個我很早就看過了,他的示例是有借鑒的價值的。
回復

使用道具 舉報

ID:392485 發表于 2021-1-30 12:36 | 顯示全部樓層
18674201426 發表于 2021-1-29 16:10
昨天有個老鐵也說用標識位的方式試試,通過數組對應按鍵,但是沒有辦法解決按鍵松開的問題,并且多鍵位按 ...

可以檢測的,當按鍵按下的時候相應位是0,松開后相應位變為1,你只需要檢測相應的位的變化就可以了。只要和前一次的不同就說明按鍵有變化了。
回復

使用道具 舉報

ID:275826 發表于 2021-1-31 16:10 | 顯示全部樓層
送你一個程序,可以滿足你的按鍵要求
#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);
  }
/****************************************************************/
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频999 | 日韩无 | 宅男噜噜噜66一区二区 | 亚洲成人播放器 | 中文字幕第十一页 | 黄色av网站免费看 | 欧美激情综合色综合啪啪五月 | 午夜不卡福利视频 | 免费色网址 | 亚洲成人精品 | 日韩精品一区二区三区中文在线 | 91视频免费在观看 | 国产综合在线视频 | 天堂av免费观看 | 最新黄色在线观看 | 成人性生交a做片 | 亚洲高清av | 精品国产一区三区 | 免费啪啪 | 久久久青草婷婷精品综合日韩 | 国产精品网址 | 日韩在线国产精品 | 免费在线播放黄色 | 亚洲高清一区二区三区 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | hitomi一区二区三区精品 | 久久一二 | 成人国产a | 日本黄视频在线观看 | 拍真实国产伦偷精品 | 精品久久久久久久久久久久 | 久久综合狠狠综合久久综合88 | 日韩精品成人av | 国产黄色av网站 | 男人的天堂视频网站 | av日韩一区| 久色网| 国产日韩一区二区三区 | 国产成人精品一区二区三区网站观看 | 黄色av网站在线观看 | 日韩电影一区 |