回覆列表
-
1 # 招財機器人
-
2 # 悠閒宇宙W1
首先我不太清楚你的控制邏輯,專案要求以及用哪種語言實現。和你分享一下我的一些經驗。首先按鍵一定要有的是去抖動,另外從邏輯上一定要用並行的,序列測試修改的時候會相對麻煩一些。
首先我不太清楚你的控制邏輯,專案要求以及用哪種語言實現。和你分享一下我的一些經驗。首先按鍵一定要有的是去抖動,另外從邏輯上一定要用並行的,序列測試修改的時候會相對麻煩一些。
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4
while(1)//不斷的迴圈掃描
{
key=KEY_Scan(0); //得到鍵值
if(key)
{
switch(key)
{
case WKUP_PRES: //控制蜂鳴器
BEEP=!BEEP;
break;
case KEY0_PRES: //控制LED0翻轉
LED0=!LED0;
break;
case KEY1_PRES: //控制LED1翻轉
LED1=!LED1;
break;
case KEY2_PRES: //同時控制LED0,LED1翻轉
LED0=!LED0;
LED1=!LED1;
break;
}
}
}
//按鍵處理函式
//返回按鍵值
//mode:0,不支援連續按,1,支援連續按
//0:沒有任何按鍵按下
//1:KEY0按下
//2:KEY1按下
//3:KEY3按下
//4:KEUP按下
//注意此函式有響應優先順序 KEY0>KEY1>KEY2:WK_UP
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按鍵鬆開標誌
if(mode)key_up=1; //支援連按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);//去抖動
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;// 無按鍵按下
}
說明:對於MCU而言,透過while中的主迴圈不斷呼叫KEY_Scan程式,當掃描到某個按鍵的輸入訊號發生變化時,返回對應的值。
然後key變數獲取按鍵值,當按鍵值為非0時表示有按鍵值,進入case語句判斷,執行對應的響應動作。其中WKUP_PRES,KEY0_PRES,KEY1_PRES、KEY2_PRES已經在前面進行宏定義。