![]() |
發布時間: 2021-1-28 16:32
正文摘要:我是初學單片機和C語言,覺得很有意思。所以在網上買了套件。學到4*4矩陣鍵盤的時候,一開始就發現這個教程的程序太低級,用while去卡住cpu只為了檢測一個按鍵是否松開,商家說沒有更好的辦法,太扯淡了,絕不可能! ... |
送你一個程序,可以滿足你的按鍵要求 #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); } /****************************************************************/ |
18674201426 發表于 2021-1-29 16:10 可以檢測的,當按鍵按下的時候相應位是0,松開后相應位變為1,你只需要檢測相應的位的變化就可以了。只要和前一次的不同就說明按鍵有變化了。 |
zwf33 發表于 2021-1-29 00:23 嗯,這個我很早就看過了,他的示例是有借鑒的價值的。 |
xianfajushi 發表于 2021-1-29 09:28 就是因為目前想不出又找不到這個原理,所以才來問,你發的那些都是基礎的按鍵檢測方式,和教程一樣的。 |
robinsonlin 發表于 2021-1-29 11:51 昨天有個老鐵也說用標識位的方式試試,通過數組對應按鍵,但是沒有辦法解決按鍵松開的問題,并且多鍵位按下時掃描鍵盤狀態會順序發送按鍵值,但是他的示例給了我一些靈感,好像有點眉目,所以我也還在考慮標識位這種方式。 |
不考慮硬件沖突的原因,但從軟件方面說可以嘗試將讀回來的鍵值放在一個變量里。讓這個變量每一位代表一個按鍵,然后判斷每一位的變化,應該可以實現。 |
yousir 發表于 2021-1-28 18:17 這個我很早就看過了,他這主要講的是PC鍵盤與PC機的PS2通信協議,然后大概的講了一下沖突的產生原因,但是并沒有講解如何從軟件和硬件層面去解決這個問題,如果我現在連軟件層面的問題都解決不了,贏了做了也沒用。 |
你要的應該是類似這樣的解決方案吧? http://www.zg4o1577.cn/bbs/dpj-161402-1.html 把每個鍵都對應一個鍵值,組合鍵也對應一個鍵值, 沒有按鍵也對應一個鍵值,你的問題不就解決了? |
要能自主寫矩陣驅動就得充分了解工作原理才能發揮得淋漓盡致,多看看其他人寫的驅動代碼,這個看看能否有點啟示https://blog.csdn.net/xianfajushi/article/details/80884859 |
樓主不必糾結了,51開發板現在很多都做的很全面,很顯然你買的這個牌子是個不咋樣,至于這個技術人員目前還沒法確定是不是垃圾,但溝通理解能力明顯有缺陷,他根本就沒有理解你的問題就瞎回答. 至于樓主適不適合編程這個還不能下結論,至少你能發現問題,沒法解決問題只是你經驗和能力還需要積累. WHILE做按鍵是新手入門最常用的方式,等你學多了之后這個問題自然就能理解了 |
感謝樓主的分享。 希望您很快就能解決。 |
|
請看這個大神的貼,里面有解決方法 http://www.zg4o1577.cn/bbs/dpj-162218-1.html |
人人學會單片機 發表于 2021-1-28 18:29 研究了一下,大概看懂了,這個應該是逐行掃描法吧。 那個count++應該就是延時吧,每隔10ms運行一次掃描程序,然后通過Key4x4_Read_Byte來判斷鍵位,繼而可以通過數組來發送數據。 但是這個應該還是不行,當按下多個鍵的時候,那每隔10ms就會從最靠近第一個鍵位的地方依次連續發送多個數據,而且沒有按鍵松開的檢測,那按鍵松開需要執行的就沒法操作了。 |
rundstedt 發表于 2021-1-28 19:08 嗯,那我知道,這種是極端情況,因為不僅要考慮軟件的沖突,還要考慮硬件的沖突,因為按鍵都是并聯的。我想知道的是,至少軟件上不能有沖突,這樣我們就能挑選出無硬件沖突的按鍵來制作擴展功能,畢竟那個教程里面給的用while來檢測按鍵松開是不科學的。 |
18674201426 發表于 2021-1-28 18:54 ![]() 想要任意按鍵同時按下無沖突需要硬件支持,樓主的開發板顯然沒有。純軟件實現無沖突那是白日做夢。 |
yousir 發表于 2021-1-28 18:09 按鍵檢測不是重點,重點是無沖突,和按鍵松開后的檢測問題,電腦鍵盤就可以實現這個功能,一般都是3鍵無沖,高級點的6鍵無沖,有的甚至是全鍵無沖。這個功能是肯定能實現的,而且應該不是太難的東西。PC鍵盤的資料我也查過,都是發通斷碼的,我這里說的是燈,其實是一個道理,無非就是改燈的電平,實現什么功能是次要的。包括多個按鍵按下之后的檢測,看起來也是沒問題的,可是當按鍵松開的時候,比如現在按順序按下123,這3個鍵,當1鍵松開后怎么檢測是1鍵松開了,而且這時候2和3還在工作。 |
yousir 發表于 2021-1-28 18:13 哎。這我當然知道,你都把重點搞錯了。重點是那個技術用這種話騙我好讓我打消問他的念頭 |
|
![]() |
https://blog.csdn.net/andrewniu/article/details/53315881對于你說的鍵盤沖突可以參見這篇文章,講解了如何處理非編碼鍵盤的沖突 |
也有別的辦法 多加學習已經就知道了我也是這樣的 |
還有CPU和MCU是兩個不同的東西哦,可以MCU是將計算機的CPU、RAM、ROM、定時計數器和多種I/O接口集成在一片芯片上,形成芯片級的芯片,內部除了CPU外還有RAM、ROM,可以直接加簡單的外圍器件(電阻,電容)就可以運行代碼了。 |
就我的認知來說鍵盤分兩種,有些老式的電腦的鍵盤是編碼鍵盤(電路設計復雜編程簡單)早期IBM的個人計算機鍵盤是非編碼式的,現在的部分薄膜鍵盤也是非編碼鍵盤(電路簡單編程稍復雜)單片機使用最多的就是非編碼按鍵也就是需要行和列掃描通過電平的高低來實現檢測按鍵是否按下 |
szb314 發表于 2021-1-28 17:04 我就是找了幾天沒找到才去問的,結果商家的技術水平這么低。有點失望。其實實現什么功能倒是次要的,重要的是實現按鍵不沖突的編程思路。有些老哥回答的又看不懂,說的很簡單,但實際又寫不出來。這東西對新手太勸退了,跟著教程走一點拔高的思維都沒有,要我照本宣科,講的比他們還好些。 |
那些客服就是糊弄人的,度娘一圈應該能找到你想要的,不要拘泥于別人的套路,自己得思考,也不要看那些代碼寫的多高端,甚至一段時間后自己都看不懂,編譯器很可能會把那看似高級的代碼編譯成效率更低下的![]() |