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

來源:互聯網
上載者:User

        經本人刻苦鑽研,將51單片機上用的矩陣鍵盤掃描程式移植到了stm32上,同時也做了很大的改進,最大的改進莫過於消抖這塊了。以前的消抖總是採用delay延時約10到20ms的時間,但這樣會導致MCU在延時裡空跑而造成主程式被擱置,顯然,程式的即時性大打折扣,今天便在此讓新手們別delay,從此走進一個嶄新的掃描消抖世界!(本人也是新手——愛鑽研的新手哈!^_^)

//stm32矩陣鍵盤翻轉掃描法(PB口的低8位)
//將此矩陣鍵盤掃描程式放在定時器中斷服務程式裡
//每10ms進入一次中斷服務程式
s8 scan_MatrixKey(void)
{
    #define PORT GPIOB->IDR
    u8 column;//列
    u8 row;//行
    u8 tmp;//臨時變數
    s8 MatrixKey_value = 20;//初始值不能為0~15
    static u8 key_count = 0;//按鍵被中斷掃描的次數
   
    ///////////IO口的配置/////////////
    //低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)//如果有鍵按下
    {  
        //防止長按時,持續自增導致變數溢出
        if (key_count <= 2)
        {
            key_count++;
        }
    }
    //若產生抖動按鍵被抬起則計數清0
    else
    {
        key_count = 0;
    }
    //若按鍵連續2次掃描均處於按下狀態
    //則認為按鍵確實被按下了
    if (key_count == 2)
    {         
        column = tmp & 0X00F0;//擷取列號
       
        ///////////IO口的配置/////////////
        //低8位為推挽輸出
        GPIOB->CRL &= 0X00000000;
        GPIOB->CRL |= 0X33333333;
        //翻轉:低4位為高,次低4位為低
        GPIOB->ODR &= 0XFF00;
        GPIOB->ODR |= 0X000F;//低4位為高,次低4位為低
        //低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)
    {
        key_count = 0; 
    }

    return MatrixKey_value;
}

        大家在使用過程中若有什麼疑問,請給本人留言回複以加強交流,互相學習,共同進步!~

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

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

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.