|
我需要長(zhǎng)按 短按 和連發(fā)(連按一直加或減)三個(gè)功能,之前發(fā)過(guò)一 貼,長(zhǎng)按后會(huì)跟隨一次短按,現(xiàn)在我又加了一個(gè)狀態(tài),現(xiàn)在連短按都不對(duì)了,請(qǐng)大師們賜教,不勝感激!
#define PD 0x22|(P1&0x51)|(P2<<1&0x80)|(P3<<2&0x0c) //P1.0/P3.0 p3.1/P4.2 p4.3組合5個(gè)按鍵為1個(gè)字節(jié)數(shù)據(jù)
單片機(jī)源程序如下:
/*******************************************************************************
* 文件名:按鍵函數(shù)
* 描 述: 放入定時(shí)器10ms掃描一次
* 功 能:
* 參 數(shù):無(wú)
*******************************************************************************/
void key_scan()
{
static u8 cnt ;
static u8 state=S0;
u8 key;
key = PD&0xFF;
switch(state) //檢測(cè)狀態(tài)
{
case S0: //狀態(tài)0
if(key!= 0xFF) state = S1; break; //判斷輸入是否為0,為0轉(zhuǎn)入狀態(tài)1
case S1: //狀態(tài)1
if(key==0xFF) state = S0; //判斷輸入是否為1,為1返回狀態(tài)0
else //否則,轉(zhuǎn)入狀態(tài)2,執(zhí)行按鍵程序
{
state=S2;
}
break;
case S2: //狀態(tài)2
if(key != 0xff) //還是按下的狀態(tài)
{
state = S3;
}
else //松開(kāi)了,短按
{
switch(key)
{
case 0x7F: 執(zhí)行短按任務(wù); break;
case 0xfe: 執(zhí)行短按任務(wù); break;
case 0xFB: 執(zhí)行短按任務(wù); break;
case 0xBF: 執(zhí)行短按任務(wù); break;
case 0xF7: 執(zhí)行短按任務(wù); break;
case 0xEF: 執(zhí)行短按任務(wù); break;
default:break;
}
}
break;
case S3: //判斷長(zhǎng)按短按
if(key != 0xff)
{
if(++cnt > 150) //1500ms
{
cnt = 190;
state = S4;
}
}
break;
case S4: //長(zhǎng)按松手檢測(cè)
if(key == 0xff) //松開(kāi)了
{
cnt = 0;
switch(key)
{
case 0xfe: 此鍵執(zhí)行長(zhǎng)按任務(wù) ; break;
}
}
else if (++cnt>=200) //連按
{
cnt = 190; //100ms觸發(fā)一次
switch(key)
{
case 0x7F: 執(zhí)行連按任務(wù); break;
case 0xFB: 執(zhí)行連按任務(wù); break;
default:break;
}
break;
}
}
|
|