|
用狀態(tài)機寫比較方便,而且不會阻塞CPU/***************************************************************************
* 名 稱:Key_ScanIO();
* 功 能:掃描IO口并判斷按鍵事件(前臺程序)
* 入口參數(shù):無
* 出口參數(shù):無,鍵值壓入緩沖隊列
* 說 明:該函數(shù)需要每隔1/16~1/128S調(diào)用一次。最好放在定時中斷中執(zhí)行
***************************************************************************/
void Key_ScanIO()
{
P_KEY1=N_KEY1; //將當(dāng)前KEY1狀態(tài)保存到前一次狀態(tài)變量中
N_KEY1=KEY1_IN; //將KEY1狀態(tài)保存到當(dāng)前變量中
P_KEY2=N_KEY2;
N_KEY2=KEY2_IN;
P_KEY3=N_KEY3;
N_KEY3=KEY3_IN;
if((P_KEY1!=0)&&(N_KEY1==0)) KEY1_State=PUSH_KEY; //如果兩次狀態(tài)不一樣,說明K1被按下了
if((P_KEY2!=0)&&(N_KEY2==0)) Key_InBuff(0x02);
if((P_KEY3!=0)&&(N_KEY3==0)) Key_InBuff(0x04);
}
/***************************************************************************
* 名 稱:Key1_Judge();
* 功 能:判斷KEY1 長按、短按
* 入口參數(shù):無
* 出口參數(shù):無,鍵值壓入緩沖隊列
* 說 明:該函數(shù)需要每隔1/16~1/128S調(diào)用一次。最好放在定時中斷中執(zhí)行
***************************************************************************/
void Key1_Judge()
{
if(KEY1_State==PUSH_KEY) Key1TimeS++;
else Key1TimeS=0;
switch(KEY1_State)
{
case NOKEY:
{
if(KEY1_IN==0) KEY1_State=PUSH_KEY;
break;
}
case PUSH_KEY:
{
if(KEY1_IN!=0)
{
Key_InBuff(0x01);
KEY1_State=NOKEY;
}
else if(Key1TimeS>32*2)
{
Key_InBuff(LONG_KEY1);
KEY1_State=LONG_PUSH;
}
}
case LONG_PUSH:
{
if(KEY1_IN!=0)
{
KEY1_State=NOKEY;
Key1TimeS=0;
}
break;
}
}
} |
|