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

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-06-17 23:29:49
已绑定手机

5

主题

57

回帖

251

积分

中级会员

积分
251
发表于 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
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

734

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

3

主题

698

回帖

107

积分

等待验证会员

积分
107
发表于 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
  • 打卡总天数:499
  • 最近打卡:2025-06-17 08:23:30
已绑定手机

14

主题

1312

回帖

3302

积分

论坛元老

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:396
  • 最近打卡:2025-06-17 00:04:36
已绑定手机

142

主题

1688

回帖

2563

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:343
  • 最近打卡:2025-06-17 10:16:32
已绑定手机

4

主题

397

回帖

1895

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-06-17 09:09:48
已绑定手机

79

主题

5137

回帖

9134

积分

超级版主

DebugLab

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-06-17 23:29:49
已绑定手机

5

主题

57

回帖

251

积分

中级会员

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-06-17 23:29:49
已绑定手机

5

主题

57

回帖

251

积分

中级会员

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-06-17 23:29:49
已绑定手机

5

主题

57

回帖

251

积分

中级会员

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-18 00:31 , Processed in 0.186728 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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