專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

單片機(jī)與4x4鍵盤 去抖 松手檢測(cè)程序

作者:huqin   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月09日   【字體:

剛寫的一個(gè)4*4 鍵盤, 去抖   松手檢測(cè)程序。 項(xiàng)目中要用4*4 鍵盤,掃描的程序有。但是去抖,和松手檢測(cè)的程序沒(méi)有,那么為了提高效率,可靠性,以及更加合理化。到網(wǎng)上找了一些關(guān)于”狀態(tài)機(jī)“的資料,按照它的思路寫了一個(gè),寫了半天,寫好一個(gè),經(jīng)過(guò)特發(fā)帖紀(jì)錄一下。


//對(duì)按鍵掃描的值  進(jìn)行處理  去抖  松手檢測(cè)
uint8_t key_scan(void)
{
 static uint8_t key_state = 0;
 static uint8_t key_num_flag1=0;


 uint8_t temp_key_num=0;
  uint8_t return_key_num=0;


 temp_key_num=KeyMap(); //讀取4*4 鍵盤返回的按鍵值  不要去抖


 switch(key_state) //檢測(cè)狀態(tài)
 {
  case key_state_0:
   if(temp_key_num!=0)  //如果按鍵返回不是0  說(shuō)明有按鍵按下
   {
    key_num_flag1=temp_key_num;  //記錄下 第一次按鍵按下的值
      key_state=key_state_1;  //進(jìn)入下一個(gè)狀態(tài)  去抖
   } 
  break;


  case key_state_1:
   if(temp_key_num!=0)  //如果按鍵返回不是0  說(shuō)明按鍵是按下的
   {
    if(key_num_flag1==temp_key_num) //判斷是否和上次記錄按鍵值一樣。
    {
     return_key_num=temp_key_num;  // 按鍵仍按下,賦值給 返回按鍵值


             key_state = key_state_2;        // 狀態(tài)轉(zhuǎn)換到鍵釋放態(tài)
    }
    else
    {
     key_state=key_state_0;  //回到初始狀態(tài) 
    }
   }
   else    ///沒(méi)有按鍵按下
   {
    key_state=key_state_0;  //回到初始狀態(tài) 
   } 
  break;


  case key_state_2:
            if(temp_key_num==0)  //如果沒(méi)有按鍵按下。 說(shuō)明按鍵松手了
   {
    key_state = key_state_0;    //按鍵已釋放,轉(zhuǎn)換到按鍵初始態(tài)
   }
   else
   {
    return_key_num=key_num_flag1; //如果沒(méi)有松手那就返回之前記錄的值


    //如果沒(méi)有這句的話,那么返回就是0。 這個(gè)適合4*4 鍵盤掃描,假如沒(méi)有這句
    //那么只有狀態(tài)1時(shí)候返回一次return_key_num,下面就一直不返回了。
    
   }


  break;
 }


 return return_key_num;  //返回按鍵值
  
}

關(guān)閉窗口

相關(guān)文章