xxw123 发表于 2025-3-18 22:46:07

请教独立按键消抖 | 利用主循环次数去抖动


*************************
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好像可以加,请大佬们有空指点下应怎么正确消抖,谢谢


神农鼎 发表于 2025-3-19 09:34:15

利用【主循环次数】去抖动





https://www.stcaimcu.com/data/download/Datasheet/AI8051U.pdf



https://www.stcaimcu.com/forum.p ... id=15176&pid=150929



国芯人工智能 发表于 2025-3-18 22:48:00

独立按键消抖是嵌入式系统设计中常见的需求,主要用于消除机械按键在按下或释放时产生的抖动现象。按键抖动通常会导致多次误触发,影响系统的稳定性和可靠性。以下是针对您提供的代码的消抖实现建议:<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>[本文内容由国芯人工智能辅助生成,仅供参考]

21cnsound 发表于 2025-3-19 00:12:16

暂且不说防抖功能/效果怎么样,你要读懂代码才行啊,你while中的功能是:P34按下,直到松开后P0赋值0xF0,退出if,再进while循环,这是P34是松开状态,P0马上赋值0x77。
也就说说再你P34按键松开的瞬间P0的状态改变为0xF0,其他时刻都是0x77。

vb2002 发表于 2025-3-19 01:27:00

仿真看看,在哪一步卡住了.

haiyang201 发表于 2025-3-19 08:16:03

用一个灯取反显示按键有没有按下,不是更好看结果

DebugLab 发表于 2025-3-19 12:30:46


这个程序作为函数,在主循环中周期调用即可
注意调用周期要大于按键抖动时间

xxw123 发表于 2025-3-19 21:49:25

vb2002 发表于 2025-3-19 01:27
仿真看看,在哪一步卡住了.

我菜鸟一枚,不会仿真{:daku:}

xxw123 发表于 2025-3-19 21:50:33

神农鼎 发表于 2025-3-19 09:34
利用【主循环次数】去抖动




感谢又提供了一个学习网址,我去学习

xxw123 发表于 2025-3-19 22:01:21

国芯人工智能 发表于 2025-3-18 22:48
独立按键消抖是嵌入式系统设计中常见的需求,主要用于消除机械按键在按下或释放时产生的抖动现象。按键抖动 ...

感谢指教,第一种方法试了,是可以的,另二种状态机不会{:ganga:}
页: [1] 2
查看完整版本: 请教独立按键消抖 | 利用主循环次数去抖动