KeyPad(4×4)

概要

データを入力するとき、プッシュスイッチでは、1~2桁くらいなら特に不便を感じないのですが、3桁以上になると 使い勝手が悪くなります。

そこで登場するのが、KeyPad(キーパッド)です。KeyPadは、特定の用途に特化した小型のキーボードのこと で、今回は、4×4のキーマトリクスからなるものを使用し、そのキースキャンについて動作確認してみました。

動作原理

複数のキースイッチの状態を調べるためには、本来ならスイッチの数だけ入力ポートが必要となります。しかし、 キーボードのように大量のキーでは入力ポートが不足してしまいます。そこで、 このような時に使われる方法が、 キーマトリックススキャンです。

例えば、今回のように16キー必要な場合には、16の入力ポートが必要となりますが、マトリクスにすることで 半分の8ポート(4入力ポート、4出力ポート)で済みます。

キースキャンには、プルアップ方式とプルダウン方式があります。

<プルアップ方式> 4つの入力ポートをプルアップ“1“し、4つの出力ポートを順次“0”にしながら、キー押下“0“がされているかを サーチします。

<プルダウン方式> 4つの入力ポートをプルダウン“0”し、4つの出力ポートを順次“1“にしながら、キー押下“1”がされているかを サーチします。

尚、キーのチャタリング除去は、ソフトウエアで考慮しました。同一キーの押下が、100μSEC間隔で10回連続 した場合のみ押下されたものと見なします。

回路図

複数キー押下時を考慮すると保護ダイオードが必要となりますが、単一キーの押下のみとするのであれば不要 となります。

ソースコード

プルアップ方式のみ掲載します。少しの修正でプルダウン方式に変更することができます。

//********************************************************************** /* ＜ＫｅｙＰａｄ（４ｘ４）（プルアップ方式）＞ */ //********************************************************************** unsigned short keyPad_keySearch() { unsigned short kp; // kp = 0x00; // PORTA.F6 = 0; switch (PORTA & 0b00111100) { case 0b00111000: kp = 'D'; break; case 0b00110100: kp = 'C'; break; case 0b00101100: kp = 'B'; break; case 0b00011100: kp = 'A'; break; } PORTA.F6 = 1; // PORTA.F7 = 0; switch (PORTA & 0b00111100) { case 0b00111000: kp = '#'; break; case 0b00110100: kp = '9'; break; case 0b00101100: kp = '6'; break; case 0b00011100: kp = '3'; break; } PORTA.F7 = 1; // PORTA.F0 = 0; switch (PORTA & 0b00111100) { case 0b00111000: kp = '0'; break; case 0b00110100: kp = '8'; break; case 0b00101100: kp = '5'; break; case 0b00011100: kp = '2'; break; } PORTA.F0 = 1; // PORTA.F1 = 0; switch (PORTA & 0b00111100) { case 0b00111000: kp = '*'; break; case 0b00110100: kp = '7'; break; case 0b00101100: kp = '4'; break; case 0b00011100: kp = '1'; break; } PORTA.F1 = 1; // return (kp); } //********************************************************************** unsigned short keyPad_GetKey() { unsigned short newkp, oldkp, cnt; // oldkp = 0x00; // while (1) { for (cnt = 0; cnt < 10; cnt++) { newkp = keyPad_keySearch(); if (newkp != oldkp) cnt = 0; oldkp = newkp; Delay_us(100); } return (newkp); } } //********************************************************************** void main() { unsigned short kp, l_cnt, c_cnt; // OSCCON = 0b01110000; // クロックを8Mhzに設定する。 ANSEL = 0b00000000; // Ａ／Ｄ変換は使用しない。 TRISA = 0b00111100; // Lcd_Custom_Config(&PORTB, 7, 6, 5, 4, &PORTB, 3, 2, 1); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Cmd(LCD_CLEAR); // PORTA.F6 = 1; PORTA.F7 = 1; PORTA.F0 = 1; PORTA.F1 = 1; // l_cnt = 1; c_cnt = 1; // while (1) { kp = keyPad_GetKey(); if (kp == 0x00) continue; Lcd_Custom_Chr(l_cnt, c_cnt, kp); c_cnt++; if (c_cnt == 17) { c_cnt = 1; l_cnt++; if (l_cnt == 3) l_cnt = 1; } Delay_ms(500); } } //**********************************************************************

動作確認

以前に、DTMF(Dual-Tone Multi-Frequency)で使用した、KeyPad(キーパッド)が、手元にありましたので、これ を利用しました。

KeyPadで押下したキーに対応した文字をLCDへ順次表示させて見ました。

如何ですか? これでデータ設定が、し易くなりますね!{}!