作者ksmrt0123 (ksmrt)
看板ASM
标题Re: [问题] 8051 按钮控制问题
时间Sat Aug 24 02:00:40 2013
※ 引述《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
1F:推 victim0130:谢谢不吝解释...我会再想看看!! <(_ _)> 08/24 02:06
2F:推 WolfLord:用IDEL LOOP的话应该先检查KEY2再决定是否DELAY200ms 08/24 02:25
3F:→ WolfLord:不然会变成先开200MS才决定变更状态喔 08/24 02:25