Skip to content

Instantly share code, notes, and snippets.

@PJZ9n
Created June 7, 2019 19:10
Show Gist options
  • Save PJZ9n/137a9db1f0f2397543f4792455071e1c to your computer and use it in GitHub Desktop.
Save PJZ9n/137a9db1f0f2397543f4792455071e1c to your computer and use it in GitHub Desktop.
キーマトリクスの処理
/**
* キーマトリクスを使ってみる 2019.06.08
*
* 1□2□3□
* 4□5□6□
* 7□8□9□
*
* MEMO: プルアップとプルダウンは異なる
*/
/* ピン定数 */
const int COL_1 = 2;//1列目
const int COL_2 = 3;//2列目
const int COL_3 = 4;//3列目
const int ROW_1 = 8;//1行目
const int ROW_2 = 9;//2行目
const int ROW_3 = 10;//3行目
/* 状態変数 */
//HACK; 配列でも良いかも
bool button1State = false;
bool button2State = false;
bool button3State = false;
bool button4State = false;
bool button5State = false;
bool button6State = false;
bool button7State = false;
bool button8State = false;
bool button9State = false;
/* ユーザー定義関数 */
/*
* 列を変更
*/
void changeColumn(int column) {
switch (column) {
case 0:
digitalWrite(COL_1, LOW);
digitalWrite(COL_2, LOW);
digitalWrite(COL_3, LOW);
break;
case 1:
digitalWrite(COL_1, HIGH);
digitalWrite(COL_2, LOW);
digitalWrite(COL_3, LOW);
break;
case 2:
digitalWrite(COL_1, LOW);
digitalWrite(COL_2, HIGH);
digitalWrite(COL_3, LOW);
break;
case 3:
digitalWrite(COL_1, LOW);
digitalWrite(COL_2, LOW);
digitalWrite(COL_3, HIGH);
break;
default:
//ColumnNotFoundException
}
}
void phase1() {
changeColumn(1);
if (digitalRead(ROW_1)) {//1番のボタンがON
if (!button1State) {//すでにONなら無意味だから無視
button1State = true;
//TODO: 1が押されたときに一回だけ呼ばれるから処理書く
}
} else {//OFF
if (button1State) {//すでにOFFなら無意味だから無視
button1State = false;
//TODO: 1が離されたときに一回だけ呼ばれるから処理書く
}
}
if (digitalRead(ROW_2)) {//4番のボタンがON
if (!button4State) {//すでにONなら無意味だから無視
button4State = true;
//TODO: 4が押されたときに一回だけ呼ばれるから処理書く
}
} else {//OFF
if (button4State) {//すでにOFFなら無意味だから無視
button4State = false;
//TODO: 4が離されたときに一回だけ呼ばれるから処理書く
}
}
if (digitalRead(ROW_3)) {//7番のボタンがON
if (!button7State) {//すでにONなら無意味だから無視
button7State = true;
//TODO: 7が押されたときに一回だけ呼ばれるから処理書く
}
} else {//OFF
if (button7State) {//すでにOFFなら無意味だから無視
button7State = false;
//TODO: 7が離されたときに一回だけ呼ばれるから処理書く
}
}
}
void phase2() {
changeColumn(2);
if (digitalRead(ROW_1)) {//2番のボタンがON
if (!button2State) {//すでにONなら無意味だから無視
button2State = true;
//TODO: 2が押されたときに一回だけ呼ばれるから処理書く
}
} else {//OFF
if (button2State) {//すでにOFFなら無意味だから無視
button2State = false;
//TODO: 2が離されたときに一回だけ呼ばれるから処理書く
}
}
if (digitalRead(ROW_2)) {//5番のボタンがON
if (!button5State) {//すでにONなら無意味だから無視
button5State = true;
//TODO: 5が押されたときに一回だけ呼ばれるから処理書く
}
} else {//OFF
if (button5State) {//すでにOFFなら無意味だから無視
button5State = false;
//TODO: 5が離されたときに一回だけ呼ばれるから処理書く
}
}
if (digitalRead(ROW_3)) {//8番のボタンがON
if (!button8State) {//すでにONなら無意味だから無視
button8State = true;
//TODO: 8が押されたときに一回だけ呼ばれるから処理書く
}
} else {//OFF
if (button8State) {//すでにOFFなら無意味だから無視
button8State = false;
//TODO: 8が離されたときに一回だけ呼ばれるから処理書く
}
}
}
void phase3() {
changeColumn(3);
if (digitalRead(ROW_1)) {//3番のボタンがON
if (!button3State) {//すでにONなら無意味だから無視
button3State = true;
//TODO: 3が押されたときに一回だけ呼ばれるから処理書く
}
} else {//OFF
if (button3State) {//すでにOFFなら無意味だから無視
button3State = false;
//TODO: 3が離されたときに一回だけ呼ばれるから処理書く
}
}
if (digitalRead(ROW_2)) {//6番のボタンがON
if (!button6State) {//すでにONなら無意味だから無視
button6State = true;
//TODO: 6が押されたときに一回だけ呼ばれるから処理書く
}
} else {//OFF
if (button6State) {//すでにOFFなら無意味だから無視
button6State = false;
//TODO: 6が離されたときに一回だけ呼ばれるから処理書く
}
}
if (digitalRead(ROW_3)) {//9番のボタンがON
if (!button9State) {//すでにONなら無意味だから無視
button9State = true;
//TODO: 9が押されたときに一回だけ呼ばれるから処理書く
}
} else {//OFF
if (button9State) {//すでにOFFなら無意味だから無視
button9State = false;
//TODO: 9が離されたときに一回だけ呼ばれるから処理書く
}
}
}
/* メイン関数 */
void setup() {
//列は出力
pinMode(COL_1, OUTPUT);
pinMode(COL_2, OUTPUT);
pinMode(COL_3, OUTPUT);
//行は入力
pinMode(ROW_1, INPUT);
pinMode(ROW_2, INPUT);
pinMode(ROW_3, INPUT);
//なにも検出しない
changeColumn(0);
}
void loop() {
//REVIEW: 間に遅延必要かも
phase1();
phase2();
phase3();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment