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