Re: [問題] 8051 按鈕控制問題

作者: ksmrt0123 (ksmrt)   2013-08-24 02:00:40
※ 引述《victim0130 (Maxwell)》之銘言:
: 有兩個按鍵,按鍵1按下去後,輸出1會ON(停滯200ms),
: 然後這時候偵測按鍵二是否有按下去,
: 如果按鍵二也按下去,則輸出1會一直ON的狀態,
: 假設按鍵二沒按下去,則輸出1就會off。
: 上面的功能都算是有寫出來,
: 不過,小弟還差一個功能沒寫出來,
: 如果在輸出1一直ON的狀態的時候,按鍵1又按下去,
: 則輸出1會變成off的狀態,若此時再按按鍵1,
: 又會回復到上面的狀態,偵測按鍵二是否有按下去,
: 若有則呈現on的狀態,若沒有則off。
首先簡化邏輯. 可用一個變數state來分辨兩個狀態
state 0: normal, 按key1 輸出1(維持200ms), 測試key2以決定是否進入 state 1
state 1: 維持輸出1, 測試key1以決定是否回復 state 0
這部份可以先畫流程圖或狀態圖.
再寫出對應的程式碼:
state = 0;
while(1) {
if(state==0) {
if(key1) {
output(1);
delay_ms(200);
if(key2) {
state = 1;
output(1); // dummy
} else {
state = 0; // dummy
output(0);
}
}
} else { // state==1
output(1); // dummy
if(key1) {
state = 0;
output(0);
}
}
}
debounce不見得需要, 因為最主要的輸出是delay 200ms, 期間不做其他事
key release需不需要偵測也是看需求, 需要的話state會變多
幾個dummy的敘述都是可省略的, 留下來是讓狀替與輸出的關係更清楚
先醬吧~ 有不清楚或有錯誤的地方請再跟我說
作者: victim0130 (Maxwell)   2013-08-24 02:06:00
謝謝不吝解釋...我會再想看看!! <(_ _)>
作者: WolfLord (呆呆小狼￾ ￾ N￾ ￾ )   2013-08-24 02:25:00
用IDEL LOOP的話應該先檢查KEY2再決定是否DELAY200ms不然會變成先開200MS才決定變更狀態喔

Links booklink

Contact Us: admin [ a t ] ucptt.com