找回密码
 立即注册
查看: 282|回复: 12

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-03-30 09:54:48
已绑定手机

5

主题

56

回帖

239

积分

中级会员

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



回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-3-19 09:34:15 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-18 22:48:00 | 显示全部楼层
独立按键消抖是嵌入式系统设计中常见的需求,主要用于消除机械按键在按下或释放时产生的抖动现象。按键抖动通常会导致多次误触发,影响系统的稳定性和可靠性。以下是针对您提供的代码的消抖实现建议:<br><br>1. 延时消抖法:在检测到按键按下后,延时一段时间(通常为10ms~20ms),再次检测按键状态。若按键仍为按下状态,则确认为有效按键事件。<br><br>
  1. 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>[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:452
  • 最近打卡:2025-05-01 06:20:50
已绑定手机

13

主题

1257

回帖

2971

积分

金牌会员

积分
2971
发表于 2025-3-19 00:12:16 | 显示全部楼层
暂且不说防抖功能/效果怎么样,你要读懂代码才行啊,你while中的功能是:P34按下,直到松开后P0赋值0xF0,退出if,再进while循环,这是P34是松开状态,P0马上赋值0x77。
也就说说再你P34按键松开的瞬间P0的状态改变为0xF0,其他时刻都是0x77。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:351
  • 最近打卡:2025-05-02 00:50:51
已绑定手机

130

主题

1520

回帖

1859

积分

金牌会员

积分
1859
发表于 2025-3-19 01:27:00 | 显示全部楼层
仿真看看,在哪一步卡住了.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-05-01 06:53:32
已绑定手机

4

主题

339

回帖

1558

积分

金牌会员

积分
1558
发表于 2025-3-19 08:16:03 | 显示全部楼层
用一个灯取反显示按键有没有按下,不是更好看结果
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-19 12:30:46 | 显示全部楼层

这个程序作为函数,在主循环中周期调用即可
注意调用周期要大于按键抖动时间
截图202503191229484983.jpg
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-03-30 09:54:48
已绑定手机

5

主题

56

回帖

239

积分

中级会员

积分
239
发表于 2025-3-19 21:49:25 | 显示全部楼层
vb2*** 发表于 2025-3-19 01:27
仿真看看,在哪一步卡住了.

我菜鸟一枚,不会仿真
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-03-30 09:54:48
已绑定手机

5

主题

56

回帖

239

积分

中级会员

积分
239
发表于 2025-3-19 21:50:33 | 显示全部楼层
神*** 发表于 2025-3-19 09:34
利用【主循环次数】去抖动

感谢又提供了一个学习网址,我去学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-03-30 09:54:48
已绑定手机

5

主题

56

回帖

239

积分

中级会员

积分
239
发表于 2025-3-19 22:01:21 | 显示全部楼层
国芯人*** 发表于 2025-3-18 22:48
独立按键消抖是嵌入式系统设计中常见的需求,主要用于消除机械按键在按下或释放时产生的抖动现象。按键抖动 ...

感谢指教,第一种方法试了,是可以的,另二种状态机不会
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 04:27 , Processed in 0.151516 second(s), 119 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表