「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("");
}
}
}
0 件のコメント:
コメントを投稿