2017-09-15 4 views
0
int ColumnPins = 4; //How many column pins 
int RowPins = 5; //How many row pins 
int Columns[] = {0, 1, 2, 3}; //Column pinNumbers 
int Rows[] = {4, 6, 7, 8, 9}; //Row pinNumbers 

void setup() 
{ 
    pinMode(13, OUTPUT); 
    for (int counter = 0; counter < ColumnPins; counter++) 
    { //set all the columns to output 
    pinMode(Columns[counter], OUTPUT); 
    } 
    for (int counter = 0; counter < RowPins; counter++) 
    { //set all rows to input 
    pinMode(Rows[counter],INPUT_PULLDOWN); 
    } 
} 

void loop() 
{ 
    for (int ColumnIndex = 0; ColumnIndex < ColumnPins; ColumnIndex++) //sets column pins to high 1 by 1 
    { 
    digitalWrite(Columns[ColumnIndex], HIGH); 
    RowScan(ColumnIndex); //calls function rowscan checks whether and row is HIGH 
    digitalWrite(Columns[ColumnIndex], LOW); 
    } 
} 

void RowScan(int ColumnIndex) //Scans each rowpin and checks whether any reads high 
{ 
    for (int RowIndex = 0; RowIndex < RowPins; RowIndex++) 
    { 
     if (digitalRead(Rows[RowIndex]) == HIGH) //if Rows at rowindex is high 
     { 
     for (int blinks = 0; blinks <= RowIndex; blinks++) 
     { //Outputs # of blinks based on which row HIGH was read 
      // print index 
      digitalWrite(13, HIGH); //LEDPIN high 
      delay(250); 
      digitalWrite(13, LOW); 
      delay(500); 
     } 
     for (int blinks = 0; blinks <= ColumnIndex; blinks++) 
     { //Outputs # of blinks based on which row HIGH was read 
      // print index 
      digitalWrite(13, HIGH); //LEDPIN high 
      delay(100); 
      digitalWrite(13, LOW); 
      delay(100); 
     } 
     } 
    else if (digitalRead(Rows[RowIndex]) == LOW) //Rows at index o is LOW 
    { 
     digitalWrite(13,LOW); 
    } 
    } 
} 

C++のArduino IDE 列はそれだけで設定されている列を返すべき場所、それが押された時間に基づいて0-3からのランダムな値を返している押されて、正しい列番号を返していません行がハイになるとハイになります。 void loop()の最初のforループに問題があることをかなり確実に修正する方法がわかりません。キーボードマトリクスコードは、ボタンが

答えて

0

インデックスがシリアルモニタに表示され、それが動作しているかどうかを確認するのが最も良いと思います。以下のコードを試してみてください。

int totalCols = 4; 
int totalRows = 5; 

// exclude pins 0 and 1 since these are used for Serial communication 
int keyCols[] = { 2, 4, 5, 6  }; 
int keyRows[] = { 7, 8, 9, 10, 11 }; 

void setup() 
{ 
    Serial.begin(9600); // begin Serial Communication at 9600 baudrate 
    pinMode(13, OUTPUT); 
    for (int i = 0; i < totalCols; i++) 
     pinMode(keyCols[i], OUTPUT); 

    for (int i = 0; i < totalRows; i++) 
     pinMode(keyRows[i], INPUT); // you can use INPUT instead 
} 

void loop() { 
    for (int i = 0; i < totalCols; i++) { 
     digitalWrite(keyCols[i], HIGH); 
     ScanActiveRows(i); 
     digitalWrite(keyCols[i], LOW); 
    } 
} 

void ScanActiveRows(int col) { 
    delay(5); // wait for 5 milliseconds after setting column pin 
    for (int row = 0; row < totalRows; row++) { 
     if (digitalRead(keyRows[row]) == HIGH) { 

      // print column and row indices 
      Serial.print("Column : "); 
      Serial.println(col); 
      Serial.print("Row : "); 
      Serial.println(row); 

     } 
     else if (digitalRead(keyRows[row]) == LOW) { 
      digitalWrite(13,LOW); 
     } 
    } 
} 

上記のコードが正確な列と行を出力する場合は、点滅するfor-loopが問題です。私はこれが役立つことを願っていますこれは私の最初の答えです。 :)