Arduino矩阵键盘输入参与乘法运算后串口与七段数码管显示异常
问题根因
- 按键触发逻辑错误:
loop中拿到按键直接执行customKey=customKey-'0',再判断是否等于字符'A',此时'A'减去'0'的结果是十进制17,不可能和字符'A'(ASCII码65)匹配,触发shahbaz函数的逻辑本身就存在概率性异常。 - 按键读取时机错误:进入shahbaz函数后才调用一次
getKey(),此时A键已经松开,getKey()无按键输入时默认返回0,乘上a=20结果就是0,所以数码管显示0000;如果读到的是残留的无效按键值,就会出现负数等异常打印。 - 字符转数值逻辑错误:只有数字字符('0'~'9')才能通过减'0'转成对应数值,功能键(A/B/C/D/*/#)直接减'0'会得到无意义的数值。
- 不支持多位数输入:现有逻辑只能读取单个按键值,最多输入0~9的数字,无法输入你硬编码测试的1200这类多位数。
- 变量重复定义:shahbaz函数中两次定义同名变量
t,属于语法隐患。
修复方案
下面是可正常运行的修改后代码:
#include <Keypad.h> #include "LedControl.h" LedControl lc = LedControl(11,3,4,1); //DIN, SCK, LOAD,1xMAX7219 int a=20; int b=30; int c=37; int d=40; const byte ROWS = 4; const byte COLS = 4; char hexaKeys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; byte rowPins[ROWS] = { A0, A1, A2, A3}; byte colPins[COLS] = { A4, 5, 6, 7}; Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); void setup() { Serial.begin(9600); lc.shutdown(0,false); // 唤醒显示 lc.setIntensity(0,7); // 亮度0-15 lc.clearDisplay(0); // 清屏 } void loop() { char customKey = customKeypad.getKey(); // 先判断按键是A再触发函数,不要提前减'0' if(customKey == 'A'){ shahbaz(); } } void shahbaz(){ long inputNum = 0; // 存储输入的多位数 while(1) { char key = customKeypad.getKey(); if(key) { // 有按键按下 if(key >= '0' && key <= '9') { // 是数字键,累加数值 inputNum = inputNum * 10 + (key - '0'); Serial.print("当前输入:"); Serial.println(inputNum); } else if(key == '#') { // 按#结束输入,开始计算 break; } } } long t = a * inputNum; // 计算乘积 Serial.print("计算结果:"); Serial.println(t); // 拆分数字显示到数码管 int digitOne = (t%10); int digitTwo = (t/10)%10; int digitThree = (t/100)%10; int digitFour = (t/1000)%10; int digitFive = (t/10000)%10; int digitSix = (t/100000)%10; int digitSeven= (t/1000000)%10; int digitEight = (t/10000000)%10; lc.setDigit(0,7,digitEight,false); lc.setDigit(0,6,digitSeven,false); lc.setDigit(0,5,digitSix,false); lc.setDigit(0,4,digitFive,false); lc.setDigit(0,3,digitFour,false); lc.setDigit(0,2,digitThree,false); lc.setDigit(0,1,digitTwo,false); lc.setDigit(0,0,digitOne,false); delay(1000); }
使用说明
按下A键进入输入模式,通过矩阵键盘输入要计算的数字,按下#键确认,即可自动计算和a=20的乘积并显示在数码管上。
内容的提问来源于stack exchange,提问作者Shahbaz zulfqar
相关产品推荐
相关产品推荐

