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