You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决按键长按时代码重复输出同一输入值的问题

解决按键长按重复输出的问题

你的问题根源在于循环每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

火山引擎 最新活动