|
發布時間: 2021-10-14 11:26
正文摘要:這個是某設備上的程序,我有一些不明白的地方把它復制過來了,就是按鍵值的范圍我不太理解 單片機源程序如下: #include <c8051F020.H> #include <intrins.H> #define Keybus P0 unsigned ... |
zhangzhao2423 發表于 2021-10-15 08:11 P0.7就算不是懸空,其所接電路也必須在掃描按鍵時保持高電平。 |
wulin 發表于 2021-10-14 17:21 厲害,原程序就是使用了7個按鍵。并且P0.0接地,但是P0.7是不是空的我就不太清楚了。 |
|
從樓主給的現有條件來看,這個矩陣鍵盤用了6個端口組成3*3,只使用了7個按鍵。并且P0.0是被接地,P0.7空。否則不可能得到上述7個鍵碼。 給你把按鍵代碼順序調整了一下,便于你理解鍵碼是怎么產生的。這是驗證程序:
|
zhangzhao2423 發表于 2021-10-14 16:06 這樣的話,你兩次對p0的設置,應該分別是 0x0e和0xf0,確保p0.0始終為低,而不是你代碼里的0x0f和0xf1。因為1有不確定性,0有穩定性。 |
188610329 發表于 2021-10-14 15:42 假設0.0到0.3是行,0.4到0.7是列,那么按理說可以區分16個按鍵的值。因為P0^0一直拉低,所以也可以區分12個按鍵,任何一個按鍵按下去,應該會有三個位是0,因為P0^0始終是零。 |
zhangzhao2423 發表于 2021-10-14 15:31 所以,這個時候,就需要電路圖了, 你設置的 P0 = 0x0f; 誰會知道你的 P0^0 會被拉低呢? 而且如果你的 P0^0 會被拉低, 那么 即使你沒有按任何按鍵, 你的 Key_l=Keybus; //我的理解:此時Key_l=0x0f 這個推測是不會成立的, 這個時候也應該是: Key_l=0x0e |
188610329 發表于 2021-10-14 15:07 不能理解,在3x4的矩陣里,假設P0^0是0,我隨便按下哪個按鈕,也是其中的另外兩個位為0,應該不會有0X07的情況吧 |
Jiang_YY 發表于 2021-10-14 15:15 看看我之前的回復。 所以,switch (R_Keyno) 里面的 Case, 隨便找一個,轉換成 二進制: 比如: 0xbc => 1011 1100 居然 三個0?? ![]() 這里,我是暈了, 你幫忙分析分析啥情況,為啥3個0??? ![]() |
估計樓主用直接設置IO輸入輸出方向的MCU比較多,用傳統51比較少,對這種轉換輸入方式不太理解。或者是一下沒反應過來?![]() ![]() |
zhangzhao2423 發表于 2021-10-14 14:52 沒有鍵按下,就是0x0f, 有鍵按下就是 0x07,0x0b 之類的 |
|
上一句沒回復完,按錯發送了。 Key_l=Keybus; //我的理解:此時Key_l=0x0f 這一句,輸出“1”的位就是輸入了,如果有按鍵按下,讀回來的就不是“1”了。 |
| Key_l=Keybus; //我的理解:此時Key_l=0x0f |
188610329 發表于 2021-10-14 14:22 keybus 在任何時候都是P0,那么keybus=0x0f;然后給key_l 這個結果是0x0f,還是P0啊? 然后它按位或的時候?低四位結果不是全是1嗎? |
|
基于, #define Keybus P0 , 所以,Keybus 就是 P0 的意思,是任何時候,而不是僅僅“此時” 所以: Key_h=Keybus; 就是把 P0 的 值 賦值給 Key_h 所以: Key_no=Key_h | Key_l; 只要有按鍵按下, 就不會等于 0xff 從你: Keybus=0x0f; Keybus=0xf1; 這兩句看, 如果不是寫錯了。 那么,你的矩陣鍵盤就是 3x4 = 12 的矩陣。 所以,switch (R_Keyno) 里面的 Case, 隨便找一個,轉換成 二進制: 比如: 0xbc => 1011 1100 居然 三個0?? 看不懂了………… 你自己捉摸吧…… |
| 結合硬件接線圖,就一目了然了。 |