今天一位同事在做,使用一個按鍵來,控制鎖鍵盤和開鍵盤的功能 時遇到了麻煩.下面是當時的程序環境.
當用戶按下hold鍵時鎖住屏幕,再按hold鍵時解鎖,如此往復.因爲在底層是每隔20ms掃描一次按鍵
所以當用戶按下hold鍵時gpio_a1口電平會變高,在按鍵彈起時電平會變低.所以這位同事使用了一個flag
來表示鎖和解鎖的狀態.他大致是這樣做的.
...
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;
}