2017-09-15 1 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); 
     } 
    } 
} 

위의 코드가 정확한 열과 행을 출력하면 blink for-loop가 문제가됩니다. 이게 도움이 되길 바란다. 이것은 나의 처음 대답이다. :)