按键加减时出现两次1的情况通常是由于按键抖动引起的。按键抖动是指在按下或释放按键时,由于机械性质或电气接触不稳定等原因,导致按键信号在短时间内多次切换状态。这种抖动可能会导致单片机在检测按键状态时误认为按键被按下了两次。 为了解决按键抖动问题,可以在软件中使用适当的按键消抖算法。一种常用的按键消抖方法是使用软件延时和状态判断的组合。 |
没细看程序,完按键,记得检测按键松开![]() |
188610329 发表于 2023-5-26 00:05 同意17楼意见,虽然楼主按键代码写得......,但问题核心不在于此。在于串口初始化函数被胡乱开启中断。众所周知,T1作为波特率发生器就得禁止定时器1中断。否则就可能发生不可预测的错误。按如下设置问题迎刃而解。 void InitUART(void) //9600bps@11.0592MHz { SCON = 0x50; //8位数据,可变波特率 TMOD |= 0x20; //设置定时器模式 TL1 = 0xFD; //设置定时初始值 TH1 = 0xFD; //设置定时重载值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //定时器1开始计时 } |
sr861126 发表于 2023-5-25 08:28 你明白抖动的意思么? 按你的代码,如果按键抖动,应该按一次后,连续发出 01,02 甚至还有 03 但是,你是发两次 01, 说明,运行了两次 SBUF = cost, 却没有运行两次 cost++,所以和抖动没有任何关系。 |
按键代码需要做消抖处理 |
找个例程看看防抖怎么做吧,暂时看是防抖没做好,或者说没做防抖 |
A-set 发表于 2023-5-24 17:23 去掉延时是一样de |
sr861126 发表于 2023-5-25 08:43 为什么消不掉呢 |
123456ZXC1 发表于 2023-5-24 12:29 是抖动,刚上电按下出现抖动,后面按就没有抖动了 |
huaruolong 发表于 2023-5-24 18:41 没有关系,还是抖动的问题 |
188610329 发表于 2023-5-24 22:21 别人的地方没有--,初始时是0,按理说按一次就加1,但是按了2次才加1,后面按就正常按一次加1 |
和按键抖动无关, 如果抖动了, 发送前 肯定会 ++ 或者 -- 一次, 绝对有别的代码, 所谓的 发两次1 是要发 2 的时候被 -1 了, 看你那个 5 后面 发了个3 就知道, 肯定有个地方在 - cost |
描述与按键代码不一致,你这代码近乎长短按,短按响应一次,长按每隔0.5秒重复响应。延时消抖被注释掉了,移放在不恰当的位置。 |
你这程序是没copy全,还是就是这样, SBUF,TI,都没看到定义。难到不会报错。另建议key,不要用p3.2,P3.3,p3.4.因为这几个IO有第二功能,在用这几个io时就有可能和其他冲突,程序肯定不会报错,但可能会有莫名奇妙的问题产生。 |
sr861126 发表于 2023-5-24 15:51 按键1消抖后里面的延时去掉看看还有没有 |
按键1的消抖再判断之后的里面的那个延时去掉看看还有没有 |
123456ZXC1 发表于 2023-5-24 12:29 但是后面再按就没有抖动了,只是初始时有这样的情况 |
可能是由于按键的按下动作引起了按键的抖动 |