1. 程式人生 > 其它 >用4*4矩陣鍵盤實現 65535 種操作:實現電腦鍵盤的多按鍵功能

用4*4矩陣鍵盤實現 65535 種操作:實現電腦鍵盤的多按鍵功能

技術標籤:微控制器

很多萌新拿著 4*4 的矩陣鍵盤都只能掃描其中某一個按鍵是否按下,但是我們的矩陣鍵盤在正確的掃描和儲存方法下可以實現同時檢測多個按鍵,就好像電腦可以按Ctril + V, (感謝實驗室副教授 工程導論-陸老師的悉心指導!!)

話不多說,上程式碼,我們以藍橋杯的矩陣鍵盤為例:

#define uchar unsigned char
#define uint unsigned int
uchar cDelayKey;     //放定時器裡用於按鍵消抖
uint nKeyCode;       //快取16個按鍵狀態
bit key_bloose;     //鬆鍵標誌

//將16個按鍵的狀態裝在兩個位元組裡
Uint key_Scan()
{
    uint key;
    P44 = 0; key |= P3 & 0x0f; key << 4; P44 = 1;      
    P42 = 0; key |= P3 & 0x0f; key << 4; P42 = 1;
    P35 = 0; key |= P3 & 0x0f; key << 4; P35 = 1;
    P34 = 0; key |= P3 & 0x0f; P34 = 1;
    return key;
}

///按鍵消抖和鬆鍵檢測都在中斷服務函式裡
void Time0() interrupt 1
{
    TH0 = -9;         //11.0592M赫茲的晶振,12分頻(普通51微控制器)就是標準的2.5MS
    if(cDelayKey == 0)
    {
        nKeyCode = key_Scan();
        if(nKeyCode != 0xffff)
        {
            cDelayKey = 4;    //延時10Ms消抖
        }
        else 
        key_bloose = 0;
    }
    else
        if(--cDelayKey == 0)  //十毫秒後再來判斷按鍵是否按下!
    {
        if(nKeyCode == Key_Scan() && key_bloose == 0)
        {
            key_bloose = 1;
            switch(nKeyCode):
                case 0xfffe:
                    ......
                break;
                case 0xfff7:
                    ......
                break;
                case 0xfffb:
                    ......
                break;
                case 0xfffd:
                    ......
                break;
..................此處省略65535種情況............
        }
    }
            
}       

以上就是全部程式碼,按鍵掃描的過程很簡單,後面的消抖過程雖然複雜,但是充分利用了定時器,避免了延時函式(有延時函式的程式不是好程式!),可以節省出10ms的主函式執行時間!

1.鬆鍵檢測可根據需要新增,nKeyCode是儲存十毫秒前的8個I / O口狀態的變數,並與十毫秒後作比較,如果相同,表示按鍵正常按下(消抖)

;cDelayKey 用於按鍵消抖10Ms。

2.如果要檢測按鍵的值,只需要在switch語句裡設定鍵值。

製作不易,感謝一鍵三連!!!!