请教独立按键消抖 | 利用主循环次数去抖动
*************************
void main(void)
{ P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口
P40 = 0; //LED Power On
while(1)
{
if(P34==0)//按下独立按键
{
delay_ms(10);//按下消抖
while(P34==0);//松手检测
delay_ms(10);//松手消抖
P0=0xF0;
}
else
P0=0x77;
}
}
*************************
如上代码写入AI8051U实验箱,按按键不起作用,原因是加了这条:while(P34==0);//松手检测
但8H1K08好像可以加,请大佬们有空指点下应怎么正确消抖,谢谢
利用【主循环次数】去抖动
https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf
https://www.stcaimcu.com/forum.p ... id=15176&pid=150929
独立按键消抖是嵌入式系统设计中常见的需求,主要用于消除机械按键在按下或释放时产生的抖动现象。按键抖动通常会导致多次误触发,影响系统的稳定性和可靠性。以下是针对您提供的代码的消抖实现建议:<br><br>1. 延时消抖法:在检测到按键按下后,延时一段时间(通常为10ms~20ms),再次检测按键状态。若按键仍为按下状态,则确认为有效按键事件。<br><br>c<br>void main(void)<br>{<br> P0M1 = 0x00; P0M0 = 0xff; //设置为推挽输出<br> P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口<br> P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口<br> P40 = 0; //LED Power On<br> while(1)<br> {<br> if(P34 == 0) //检测按键按下<br> {<br> delayms(20); //延时消抖<br> if(P34 == 0) //再次确认按键状态<br> {<br> //执行按键处理逻辑<br> while(P34 == 0); //等待按键释放<br> }<br> }<br> }<br>}<br><br>2. 状态机消抖法:通过状态机实现消抖,适用于对实时性要求较高的场景。状态机可根据按键状态变化时间进行判断,避免频繁延时。<br><br>以上方法均可有效消除按键抖动,具体选择可根据系统需求和应用场景决定。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考] 暂且不说防抖功能/效果怎么样,你要读懂代码才行啊,你while中的功能是:P34按下,直到松开后P0赋值0xF0,退出if,再进while循环,这是P34是松开状态,P0马上赋值0x77。
也就说说再你P34按键松开的瞬间P0的状态改变为0xF0,其他时刻都是0x77。
仿真看看,在哪一步卡住了. 用一个灯取反显示按键有没有按下,不是更好看结果
这个程序作为函数,在主循环中周期调用即可
注意调用周期要大于按键抖动时间
vb2002 发表于 2025-3-19 01:27
仿真看看,在哪一步卡住了.
我菜鸟一枚,不会仿真{:daku:} 神农鼎 发表于 2025-3-19 09:34
利用【主循环次数】去抖动
感谢又提供了一个学习网址,我去学习 国芯人工智能 发表于 2025-3-18 22:48
独立按键消抖是嵌入式系统设计中常见的需求,主要用于消除机械按键在按下或释放时产生的抖动现象。按键抖动 ...
感谢指教,第一种方法试了,是可以的,另二种状态机不会{:ganga:}
页:
[1]
2