關於一鍵控制鎖鍵盤和開鍵盤

 

  今天一位同事在做,使用一個按鍵來,控制鎖鍵盤和開鍵盤的功能 時遇到了麻煩.下面是當時的程序環境.

當用戶按下hold鍵時鎖住屏幕,再按hold鍵時解鎖,如此往復.因爲在底層是每隔20ms掃描一次按鍵

所以當用戶按下hold鍵時gpio_a1口電平會變高,在按鍵彈起時電平會變低.所以這位同事使用了一個flag

來表示鎖和解鎖的狀態.他大致是這樣做的.

int flag = UnLocked; /* 初始化時爲沒加鎖 */
    
    ...

if (GPIO_A1 == HIGH)
{
    
if (flag == UnLocked)
    {
        locked_keyboard(TRUE);
        flag 
= Locked;
    }
    
else
    {
        locked_keyboard(FALSE);
        flag 
= UnLocked;
    }    
}

結果老是出現問題,問題出在由於是每20ms掃描檢測一次,當用戶按下,gpio_a1爲高電平,而這個時間往往會大於

20ms所以會出現循環檢查多次給flag付值導致flag的不確定性.後來在另一位高手的提示下多增加了一個flag的

開關,這才解決問題

/* 初始化時 */
int flag = UnLocked; 
int flagSwitch = flagOpen;
    ...
/*
 * 當按鍵按下時GPIO_A1爲HIGH電平再看flagSwitch是否爲打開狀態
 * 在這兩個條件成立時,再檢測flag爲鎖則解鎖,爲解鎖則鎖住,之後
 * 再將flagSwitch開關關閉。避免按下時間超過20ms重複給flag付值。
 
*/
if (GPIO_A1==HIGH && flagSwitch==flagOpen)
{
    
/* 判斷如果但前狀態爲沒有鎖的狀態,則馬上響應用戶按下,鎖住鍵盤.反之亦然 */
    
if (flag == UnLocked)
    {
        locked_keyboard(TRUE);
        flag 
= Locked;
    }
    
else
    {
        locked_keyboard(FALSE);
        flag 
= UnLocked;
    }    
    flagSwitch 
= flagClose;
}
/*
 *    當按鍵擡起時GPIO_A1爲LOW電平再看flagSwitch是否爲關閉狀態
 *  如果條件成立,則將flagSwitch設置爲打開狀態爲下一次按鍵按下
 *  作準備。
 
*/
else if (GPIO_A1==LOW && flagSwitch==flagClose)
{
    flagSwitch 
= flagOpen;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章