1. 程式人生 > >疑問----單片機矩陣鍵盤行列反轉掃描法

疑問----單片機矩陣鍵盤行列反轉掃描法

inux png src 網上 target nbsp 檢測 開發板 col

學到矩陣鍵盤這一塊對網上別人寫的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/

疑問----單片機矩陣鍵盤行列反轉掃描法