如何编程Arduino在单独的变量中获取和保存两个键盘输入?

时间:2016-08-04 04:38:53

标签: arduino arduino-uno electronics

尝试制作一个简单的Arduino加法器,但我遇到编程问题。我不确定我犯了什么错误。任何帮助将不胜感激。

用户必须在键盘上输入两个数字,并且它们的总和将显示在LCD上。用户输入的两个数字中的每一个分别存储在它们的变量中。问题是在输入第一个数字后,程序会自动插入0(因为此时没有按下任何键)第二个变量。我已经尝试了“如果','而'和'做什么'消除NO_KEY的陈述,但这些都没有起作用。

问题是,是否有办法将用户输入的数字存储在变量中,而不是让程序用0覆盖它,因为此时没有按下任何键。或者,也可以在按下按键后不让Arduino从键盘接收更多输入(可能以某种方式禁用键盘)......

如果您愿意花一些时间查看代码,则链接的here网站包含代码和整个实验室设置。

#include <Keypad.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd (7,8,9,10,11,12);
int backLight(13);


int Addition(int x, int y){
    int z;
    z = x+y;
    lcd.setCursor(8,0);
    lcd.write(z);
}

void setup() {

}

const byte rows =4;
const byte cols =3;

char keys[rows][cols]={
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'}
};

byte rowPins[rows] = {0,1,2,3};
byte colPins[cols] = {4,5,6};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);


void loop(){

    int a;
    int b;

    a = keypad.getKey();
    if (a != NO_KEY){

        do {
            b = keypad.getKey();
        }while (b == NO_KEY);

        pinMode (backLight, OUTPUT);
        digitalWrite(backLight, HIGH);
        lcd.begin(16,2);
        lcd.clear();

        lcd.setCursor(0,0);
        lcd.write(a);

        lcd.setCursor(2,0);
        lcd.write("+");

        lcd.setCursor(4,0);
        lcd.write(b);

        lcd.setCursor(6,0);
        lcd.write("=");

        Addition(a,b);
        delay(10000);

    }

}

1 个答案:

答案 0 :(得分:1)

您有一段代码如下:

NO_KEY

在while条件下,您似乎正在使用b(b = NO_KEY)分配给(b == NO_KEY),而不是检查与do { b = keypad.getKey(); } while (b == NO_KEY); 的相等性。赋值返回true,因此循环不会退出。 它应该是这样的:

atoi()

对于Addition问题,您的keymap包含字符而不是整数。所以a和b应该是char类型,你可以使用char a; char b; // ...assign values to a and b as you already do... Addition(atoi(a), atoi(b)); // use atoi() (ascii to int) to pass integer values to Addition 将它们转换为int:

int keys[rows][cols]={
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9},
    {'*',0,'#'}
};

或者,您可以将键盘映射更改为:

lcd.print(a, DEC)

并使用atoi()打印值。那么你不需要Addition(int x, int y) { int z; z = x+y; // z is now the integer sum lcd.setCursor(8,0); lcd.print(z, DEC); // print the decimal value of z (default is ascii) } 而且我认为它更干净。 加法功能:

p['x']             
                   A         B         C         D         E
2015-12-31  0.957941 -0.686432  1.087717  1.363008 -1.528369
2016-01-31  0.079616  0.524744  1.675234  0.665511  0.023160
2016-02-29 -0.300144 -0.705346 -0.141015  1.341883  0.855853
2016-03-31  0.435728  1.046326 -0.422501  0.536986 -0.656256


p['y']
                A      B     C      D    E
2015-12-31   True  False  True  False  NaN
2016-01-31   True   True  True  False  NaN
2016-02-29  False   True  True   True  NaN
2016-03-31    NaN    NaN   NaN    NaN  NaN