長按鍵C語言程序
一共用了四個按鈕.
#define _KEYDOWN_TEST_TIME (20)
unsigned char IsKeyDown(volatile unsigned char Value, unsigned char pin)
{
unsigned long CurState = 0, i;
for(i = 0; i _KEYDOWN_TEST_TIME; ++i)
CurState += _GET_BIT(Value, pin)? 0:1; //鍵盤接了上拉電阻,低電平才是按下
if(CurState == _KEYDOWN_TEST_TIME)
return 1;
return 0;
}
//以下所有值均是以 DealWithKey函數(shù)的調(diào)用頻率為基礎的,該頻率是定時器2的定時值決定的
//短按鍵的計數(shù)值,只有當按鍵檢測計數(shù)器計數(shù)大于等于此值時才認為是一次短按
#define _KEY_SHORT_CNTR (2)
//長按鍵的計數(shù)值,只有當按鍵檢測計數(shù)器計數(shù)大于等于此值時才認為是一次長按
#define _KEY_LONG_CNTR (_KEY_SHORT_CNTR * 3)
//無按鍵按下時的按鍵檢測間隔,用于按鍵消抖動
#define _KEY_NORMAL_DEVIDER (2)
//此值用于按鈕長按后,按鈕檢測函數(shù)的執(zhí)行頻率
#define _ADDMIN_FAST_DEVIDER (15)
//此值用于按鈕短按后,按鈕檢測函數(shù)的執(zhí)行頻率
#define _ADDMIN_LONG_DEVIDER (_ADDMIN_FAST_DEVIDER * 3)
//此值用于設置蜂鳴器鳴響時間
#define _BEEPER_DEVIDER (10)
void DealWithKey(void)
{
static unsigned int AddCntr = 0;
static unsigned int MinCntr = 0;
static unsigned int UnitCntr = 0;
static unsigned int RunCntr = 0;
static unsigned char BeepCntr = 0;
static unsigned int DevCntr = 0;
static unsigned char LastRunState = 0;
unsigned char temp;
if(g_State != Setting) //運行狀態(tài), 所有按鍵都無效
return;
if(BeepCntr > 0) //處理蜂鳴器
--BeepCntr;
else
_BEEPER_OFF;
if(DevCntr) //按鍵處理分頻器
{
--DevCntr;
return;
}
//這個按鈕是可以重復進入的, 長按后先低頻率動作, 當動作幾次后再高頻率動作
AddCntr = IsKeyDown(_PIN(_TO_KEY_ADD), _KEY_ADD)? AddCntr + 1 : 0;
if((temp = (AddCntr >= _KEY_LONG_CNTR)) || AddCntr >= _KEY_SHORT_CNTR)
{
...
}
//同上
MinCntr = IsKeyDown(_PIN(_TO_KEY_MIN), _KEY_MIN)? MinCntr + 1 : 0;
if((temp = (MinCntr >= _KEY_LONG_CNTR)) || MinCntr >= _KEY_SHORT_CNTR)
{
...
}
//這個按鈕是不可重復進入的, 就是說只有抬起后再按下才動作
UnitCntr = IsKeyDown(_PIN(_TO_KEY_UNIT), _KEY_UNIT)? UnitCntr + 1 : 0;
if(UnitCntr == _KEY_SHORT_CNTR)
{
...
}
else if(UnitCntr > _KEY_SHORT_CNTR)
{
UnitCntr = _KEY_SHORT_CNTR + 1; //禁止重復執(zhí)行
}
//這個按鈕是要在按鈕抬起后才執(zhí)行其他函數(shù)的
if(IsKeyDown(_PIN(_TO_KEY_RUN), _KEY_RUN))
{
++RunCntr;
}
else
{
RunCntr = 0;
if(LastRunState) //表明鍵已經(jīng)按下后才抬起的
{
LastRunState = 0;
g_State = EmptyInflatting;
}
}
if(RunCntr == _KEY_SHORT_CNTR)
{
BeepCntr = _BEEPER_DEVIDER;
_BEEPER_ON;
LastRunState = 1; //此鍵是抬起時生效.
}
else if(RunCntr > _KEY_SHORT_CNTR)
{
RunCntr = _KEY_SHORT_CNTR + 1; //禁止重復執(zhí)行
}
DevCntr = _KEY_NORMAL_DEVIDER;
}
評論