|
單片機(jī)源程序如下:
#define PD 0x22|(P1&0x51)|(P2<<1&0x80)|(P3<<2&0x0c) /組合5個按鍵為1個字節(jié)數(shù)據(jù)
#define S0 0 //狀態(tài)0
#define S1 1 //狀態(tài)1
#define S2 2 //狀態(tài)2
#define S3 3 //狀態(tài)3
sbit up = P2^6; //0111 1111 7f
sbit unit = P1^0; //1111 1110 fe
sbit down = P3^0; //1111 1011 fb
sbit md = P1^6; //1011 1111 bf
sbit k5 = P3^1; //1111 0111 f7
sbit k6 = P1^4; //1110 1111 ef
/*******************************************************************************
* 文件名:按鍵函數(shù)
* 描 述:
* 功 能:
* 參 數(shù):無
*******************************************************************************/
void key_scan()
{
bit kflag;
static u8 state=S0,key_time;
u8 key;
key=PD&0xFF;
switch(state) //檢測狀態(tài)
{
case S0: //狀態(tài)0
if(key!= 0xFF) state = S1; break;
case S1: //狀態(tài)1
if(key==0xFF) state = S0; //判斷輸入是否為1,為1返回狀態(tài)0
else //否則,轉(zhuǎn)入狀態(tài)2,執(zhí)行按鍵程序
{
state=S2; //按鍵按下執(zhí)行短按操作
switch(key)
{
case 0x7F: 加鍵 break;
case 0xfe: 單位切換 break;
case 0xFB: 減鍵 break;
case 0xBF: 執(zhí)行任務(wù) break;
case 0xF7: 執(zhí)行任務(wù) break;
case 0xEF: 執(zhí)行任務(wù) break;
default:break;
}
}
break;
case S2: //狀態(tài)2
if(key==0xFF) state = S0; //判斷輸入是否為1,為1返回狀態(tài)0
else if(++key_time==200) //按下時間等于200時為長按,轉(zhuǎn)入狀態(tài)3
{
key_time=0;state=S3;
}
break;
case S3: //狀態(tài)3
if(key==0xFF) state=S0; //判斷輸入是否為1,為1返回狀態(tài)0
else if(++key_time==5) //否則開始計(jì)時,計(jì)時結(jié)束按鍵連擊
{
key_time=0;
switch(key)
{
case 0x7F: 執(zhí)行任務(wù) break;
case 0xfe: 單位切換+長按開關(guān)機(jī) break; //短按切換單位,長按開關(guān)機(jī)。長按開機(jī)或關(guān)機(jī)后都會跟隨一次短按,如關(guān)機(jī)前是P單位,再次開機(jī)后不會在P單位,而是P下一個單位K.(此鍵放在這個位置是不對的,這里是連按識別,應(yīng)該放在長按識別里的。)
case 0xFB: 執(zhí)行任務(wù) break;
}
}
break;
}
紅色標(biāo)注部分如何解決?在網(wǎng)上查了下,是不是要加個自鎖標(biāo)志?
|
|