333.png (45.87 KB, 下載次數(shù): 26)
下載附件
2023-1-5 10:05 上傳
想實現(xiàn)的功能:unit按鍵短按單位切換,長按3S開關(guān)機。
方法1:此鍵連到外部中斷IO口,開機時短按單位切換,長按時可以關(guān)機,關(guān)機時短按下降沿觸發(fā)外部中斷也可以開機,基本可以實現(xiàn)想要的功能。但在短按觸發(fā)外部中斷開機時,單位切換也會觸發(fā)一次,即關(guān)機前是單位1,短按開機后會到單位2。
方法2:就是如上圖連接,硬件觸發(fā)開機,unit鍵不連到外部中斷,普通按鍵接法,只負責短按單位切換,長按關(guān)機。關(guān)機短按UNIT可以開機,但也會出現(xiàn)單位觸發(fā)一次,現(xiàn)像與方法1一樣.
以上兩種方法都是因為按下unit開機的同時,單位短按也執(zhí)行了,這樣情況如何解決,各路大神快來幫幫小弟吧,這個問題困擾小弟好久了!
下面是單片機按鍵掃描程序:
void key_scan()
{
static u8 state=S0,key_time,lastkey;
u8 key;
key=PD&0xFF;
switch(state) //檢測狀態(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í)行長按任務(wù) break; // unit不僅連到單片機普通IO,還連到外部中斷IO口,開機時長按關(guān)機,關(guān)機時短按下降沿觸發(fā)開機。
}
state=S3;
}
break;
case S3:
if(key==0xFF) state=S0;
else if(++key_time==5) //否則開始計時,計時結(jié)束按鍵連擊
{
key_time=0;
switch(key)
{
case 0x7F: 執(zhí)行連擊任務(wù) break;
case 0xFB: 執(zhí)行連擊任務(wù) break; }
}
break;
}
}
|