|
想實(shí)現(xiàn)的功能:unit按鍵短按單位切換,長(zhǎng)按3S開(kāi)關(guān)機(jī)。
方法1:此鍵連到外部中斷IO口,開(kāi)機(jī)時(shí)短按單位切換,長(zhǎng)按時(shí)可以關(guān)機(jī),關(guān)機(jī)時(shí)短按下降沿觸發(fā)外部中斷也可以開(kāi)機(jī),基本可以實(shí)現(xiàn)想要的功能。但在短按觸發(fā)外部中斷開(kāi)機(jī)時(shí),單位切換也會(huì)觸發(fā)一次,即關(guān)機(jī)前是單位1,短按開(kāi)機(jī)后會(huì)到單位2。
方法2:就是如上圖連接,硬件觸發(fā)開(kāi)機(jī),unit鍵不連到外部中斷,普通按鍵接法,只負(fù)責(zé)短按單位切換,長(zhǎng)按關(guān)機(jī)。關(guān)機(jī)短按UNIT可以開(kāi)機(jī),但也會(huì)出現(xiàn)單位觸發(fā)一次,現(xiàn)像與方法1一樣.
以上兩種方法都是因?yàn)榘聪聈nit開(kāi)機(jī)的同時(shí),單位短按也執(zhí)行了,這樣情況如何解決,各路大神快來(lái)幫幫小弟吧,這個(gè)問(wèn)題困擾小弟好久了!
下面是單片機(jī)按鍵掃描程序:
void key_scan()
{
static u8 state=S0,key_time,lastkey;
u8 key;
key=PD&0xFF;
switch(state) //檢測(cè)狀態(tài)
{
case S0:
if(key!= 0xFF) state = S1; break;
case S1:
if(key==0xFF) state = S0;
else
{
lastkey=key;
state=S2;
}
break;
case S2:
if(key==0xFF)
{
state = S0; //判斷輸入是否為1,為1返回狀態(tài)0
switch(lastkey)
{
case 0x7F: 執(zhí)行短按任務(wù) break;
case 0xfe: 執(zhí)行短按任務(wù) break; //unit短按單位切換
case 0xFB: 執(zhí)行短按任務(wù) break;
case 0xBF: 執(zhí)行短按任務(wù) break;
case 0xF7: 執(zhí)行短按任務(wù) break;
case 0xEF: 執(zhí)行短按任務(wù) break;
default:break;
}
}
else if(++key_time==200)
{
key_time=0;
switch(key)
{
case 0xfe: 執(zhí)行長(zhǎng)按任務(wù) break; // unit不僅連到單片機(jī)普通IO,還連到外部中斷IO口,開(kāi)機(jī)時(shí)長(zhǎng)按關(guān)機(jī),關(guān)機(jī)時(shí)短按下降沿觸發(fā)開(kāi)機(jī)。
}
state=S3;
}
break;
case S3:
if(key==0xFF) state=S0;
else if(++key_time==5) //否則開(kāi)始計(jì)時(shí),計(jì)時(shí)結(jié)束按鍵連擊
{
key_time=0;
switch(key)
{
case 0x7F: 執(zhí)行連擊任務(wù) break;
case 0xFB: 執(zhí)行連擊任務(wù) break; }
}
break;
}
}
|
|