You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:15:01