再發一種基於stm32的4X4矩陣鍵盤定時器掃描消抖法,徹底告別delay函數! .

來源:互聯網
上載者:User

        本人今天又換種思路寫了個關於stm32的4X4矩陣鍵盤定時器掃描消抖法的演算法程式,同樣是採用的效率較高的翻轉法,已通過測試,希望大家喜歡!大概思路為:將連接埠的第N次掃描值和第(N-1)次的掃描值進行比較,若相等則某個變數自增1次,否則將其清0,當此變數自增的值達到某個值時,則認為按鍵確實是被按下了,然後再進行後續的行和列的尋找工作,最終確定是哪個按鍵被按下了!註:本程式的定時器中斷掃描周期為10ms,同上次本矩陣鍵盤是採用的PB口的低8位。這個程式只是表達了思路,寫得很粗糙,大家可以自行改進。代碼如下:

s8 scan_MatrixKey(void)
{
    #define PORT GPIOB->IDR
    u8 column;
    u8 row;
    u8 tmp;
    static u8 j;
    static u8 x;
    static u8 i;
    s8 MatrixKey_value = 20; 
   
    //低8位為推挽輸出
    GPIOB->CRL &= 0X00000000;
    GPIOB->CRL |= 0X33333333;
    //初值:低4位為低,次低4位為高
    GPIOB->ODR &= 0XFF00;
    GPIOB->ODR |= 0X00F0;
    //次低4位為上拉輸入
    GPIOB->CRL &= 0X0000FFFF;
    GPIOB->CRL |= 0X88880000;

    tmp = PORT;//必須要

    if (tmp != 0XF0)//說明有鍵按下
    {          
        i++;//記錄中斷掃描的次數
        if (i == 1)//第一次掃描
        {
            //把tmp的值(即PORT的值)存起來
            //以便和後續掃描所得的PORT的值進行比較
            x = tmp;
        }
        else if (i == 2)//第二次掃描
        {
            if (x == tmp)//把第二次掃描PORT的值和前一次比較
            {
                j++;//j=1
            }
            else//2次掃描PORT的值不等說明有抖動
            {
                j = 0;//將j清0
                x = tmp;//將最新的tmp的值(即PORT的值)再存起來
            }
        }
        else if (i == 3)//第三次掃描
        {
            if (x == tmp)
            {
                j++;//j=2
            }
            else
            {
                j = 0;
                x = tmp;
            }
        }
        else if (i == 4)//第四次掃描
        {
            if (x == tmp)
            {
                j++;//j=3
            }
            else
            {
                j = 0;
                x = tmp;
            }
        }
        //經曆2個中斷掃描周期後確定按下
        if (j == 2)//此處數值可以由定時器中斷掃描的周期而改動
        {                              
            column = tmp & 0X00F0;//擷取列號
            //低8位為推挽輸出
            GPIOB->CRL &= 0X00000000;
            GPIOB->CRL |= 0X33333333;
            //翻轉:低4位為高,次低4位為低
            GPIOB->ODR &= 0XFF00;
            GPIOB->ODR |= 0X000F;
            //低4位為上拉輸入
            GPIOB->CRL &= 0XFFFF0000;
            GPIOB->CRL |= 0X00008888;                    
            row = PORT & 0X000F;//擷取行號

            switch (column | row)//column|row為按鍵被按下對應連接埠的編碼
            {  
                //按鍵對應的碼錶(可以根據需求調整欲返回的索引值) 
                case 0XEE: MatrixKey_value = 12; break; 
                case 0XDE: MatrixKey_value = 10; break;
                case 0XBE: MatrixKey_value = 11; break;               
                case 0X7E: MatrixKey_value = 0; break;                                              
                case 0XED: MatrixKey_value = 13; break;
                case 0XDD: MatrixKey_value = 3; break;
                case 0XBD: MatrixKey_value = 2; break;
                case 0X7D: MatrixKey_value = 1; break;                                  
                case 0XEB: MatrixKey_value = 14; break;
                case 0XDB: MatrixKey_value = 6; break;
                case 0XBB: MatrixKey_value = 5; break;
                case 0X7B: MatrixKey_value = 4; break;                                    
                case 0XE7: MatrixKey_value = 15; break;
                case 0XD7: MatrixKey_value = 9; break;
                case 0XB7: MatrixKey_value = 8; break;
                case 0X77: MatrixKey_value = 7; break;
                default:   break;    
            }
        }      
    }
    //沒有按鍵被按下時對計數變數清0
    if ((PORT & 0X00FF) == 0x00F0)
    {
        i = 0;
        j = 0;
    }

    return MatrixKey_value;
}

        上一篇stm32矩陣鍵盤掃描定時器消抖代碼連結為:

http://blog.csdn.net/dcx1205/article/details/8859509

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.