2016年2月15日月曜日

Arduinoで4×4のキーパッドの読み取り 続き

Arduinoで4×4のキーパッドの読み取り」の続きで「押して離して」を判定するようにしてみた。

配線は前回と同じ。
押しっぱなしにしても連続入力されない。

//------------------------------------------------------
// KeyPad_Scan
//
// D2..D4 KeyPad Column Input (Pull Down)
// D5..D9 KeyPad Row Output
//
//------------------------------------------------------

static char keypadChar [] = {
  '1', '4', '7', '*',
  '2', '5', '8', '0',
  '3', '6', '9', '#',
  'A', 'B', 'C', 'D',  
};

int cnt;

void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  Serial.begin(9600);
  Serial.println("Key Scan Start..");
}

//------------------------------------------------------
// keyScan1(): 押されているキー
// return: キースキャンの結果 0..15
//         押されていない場合は -1
//------------------------------------------------------
int keyScan1() {
  int i, j;
  for (i = 0; i < 4; i++) {
    digitalWrite(i + 6, HIGH);
    for (j = 0; j < 4; j++) {
      if (digitalRead(j + 2) == HIGH) {
        digitalWrite(i + 6, LOW);
        return i * 4 + j;
      }
    }
    digitalWrite(i + 6, LOW);
  }
  return -1;
}

//------------------------------------------------------
// keyScan(): 押して離されたキー
// return: キースキャンの結果 0..15
//         変化がない場合は -1
//------------------------------------------------------
int keyScan() {
  static int keyBuff;
  int kv, kvv;
  
  //チャタリング防止
  kv = keyScan1();
  delay(1);
  kvv = keyScan1();
  
  if (kv == kvv) {
    if (kv != keyBuff) {
      keyBuff = kv;
      return kv;
    }
  }
  return -1;
}

void loop() {
  int v;
  v = keyScan();
  if (v != -1) {
    Serial.print(keypadChar[v]);
    // 20字で改行
    cnt++;
    if (cnt > 20) {
      cnt = 0;
      Serial.println("");
    }
  }
}