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

單片機(jī)按鍵檢測(cè)函數(shù)

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

 /*******************************************************************
 函數(shù)功能:判斷某一按鍵的狀態(tài);
 返回值:0x00-未按鍵,0x01-短按鍵,0x02-長(zhǎng)按鍵;(本程序不設(shè)連發(fā)功能)
 注意:本長(zhǎng)短按鍵是在同一按鍵上實(shí)現(xiàn);
 長(zhǎng)按鍵是持續(xù)按下2秒后認(rèn)為是長(zhǎng)按鍵,此時(shí)可以執(zhí)行按鍵功能程序,必須釋放
 按鍵后才可以再次執(zhí)行按鍵判斷;
 短按鍵是按下時(shí)間在2秒以內(nèi)并釋放的為短按鍵,含20ms的防抖,按鍵執(zhí)行是在
 按鍵釋放后執(zhí)行的;
 為了定時(shí)方便,本函數(shù)是每10ms執(zhí)行一次的,如果執(zhí)行周期有變,注意更改相
 關(guān)變量。
 (可以將此函數(shù)以結(jié)構(gòu)體形式擴(kuò)展為多個(gè)通道檢測(cè),本處測(cè)試函數(shù)未做。)
********************************************************************/
uchar get_sw_state(void)
{
  static uchar count=0; //按鍵狀態(tài)計(jì)時(shí);
 static uchar long_key=0; //長(zhǎng)按鍵標(biāo)志;
 static uchar t50ms_for_err=0; //50ms防釋放干擾或人認(rèn)抖動(dòng),即有按鍵時(shí),須檢測(cè)到釋放時(shí)間達(dá)到50ms才認(rèn)為真的是釋放;
 uchar value_tmp=0x00; //鍵值;
 
  if(NO_SWITCH)
    {
  if(t50ms_for_err!=0) t50ms_for_err--;
  if(0==t50ms_for_err) //確實(shí)釋放;
  {
   if(0==long_key) //不可省,防止按鍵一直不放,count從TOP值又到了BOTTOM重新計(jì)數(shù);
   {
    if(count<2) value_tmp=0x00; //防抖;
    else if(count<200) value_tmp=0x01; //2秒以內(nèi)釋放為短按鍵;
   }
   count=0; //計(jì)數(shù)清零;
   long_key=0;
  }
 }
 else
 {
  count++;
  if(count>2) t50ms_for_err=5;
  if((200==count)&&(0==long_key))
  {
   long_key=1;
   value_tmp=0x02;
  }
 }
 return value_tmp;
}

關(guān)閉窗口

相關(guān)文章