キーパッドは、さまざまな電子機器や組み込みプロジェクトで使用されている広く使用されている入力デバイスです。これらは、数字やアルファベットの形式で入力を受け取り、それをシステムにフィードしてさらに処理するために使用されます。このチュートリアルでは 、4x4マトリックスキーパッドをPIC16F877Aとインターフェイスさせます。
詳細ロジックに入り、キーパッドの使用方法を学ぶ前に、いくつかのことを知っておく必要があります。
4x4キーパッドが必要な理由:
通常、スイッチ入力のように、マイクロコントローラユニットの単一のI / Oピンを使用してデジタル信号を読み取ります。入力目的で9、12、16キーが必要ないくつかのアプリケーションでは、マイクロコントローラーポートに各キーを追加すると、16個のI / Oポートを使用することになります。この16個のI / Oポートは、I / O信号を読み取るためだけでなく、ADCサポート、I2C、SPI接続などの周辺接続としても使用できます。これらのI / Oピンでもサポートされます。これらのピンはスイッチ/キーに接続されているため、I / Oポートとしてのみ使用できます。これはまったく意味がありません。では、ピン数を減らす方法は?答えは、16進キーパッドまたはマトリックスキーパッドを使用することです。ピン数を減らすことができます、4x4マトリックスキーを関連付けます。8つのピンを使用し、そのうち4つは行に接続され、4つは列に接続されるため、マイクロコントローラーの8つのピンを節約できます。
4x4マトリックスキーパッドの仕組み:
上の画像では、マトリックスキーパッドモジュールが左側に示されています。右側には、内部接続とポート接続が表示されます。我々はポートが表示された場合は8本のピンがあり、最初の4左から右ですX1、X2、X3、およびX4がある行の左から右へ、そして最後の4あるY1、Y2、Y3、Y4は4つのある列。4行またはX側を出力として作成し、それらをロジックLowまたは0にし、4列を入力として作成してキーを読み取ると、対応するYが0になったときにスイッチが押されたことが読み取られます。
nが数値であるnxn行列でも同じことが起こります。それは3x3、6x6などにすることができます。
ここで、1が押されたと考えてください。次に、1はX1行とY1列に配置されます。X1が0の場合、Y1は0になります。同様に、列Y1、Y2、Y3、およびY4を検出することにより、X1行の各キーを検出できます。これはすべてのスイッチで発生し、マトリックス内のスイッチの位置を読み取ります。
それぞれの緑色の円はスイッチであり、両方とも同じ方法で接続されています。
このチュートリアルでは、キーボードを次の仕様に接続します-
- 内部プルアップを使用します
- キーデバウンスオプションを追加します
ただし、スイッチが押されていない場合は、Y1、Y2、Y3、Y4を高くするか1にする必要があります。そうしないと、スイッチが押されているときにロジックの変更を検出できません。しかし、これらのピンは出力ではなく入力として使用されているため、コードやプログラムでは作成できませんでした。そのため、マイクロコントローラの内部動作レジスタを使用して、これらのピンを弱いプルアップ有効モードとして動作させます。これを使用することにより、デフォルト状態のときにロジックハイイネーブルモードがあります。
また、キーを押すと、スイッチの接点でスパイクやノイズが発生し、このため、予期しない複数のスイッチの押下が発生します。したがって、最初にスイッチの押下を検出し、数ミリ秒待ってから、スイッチがまだ押されているかどうかを再度確認します。スイッチがまだ押されている場合は、最後にスイッチの押下を受け入れます。これは、スイッチのデバウンスと呼ばれます。
これをすべてコードに実装し、ブレッドボードで接続します。
また、4x4キーパッドを他のマイクロコントローラーと接続する方法も確認してください。
- ArduinoUnoとインターフェースするキーパッド
- 8051マイクロコントローラーとインターフェースする4x4マトリックスキーパッド
- ATmega32マイクロコントローラーとインターフェースする4x4キーパッド
- ブレッドボードのラズベリーパイデジタルコードロック
必要な材料:
- ブレッドボード
- Pic-kit 3とPCの開発環境、つまりMPLABX
- ワイヤーとコネクター
- キャラクターLCD16x2
- 20Mhzクリスタル
- 2個の33pFセラミックディスクキャップ。
- 4.7k抵抗
- 10kプリセット(可変抵抗器)
- 4x4マトリックスキーパッド
- 5Vアダプター
回路図:
関連するピンに水晶と抵抗を接続します。また、PORTD全体に4ビットモードでLCDを接続します。ポートRB4の両端に16進キーパッドまたはマトリックスキーパッドを接続しました。
PICを初めて使用する場合は、PICマイクロコントローラ入門:PICとMPLABXの概要から始めてください。
プログラミングの説明:
マトリックスキーパッドをPICマイクロコントローラーとインターフェースするための完全なコードは最後に記載されています。コードは簡単で自明です。キーパッドライブラリは、コードで理解される唯一のものです。ここでは、 keypad.h および lcd.h ライブラリを使用して、キーパッドと16x2LCDのインターフェイスを作成しました。では、その中で何が起こっているのか見てみましょう。
内部keypad.h我々が使用していることがわかりますxc.hデフォルトレジスタのライブラリであるヘッダを、水晶周波数はで使用される遅延の使用のために使用するために定義されてkepad.cファイル。PORTRBレジスタでキーパッドポートを定義し、個々のピンを行(X)と列(Y)として定義しました。
また、ポートを出力および入力としてリダイレクトするキーパッドの初期化と、呼び出されたときにスイッチの押下ステータスを返すスイッチの押下スキャンの2つの関数を使用しました。
#include
でkeypad.c我々は、以下の機能がキーパッドスキャナ機能が戻らないときのキーを押して返す「N」になることがわかります。
char switch_press_scan(void)//ユーザーからキーを取得 { char key = 'n'; //キーが押されて い ないと仮定しますwhile(key == 'n')//キーが押されるまで待ちますkey = keypad_scanner(); //キーを何度もスキャンし、キーを 返します。//キーが押されると、その値を返します }
以下はキーパッドの読み取り機能です。各ステップで、行X1、X2、X3、およびX4を0として作成し、Y1、Y2、Y3、およびY4のステータスを読み取ります。遅延はデバウンス効果に使用されます。スイッチがまだ押されている場合は、それに関連付けられた値を返します。スイッチが押されていない場合は、「n」を返します。
char keypad_scanner(void) { X_1 = 0; X_2 = 1; X_3 = 1; X_4 = 1; if(Y_1 == 0){__ delay_ms(100); while(Y_1 == 0); '1'を返します。 } if(Y_2 == 0){__ delay_ms(100); while(Y_2 == 0); '2'を返します。 } if(Y_3 == 0){__ delay_ms(100); while(Y_3 == 0); '3'を返します。 } if(Y_4 == 0){__ delay_ms(100); while(Y_4 == 0); 'A'を返します。 } X_1 = 1; X_2 = 0; X_3 = 1; X_4 = 1; if(Y_1 == 0){__ delay_ms(100); while(Y_1 == 0); '4'を返します。 } if(Y_2 == 0){__ delay_ms(100); while(Y_2 == 0); '5'を返します。 } if(Y_3 == 0){__ delay_ms(100); while(Y_3 == 0); '6'を返します。 } if(Y_4 == 0){__ delay_ms(100); while(Y_4 == 0); 'B'を返す; } X_1 = 1; X_2 = 1; X_3 = 0; X_4 = 1; if(Y_1 == 0){__ delay_ms(100); while(Y_1 == 0); '7'を返します。 } if(Y_2 == 0){__ delay_ms(100); while(Y_2 == 0); '8'を返します。 } if(Y_3 == 0){__ delay_ms(100); while(Y_3 == 0); '9'を返します。 } if(Y_4 == 0){__ delay_ms(100); while(Y_4 == 0); 'C'を返す; } X_1 = 1; X_2 = 1; X_3 = 1; X_4 = 0; if(Y_1 == 0){__ delay_ms(100); while(Y_1 == 0); '*'を返す; } if(Y_2 == 0){__ delay_ms(100); while(Y_2 == 0); '0'を返します。 } if(Y_3 == 0){__ delay_ms(100); while(Y_3 == 0); '#'を返す; } if(Y_4 == 0){__ delay_ms(100); while(Y_4 == 0); 'D'を返す; } return'n '; }
また、最後の4ビットに弱いプルアップを設定し、ポートの方向を最後の4入力、最初の4を出力として設定します。OPTION_REG&= 0x7Fの。最後のピンに弱いプルアップモードを設定するために使用されます。
void InitKeypad(void) { Keypad_PORT = 0x00; //キーパッドポートのピン値をゼロに設定します Keypad_PORT_Direction = 0xF0; //最後の4ピンが入力、最初の4ピンが出力 OPTION_REG&= 0x7F; }
ではメインPICプログラム(下記の)私たちは、最初のコンフィギュレーション・ビットを設定し、いくつかの必要なライブラリが含まれています。次に、 void system_init関数で、キーパッドとLCDを初期化します。そして最後に 、 メイン 関数で、 switch_press_scan() 関数を呼び出し、値をlcdに返すことでキーパッドを読み取りました。
ここからヘッダーファイルを含む完全なコードをダウンロードし、以下のデモンストレーションビデオを確認してください。