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

看板ASM作者 (ksmrt)時間10年前 (2013/08/24 02:00), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串3/3 (看更多)
※ 引述《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的敘述都是可省略的, 留下來是讓狀替與輸出的關係更清楚 先醬吧~ 有不清楚或有錯誤的地方請再跟我說 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.84.232.180

08/24 02:06, , 1F
謝謝不吝解釋...我會再想看看!! <(_ _)>
08/24 02:06, 1F

08/24 02:25, , 2F
用IDEL LOOP的話應該先檢查KEY2再決定是否DELAY200ms
08/24 02:25, 2F

08/24 02:25, , 3F
不然會變成先開200MS才決定變更狀態喔
08/24 02:25, 3F
文章代碼(AID): #1I5wDDjL (ASM)
文章代碼(AID): #1I5wDDjL (ASM)