【藍橋杯單片機06】矩陣鍵盤的基本控制


【藍橋杯單片機06】矩陣鍵盤的基本控制

廣東職業技術學院  歐浩源

    掌握了獨立按鍵的處理思路之后,也不是那么輕易的能夠學會矩陣鍵盤的,兩者的處理思路有很大的不同,不過,只要把矩陣鍵盤的本質思想搞清楚了,不過是4X4的還是8X8的,都能夠很輕松的處理。

1、矩陣鍵盤的掃描思想
    與獨立按鍵不同的是,按鍵的兩個引腳都分別連接的單片機的I/O端口,一個作為行信號,另外一個作為列信號。我們以4X4的矩陣鍵盤為例,試着探討其工作方式和掃描思路。

    在上面的矩陣鍵盤中,要識別出黃色按鍵的按下狀態,應該怎么做呢?
    對與矩陣鍵盤,我們只能逐行掃描,然后讀取列的狀態信號。如果R3行輸出低電平,那么黃色按鍵如果有按下動作的話,那讀取C2列信號也應該為低電平,而該行上其他沒有按下動作的按鍵的列信號則為高電平。因此,我們可以得到矩陣鍵盤的基本掃描步驟:
    <1> R1輸出點電平,R2、R3、R4輸出高電平,逐個讀取判斷列信號,如果都為高電平則R1行上沒有按鍵按下。
    <2> R2輸出點電平,R1、R3、R4輸出高電平,逐個讀取判斷列信號。
    <3> R3輸出點電平,R1、R2、R4輸出高電平,發現C2列信號為低電平,那么可以判斷得R3行的C2列的按鍵有按下動作。
    <4> R4輸出點電平,R1、R3、R4輸出高電平,逐個讀取判斷列信號。
    如此循環往復,掃描的按鍵的狀態。
    我們知道有按鍵按下動作,那么又怎么知道是哪一個按鍵按下呢?這時,我們最好定義一個鍵值全局變量,給矩陣行列上的每一個的按鍵編一個唯一的號碼。當掃描的某一行某一列的按鍵動作后,把對應的編號復制給鍵值變量,這樣我們判斷這個鍵值,就知道是那個按鍵有觸發動作了。
    說得再多,不如一練,看題。
2、單元訓練題目

3、實現源碼參考

#include "reg52.h"  

sfr P4   = 0xC0;    

sbit HC138_A = P2^5;    
sbit HC138_B = P2^6;    
sbit HC138_C = P2^7;    

sbit R1 = P3^0;  
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;

sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;

unsigned char keyNum = 0x10;
unsigned char code SMG_NoDot[18] = 
    {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};

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

void Init74HC138(unsigned char n)
{
    switch(n)
    {
        case 4:
            HC138_A = 0;
            HC138_B = 0;
            HC138_C = 1;
            break;
        case 5:
            HC138_A = 1;
            HC138_B = 0;
            HC138_C = 1;
            break;
        case 6:
            HC138_A = 0;
            HC138_B = 1;
            HC138_C = 1;
            break;
        case 7:
            HC138_A = 1;
            HC138_B = 1;
            HC138_C = 1;
            break;
        case 8:
            HC138_A = 0;
            HC138_B = 0;
            HC138_C = 0;
            break;
    }
}

void ShowKeyNum(unsigned char value)
{
    Init74HC138(6);
    P0 = 0x01;
    Init74HC138(7);
    P0 = value;
}

void ScanKeys()
{
    keyNum = 16;
    R1 = 0;
    R2 = R3 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if(C1 == 0)
    {
        while(C1 == 0);
        keyNum = 0;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C2 == 0)
    {
        while(C2 == 0);
        keyNum = 1;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C3 == 0)
    {
        while(C3 == 0);
        keyNum = 2;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C4 == 0)
    {
        while(C4 == 0);
        keyNum = 3;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    
    R2 = 0;
    R1 = R3 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if(C1 == 0)
    {
        while(C1 == 0);
        keyNum = 4;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C2 == 0)
    {
        while(C2 == 0);
        keyNum = 5;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C3 == 0)
    {
        while(C3 == 0);
        keyNum = 6;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C4 == 0)
    {
        while(C4 == 0);
        keyNum = 7;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    
    R3 = 0;
    R2 = R1 = R4 = 1;
    C1 = C2 = C3 = C4 = 1;
    if(C1 == 0)
    {
        while(C1 == 0);
        keyNum = 8;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C2 == 0)
    {
        while(C2 == 0);
        keyNum = 9;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C3 == 0)
    {
        while(C3 == 0);
        keyNum = 10;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C4 == 0)
    {
        while(C4 == 0);
        keyNum = 11;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    
    R4 = 0;
    R2 = R3 = R1 = 1;
    C1 = C2 = C3 = C4 = 1;
    if(C1 == 0)
    {
        while(C1 == 0);
        keyNum = 12;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C2 == 0)
    {
        while(C2 == 0);
        keyNum = 13;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C3 == 0)
    {
        while(C3 == 0);
        keyNum = 14;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
    else if(C4 == 0)
    {
        while(C4 == 0);
        keyNum = 15;
        ShowKeyNum(SMG_NoDot[keyNum]);
    }
}

void main()
{    
    while(1)
    {
        ScanKeys();
    }
}

 


免責聲明!

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



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