Arduino 3×4键盘计算器多功能按键问题:多按*键切换运算失效
我明白你遇到的问题了——想用同一个*键切换四则运算,但现在只有第一次按的加法生效,后面的切换都没反应对吧?这是因为你的代码只处理了*键的单次触发,没有跟踪连续按下的次数和状态。咱们一步步来解决:
问题根源分析
你原来的switch case逻辑只是在每次检测到'*'按键时执行单一操作,但没有记录「连续按了几次」这个关键信息。而且键盘的getKey()函数是在按键被按下并释放后才返回值的,默认情况下,每次按*都会被当成独立的单次按键,不会自动累加次数。
解决方案:添加状态变量与计时逻辑
你需要几个额外的变量来跟踪状态,同时修改按键检测逻辑:
首先在代码开头(全局区域)定义这些变量:
#include <Keypad.h> #include <LiquidCrystal.h> // 这里保留你原有键盘和LCD的初始化代码 Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int starPressCount = 0; // 记录*键连续按下的次数 unsigned long lastStarPressTime = 0; // 上次按*键的时间戳 const unsigned long PRESS_INTERVAL = 1000; // 连续按键的最大间隔(1秒内按才算连续) char currentOp = '+'; // 默认初始运算符
然后在loop()函数里修改按键处理逻辑:
void loop() { char customKey = keypad.getKey(); if (customKey) { unsigned long currentTime = millis(); if (customKey == '*') { // 判断是否在连续按键的时间间隔内 if (currentTime - lastStarPressTime < PRESS_INTERVAL) { // 连续按下,累加计数,超过4次就重置回1 starPressCount++; if (starPressCount > 4) starPressCount = 1; } else { // 第一次按或者间隔太久,重置计数为1 starPressCount = 1; } lastStarPressTime = currentTime; // 根据计数切换运算符并显示 switch(starPressCount) { case 1: currentOp = '+'; lcd.clear(); // 可选:清屏后显示运算符 lcd.print("+"); break; case 2: currentOp = '-'; lcd.clear(); lcd.print("-"); break; case 3: currentOp = '*'; lcd.clear(); lcd.print("*"); break; case 4: currentOp = '/'; lcd.clear(); lcd.print("/"); break; } } else if (customKey >= '0' && customKey <= '9') { // 你的数字按键处理逻辑(保留原有代码即可) lcd.print(customKey); } else if (customKey == '#') { // 这里可以添加等于键的计算逻辑,直接用currentOp判断要执行的运算 // 比如:calculateResult(currentOp); } } }
关键细节说明
- 用
millis()而非delay():delay()会阻塞整个程序,导致键盘和LCD无法响应其他操作,而millis()可以在不阻塞的情况下实现计时 - 计数重置逻辑:如果两次按
*的间隔超过1秒,就会重置计数为1,避免用户不小心隔了很久按*,还继续累加计数 - 运算符存储:
currentOp变量会保存当前选中的运算符,后面计算结果时直接用这个变量判断即可
调试小技巧
- 可以临时在LCD上显示
starPressCount的值,方便你测试连续按键是否正确累加 - 如果按键检测不灵敏,先检查键盘的引脚定义和按键矩阵的接线是否正确
内容的提问来源于stack exchange,提问作者Ahmed Khaled
相关产品推荐
相关产品推荐

