學到矩陣鍵盤這一塊對網上別人寫的C代碼有些疑問,希望有能看到的大牛幫助解答。 矩陣鍵盤和獨立鍵盤原理圖: 原理:對於圖右側的矩陣鍵盤,把P3口的低四位(P3.0 ~ P3.3)和高四位(P3.4 ~ P3.7)分別置1,只要有按鍵被按下,那麼與之對應的P3口某一位將由高電平被拉低,兩次分別測得了行值 ...
學到矩陣鍵盤這一塊對網上別人寫的C代碼有些疑問,希望有能看到的大牛幫助解答。
矩陣鍵盤和獨立鍵盤原理圖:
原理:對於圖右側的矩陣鍵盤,把P3口的低四位(P3.0 ~ P3.3)和高四位(P3.4 ~ P3.7)分別置1,只要有按鍵被按下,那麼與之對應的P3口某一位將由高電平被拉低,兩次分別測得了行值和列值即確定了哪一個按鍵被按下了。
比如:先把低四位賦高電平即 P3 = 0000_1111 假如 S15 被按下了,那麼 P3.2 就被拉成低電平即 P3 = 0000_1011 ,此時再把高四位賦高電平即 P3 = 1111_0000 ,那麼 P3.5 就被拉成低電平即 P3 = 1101_0000 。最後,把兩次測得的 P3 值相加 0000_1011 + 1101_0000 = 1101_1011(行列值為第三行第二列)
(1)網上最常見的寫法:
1 P3 = 0x0f; //0000 1111 2 if ((P3 & 0x0f) != 0x0f) //按鍵檢測 3 { 4 delay(3); //軟體消抖 5 if ((P3 & 0x0f) != 0x0f) //按鍵檢測 6 { 7 row_value = P3 & 0x0f; //掃描行值 8 P3 = row_value | 0xf0; 9 colume_value = P3 & 0xf0; //掃描列值 10 // while ((P3 & 0xf0) != 0xf0); //鬆手檢測 11 return (row_value + colume_value); 12 } 13 }
(2):
P3 = 0x0f; //0000 1111 if ((P3 & 0x0f) != 0x0f) //按鍵檢測 { delay(3); //軟體消抖 if ((P3 & 0x0f) != 0x0f) //按鍵檢測 { row_value = P3 & 0x0f; //掃描行值 P3 = 0xf0; colume_value = P3 & 0xf0; //掃描列值 //while ((P3 & 0xf0) != 0xf0); //鬆手檢測 return (row_value + colume_value); } }
(3):
P3 = 0x0f; //0000 1111 if ((P3 & 0x0f) != 0x0f) //按鍵檢測 { delay(3); //軟體消抖 if ((P3 & 0x0f) != 0x0f) //按鍵檢測 { row_value = P3; //掃描行值 P3 = 0xf0; colume_value = P3 ; //掃描列值 //while ((P3 & 0xf0) != 0xf0); //鬆手檢測 return (row_value + colume_value); } }
(4)這個符合我所說的原理和例子:
P3 = 0x0f; //0000 1111 if (P3 != 0x0f) //按鍵檢測 { delay(3); //軟體消抖 if (P3 != 0x0f) //按鍵檢測 { value = P3; //掃描行值 P3 = 0xf0; value |= P3 ; //掃描列值 //while (P3 != 0xf0); //鬆手檢測 return (value); } }
我已經用開發板實測了,上面這四個都對的。
我的疑問:我不明白為什麼常見寫法要寫 &0x0f 、 &0xf0 或者 |0xf0 這樣寫有什麼特別的作用沒有?感覺寫與不寫原理上都對,那何必要寫?(特別是寫法 1 和寫法 4 看起來差別蠻大的呀) ------------------2017-06-04 22:05:02
如有錯誤還請指出,如有侵權還請告知,如需轉載請註明出處!
本人博客:http://www.cnblogs.com/yllinux/