如何解决按键长按时代码重复输出同一输入值的问题
解决按键长按重复输出的问题
你的问题根源在于循环每100ms就会读取一次按键,当按键被长按的时候,ReadKeyPad()会持续返回同一个键值,导致每次循环都执行数字累加/功能触发的逻辑,自然就出现了重复输出的情况。
要解决这个问题,我们需要只响应按键的“首次按下”事件,而不是每次循环都处理相同的长按输入。核心思路是记录上一次的按键状态,只有当当前按键是新按下(和上一次状态不同)时,才执行对应的逻辑。
修改后的代码示例
char last_ch = 0; // 记录上一次的按键值,初始设为无按键状态(根据你的ReadKeyPad返回值调整) char ch; int i = 0; char str[20]; while(1){// 主函数中的while循环 ch = ReadKeyPad(ch); // 只有当当前有按键,且和上一次按键不同时,才处理逻辑 if (ch != 0 && ch != last_ch) { if (ch == '*') { i *= 100; } else if (ch == '#') { i = 0; ezLCD_ClearDisplay(lcd); } else if (ch >= '0' && ch <= '9') { i = i*10 + (ch - '0'); } // 更新显示 sprintf(str, "%d ", i); ezLCD_Position(lcd, 0, 0); ezLCD_PrintString(lcd, str); last_ch = ch; // 记录当前按键为上一次状态 } // 如果当前没有按键,重置last_ch,确保下次按键能被正确识别 else if (ch == 0) { last_ch = 0; } timer_waitMillis(100); }
关键逻辑说明
- 状态记录:用
last_ch保存上一次的按键值,确保只有新的按键按下时才触发处理逻辑。 - 无按键重置:当
ReadKeyPad返回无按键状态(这里假设是0,你需要根据自己的函数返回值调整)时,重置last_ch,这样下次按键按下时能被正确识别为新事件。 - 显示更新时机:只在按键首次按下时更新显示,避免长按期间重复刷新LCD。
额外注意事项
- 请确认
ReadKeyPad函数在无按键按下时的返回值,如果不是0,需要把代码中的0替换成对应的无按键标识(比如'\0'或者其他自定义值)。 - 如果后续需要支持长按连续输入(比如长按数字键快速累加),可以在这个基础上添加长按计时逻辑:当按键持续按下超过一定时间(比如500ms)后,再开启连续触发,但这需要额外的定时器变量来实现。
内容的提问来源于stack exchange,提问作者Shiore




