====== 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回連続した場合のみ押下されたものと見なします。
===== 回路図 =====
複数キー押下時を考慮すると保護ダイオードが必要となりますが、単一キーの押下のみとするのであれば不要となります。
{{:imgpaste:202004:htmikan-20200430-075031.png}}
===== ソースコード =====
プルアップ方式のみ掲載します。少しの修正でプルダウン方式に変更することができます。
//**********************************************************************
/*
<KeyPad(4x4)(プルアップ方式)>
*/
//**********************************************************************
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; // A/D変換は使用しない。
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(キーパッド)が、手元にありましたので、これを利用しました。
{{:imgpaste:202004:htmikan-20200430-075200.png?500}}
{{:imgpaste:202004:htmikan-20200430-075213.png?500}}
{{:imgpaste:202004:htmikan-20200430-075226.png?500}}
KeyPadで押下したキーに対応した文字をLCDへ順次表示させて見ました。
{{:imgpaste:202004:htmikan-20200430-075236.png?500}}
如何ですか?
これでデータ設定が、し易くなりますね ^_^
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]