数値キーなどを作るのに,個別のタクトスイッチを並べるのはしんどい工作だなぁと思うのです。
以前からジャンクのキーマトリックスを1つ持ってはいたのですが,新規にシートスイッチのものが安価に手に入りました。
そこで,これを使ってUARTシリアル出力のキーパッドを作ってみようというわけです。
・今回の機材です。
1.キーマトリックス
・電話キータイプ
ワゴンセールで100円ぐらいの物,いつどこで買ったか(^^;;;;;;
・16キー・シートスイッチ
MITSUMI SBH-16BK1,大阪デジット限定品で1枚50円で10枚入り
2.MCU ATtiny1616
3. 液晶ディスプレイ (自作UART,I2C接続モジュール)

・各キーマトリックスのROWとCOLUMN端子の配置図です
それぞれ組み込みの都合があったのか,少しずつクセがあります。
説明書など全くないので,ほぼ端子とキーを総当たりで調べてみました(^^;;;;

・ATtiny1616のPin配置です
ROWを1Pinずつ出力してCOLUMNの入力をチェックします。
UARTとI2Cの担当Pinは残っているのでどちらでも使えますね(^^)。
なお,COLUMNは入力なので1KΩでPULL DOWNしています。

・動作チェックの結果です
押したキーをUART接続のLCDに表示するだけのシンプルすぎるプログラムですが,,(^^;;;。
・電話キータイプです

・16キー・シートスイッチです

・シートスイッチの端子の処理
一番困ったのがシートスイッチの接続端子が1mmピッチの配線だった事です。コネクタなどを探しても本体より高価になるのは目に見えています。
という事で手持ちのポリウレタン銅線(0.29mm )で,引っ張り出しました。両方にハンダを先に処理しておくと結構いけます。

以上,気になっていたジャンクがやっとキーパッドとして活用できそうです(^^)。
・上記のチェックプログラムを一応メモしておきます。
4x4のマトリックスであれば,これから応用は効くと思っているのですが,,。
以前からジャンクのキーマトリックスを1つ持ってはいたのですが,新規にシートスイッチのものが安価に手に入りました。
そこで,これを使ってUARTシリアル出力のキーパッドを作ってみようというわけです。
・今回の機材です。
1.キーマトリックス
・電話キータイプ
ワゴンセールで100円ぐらいの物,いつどこで買ったか(^^;;;;;;
・16キー・シートスイッチ
MITSUMI SBH-16BK1,大阪デジット限定品で1枚50円で10枚入り
2.MCU ATtiny1616
3. 液晶ディスプレイ (自作UART,I2C接続モジュール)

・各キーマトリックスのROWとCOLUMN端子の配置図です
それぞれ組み込みの都合があったのか,少しずつクセがあります。
説明書など全くないので,ほぼ端子とキーを総当たりで調べてみました(^^;;;;

・ATtiny1616のPin配置です
ROWを1Pinずつ出力してCOLUMNの入力をチェックします。
UARTとI2Cの担当Pinは残っているのでどちらでも使えますね(^^)。
なお,COLUMNは入力なので1KΩでPULL DOWNしています。

・動作チェックの結果です
押したキーをUART接続のLCDに表示するだけのシンプルすぎるプログラムですが,,(^^;;;。
・電話キータイプです

・16キー・シートスイッチです

・シートスイッチの端子の処理
一番困ったのがシートスイッチの接続端子が1mmピッチの配線だった事です。コネクタなどを探しても本体より高価になるのは目に見えています。
という事で手持ちのポリウレタン銅線(0.29mm )で,引っ張り出しました。両方にハンダを先に処理しておくと結構いけます。

以上,気になっていたジャンクがやっとキーパッドとして活用できそうです(^^)。
・上記のチェックプログラムを一応メモしておきます。
4x4のマトリックスであれば,これから応用は効くと思っているのですが,,。
/** ATtiny1616 keypad test_2 **/
// 4x4_keypad version
// ATtiny1616 pin arrangement
// Row_Pin (output): 0,1,2,3 (PA4-7)
// Column_Pin (input):10,11,12,13 (PC0-3)
// UART TxD_Pin: 7 (PB2, default), 9600bps
const byte Row_Max = 4;
const byte Row_Pin[] = {0 ,1 ,2, 3 };
const byte Column_Max = 4;
const byte Column_Pin[] = {10 ,11 ,12, 13 };
byte row_number;
byte column_number;
// Calculator Type character
const char* key_data[Row_Max][Column_Max] =
{{"A0","A1","A2","A3"},{"B0","B1","B2","B3"},
{"C0","C1","C2","C3"},{"D0","D1","D2","D3"}};
// Key Search
byte key_in(){
byte key_on = 0;
for (byte i = 0; i < Row_Max;i++){
for (byte j = 0; j < Row_Max; j++){ // clear all Row_bit
digitalWrite(Row_Pin[j], LOW);
}
digitalWrite(Row_Pin[i], HIGH); // Set Row bit
for (byte j = 0; j < Column_Max;j++){ // Read column bit
if (digitalRead(Column_Pin[j]) == HIGH){ // if key_on
key_on = 1; // set key_on
row_number=i; // row_number
column_number=j; // column_number
break;
}
}
}
return key_on;
}// key_in end
void setup() {
// Set Row_Pin as output
for(byte i = 0; i < Row_Max; i++){
pinMode(Row_Pin[i], OUTPUT);
}
// Start UART
Serial.begin(9600);
delay(1000);
// Init. self-made_LCD
Serial.write(0x80); Serial.write(0x01); // Clear Screen
delay(24);
Serial.write(0x00); Serial.write(0x00); // locate 0,0
Serial.print("Key:");
}// setup end
void loop() {
Serial.write(0x00); Serial.write(0x04); //locate 0,4
Serial.print(" ");
if (key_in()){
Serial.write(0x00); Serial.write(0x04); //locate 0,4
Serial.print(key_data[row_number][column_number]);
delay(100);
}
}// loop end