找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

按键加减为什么会出现两次1 附单片机程序

查看数: 2365 | 评论数: 19 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-5-24 11:22

正文摘要:

/******************************************************************** * 文件名  : 独立按键.c * 描述    :  该程序实现独立按键去控制 LED灯 的亮灭,并讲诉了对按键的处理方 ...

回复

ID:1079863 发表于 2023-5-26 14:26
按键加减时出现两次1的情况通常是由于按键抖动引起的。按键抖动是指在按下或释放按键时,由于机械性质或电气接触不稳定等原因,导致按键信号在短时间内多次切换状态。这种抖动可能会导致单片机在检测按键状态时误认为按键被按下了两次。  为了解决按键抖动问题,可以在软件中使用适当的按键消抖算法。一种常用的按键消抖方法是使用软件延时和状态判断的组合。
ID:45879 发表于 2023-5-26 09:23
没细看程序,完按键,记得检测按键松开
ID:213173 发表于 2023-5-26 08:47
188610329 发表于 2023-5-26 00:05
你明白抖动的意思么?
按你的代码,如果按键抖动,应该按一次后,连续发出 01,02  甚至还有 03
但是, ...

同意17楼意见,虽然楼主按键代码写得......,但问题核心不在于此。在于串口初始化函数被胡乱开启中断。众所周知,T1作为波特率发生器就得禁止定时器1中断。否则就可能发生不可预测的错误。按如下设置问题迎刃而解。
void InitUART(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        TMOD |= 0x20;                //设置定时器模式
        TL1 = 0xFD;                //设置定时初始值
        TH1 = 0xFD;                //设置定时重载值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //定时器1开始计时
}
ID:624769 发表于 2023-5-26 00:05
sr861126 发表于 2023-5-25 08:28
按一次,抖动了出现了两个“1”

你明白抖动的意思么?
按你的代码,如果按键抖动,应该按一次后,连续发出 01,02  甚至还有 03
但是,你是发两次  01, 说明,运行了两次  SBUF = cost, 却没有运行两次 cost++,所以和抖动没有任何关系。
ID:330059 发表于 2023-5-25 20:01
按键代码需要做消抖处理
ID:384109 发表于 2023-5-25 10:28
找个例程看看防抖怎么做吧,暂时看是防抖没做好,或者说没做防抖
ID:302293 发表于 2023-5-25 10:11
A-set 发表于 2023-5-24 17:23
按键1消抖后里面的延时去掉看看还有没有

去掉延时是一样de
ID:302293 发表于 2023-5-25 08:59
sr861126 发表于 2023-5-25 08:43
没有关系,还是抖动的问题

为什么消不掉呢
ID:302293 发表于 2023-5-25 08:45
123456ZXC1 发表于 2023-5-24 12:29
可能是由于按键的按下动作引起了按键的抖动

是抖动,刚上电按下出现抖动,后面按就没有抖动了
ID:302293 发表于 2023-5-25 08:43
huaruolong 发表于 2023-5-24 18:41
你这程序是没copy全,还是就是这样, SBUF,TI,都没看到定义。难到不会报错。另建议key,不要用p3.2,P3.3 ...

没有关系,还是抖动的问题
ID:302293 发表于 2023-5-25 07:56
188610329 发表于 2023-5-24 22:21
和按键抖动无关, 如果抖动了, 发送前 肯定会 ++ 或者 -- 一次, 绝对有别的代码,  所谓的 发两次1 是要发 2  ...

别人的地方没有--,初始时是0,按理说按一次就加1,但是按了2次才加1,后面按就正常按一次加1
ID:624769 发表于 2023-5-24 22:21
和按键抖动无关, 如果抖动了, 发送前 肯定会 ++ 或者 -- 一次, 绝对有别的代码,  所谓的 发两次1 是要发 2 的时候被 -1 了,  看你那个  5 后面  发了个3 就知道, 肯定有个地方在  - cost
ID:213173 发表于 2023-5-24 21:18
描述与按键代码不一致,你这代码近乎长短按,短按响应一次,长按每隔0.5秒重复响应。延时消抖被注释掉了,移放在不恰当的位置。
ID:202023 发表于 2023-5-24 18:41
你这程序是没copy全,还是就是这样, SBUF,TI,都没看到定义。难到不会报错。另建议key,不要用p3.2,P3.3,p3.4.因为这几个IO有第二功能,在用这几个io时就有可能和其他冲突,程序肯定不会报错,但可能会有莫名奇妙的问题产生。
ID:1079614 发表于 2023-5-24 17:23
sr861126 发表于 2023-5-24 15:51
但是后面再按就没有抖动了,只是初始时有这样的情况

按键1消抖后里面的延时去掉看看还有没有
ID:1079614 发表于 2023-5-24 17:22
按键1的消抖再判断之后的里面的那个延时去掉看看还有没有
ID:302293 发表于 2023-5-24 15:51
123456ZXC1 发表于 2023-5-24 12:29
可能是由于按键的按下动作引起了按键的抖动

但是后面再按就没有抖动了,只是初始时有这样的情况
ID:526543 发表于 2023-5-24 12:29
可能是由于按键的按下动作引起了按键的抖动

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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