矩陣鍵盤掃描


根據矩陣鍵盤的原理圖可知,當沒有按鍵按下時,P1=0xf0;然后依次將P1^0~P1^3單獨置低電平,其他置高,再掃描各列的狀態,來判斷是哪個按鍵按下,比如,將P1^0輸出低電平,其他的引腳都輸出高電平,即P1=0xfe,那么當第1行有按鍵按下時P1的相應值為,

1X1(01111110=0x7e)  1X2(10111110=0xbe)  1x3(11011110=0xde) 1X4(11101110=0xee)

將P1^1輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當第2行有按鍵按下時P1的相應值為,

2X1(01111101=0x7d)  2X2(10111101=0xbd)  2x3(11011101=0xdd) 2X4(11101101=0xed)

將P1^2輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當第2行有按鍵按下時P1的相應值為,

3X1(01111011=0x7b)  3X2(10111011=0xbb)  3x3(11011011=0xdb) 3X4(11101011=0xeb)

將P1^3輸出低電平,其他的引腳都輸出高電平,即P1=0xfd,那么當第2行有按鍵按下時P1的相應值為,

4X1(01110111=0x77)  4X2(10110111=0xb7)  4x3(11010111=0xd7) 4X4(11100111=0xe7)

下面通過一個來測試上面結果,

/*
程序中用到了置位,如果檢測第一行時置位為0xfe,是為了初始化一下P1口,初始化后
*/
#include <reg52.h>

unsigned int Val;

void Delay(unsigned int t);

void main(void)
{
    while (1)
    {
        if(P1 != 0xf0)//當沒有按鍵按下時,P0=0xf0;
        {
            Delay(1500);  //去抖
            if(P1 != 0xf0)//表示按鍵還在按下,判斷是哪個按鍵
            {          
                P1 = 0xfe; //置位為fe,檢測第一行    1111 1110
                //根據矩陣鍵盤原理圖,當非第一行有按鍵按下時P1一直保持為0xfe
                if(P1 != 0xfe)  //將P1置為0xfe后,經過一個指令周期后如果它還是0xfe說明按下的鍵不在第一行
                {
                    Val = P1;
                    Delay(1500); //去抖
                    while(P1 != 0xfe); //等待按鍵彈起
                    P0 = Val;
                }
                P1 = 0xfd;       //置位為fd,檢測第二行    1111 1101
                if (P1 != 0xfd)
                {
                    Val = P1;
                    Delay(1500);
                    while (P1 != 0xfd)
                    P0 = Val;
                }
                P1 = 0xfb;       //置位為fb,檢測第三行    1111 1011
                if (P1 != 0xfb)
                {
                    Val = P1;
                    Delay(1500);
                    while (P1 != 0xfb)
                    P0 = Val;
                }
                P1 = 0xf7;       //置位為f7,檢測第四行    1111 0111
                if (P1 != 0xf7)
                {
                    Val = P1;
                    Delay(1500);
                    while (P1 != 0xf7)
                    P0 = Val;
                }
            }
        }
    }
}

void Delay(unsigned int t)
{
    while (--t);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM