2016-08-04 75 views
-1

試圖做一個簡單的Arduino加法器,但我遇到了編程的麻煩。我不確定我犯了什麼錯誤。任何幫助將非常感激。如何編程Arduino以將兩個鍵盤輸入保存在不同的變量中?

用戶必須在鍵盤上輸入兩個數字,它們的總和纔會顯示在LCD上。用戶輸入的兩個數字中的每一個都分別存儲在它們的變量中。問題在於,在輸入第一個數字後,程序會自動插入0(因爲那時沒有按鍵)。我嘗試過'如果','while'和'do while'語句來消除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); 

    } 

} 
+0

該電路可能不相關,但代碼不是,所以請編輯您的問題以包含實際的代碼。鏈接到代碼的問題是毫無價值的,因爲誰知道鏈接何時會消失。請花些時間和[閱讀關於如何提出好問題](http://stackoverflow.com/help/how-to-ask),並學習如何創建[最小,完整和可驗證示例](http: //stackoverflow.com/help/mcve)。 –

回答

1

你有這樣的代碼段:

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

在while條件,它看起來像你與(b = NO_KEY)分配NO_KEYb,而不是用(b == NO_KEY)檢查平等。該賦值返回true,因此循環不會退出。 它應該是這樣的:

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

對於加法問題,你的鍵盤映射包含字符,而不是整數。因此,A和B應該是char類型的,並且可以使用atoi()將它們轉換爲整數:

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 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) 
} 
+0

非常感謝! –

+0

好的。所以,多虧了你現在的中途工作...出於某種原因,它顯示的信件總數而不是數字 –

+0

實際上它顯示的總和作爲字母表中的字母數字的地方。 - 例如1 + 0 = a(1是第一個字母)1 + 1 = b(兩個作爲第二個字母)2 + 2 = d等等...... –

相關問題