マイコン・プログラミング・メモ
多数のスイッチでキー・マトリクス
ホームページに戻るトップページに戻る前ページに戻る次ページに進む最終ページに進む
キーボードのように多くのスイッチ(押しボタンスイッチ)をマイコンで扱う方法について、これまで製作したものを基に紹介します。
1.キー・マトリクスとは

キー・マトリクスは、スイッチ※1の数が多い場合、格子状配線の交点にスイッチを配置して、スキャンによってON/OFF状態を読み込む方法です。少ない入出力信号で、多くのスイッチを扱える利点があります。
下図に、キー・マトリクスによるスイッチ入力回路の例を示します。
これは、マイコンの出力ポートを4ビット、入力ポートを8ビット使用した、32個のスイッチを読み込む例です。
※1.この場合は押しボタンスイッチとします。
キーマトリクス回路例

2.キー・スキャン

ここでは、格子状配線に接続されたスイッチのうち、出力ポートに接続された側をそれぞれ「行」と呼び、入力ポートに接続された側をそれぞれ「列」と呼ぶことにします。
これらのスイッチのON/OFF状態を読み込むには、行出力に1ビットずつ順次Hを出力し、その時の列入力のH/Lをチェックするという方法で行います。これをキー・スキャンと言います。
前記の図でいうと、行出力であるPORT6でb0→b1→b2→b3→b0…の順にHを出力し、その都度列入力のPORT4を読み込みb7~b0ビットがHかLかチェックします。
つまり、行出力のb0がHのとき、読み込みの対象になるスイッチはSW1~SW8で、他のスイッチは関係ありません。同様に、b1がHのときはSW9~SW16、b2がHの時はSW17~SW24、b3がHのときはSW25~SW32が読み込み対象です。
このように、読み込みは行出力で指定した1行ごとなので、複数の行出力を同時にHにしてはいけません。

下図で、SW10がONしている場合を例にスキャンの流れを説明します。
①で1行目のみHにし、列入力を読み込みます。SW1~SW8は全てOFFなので、列入力b7~b0は全ビットL(プルダウン抵抗のため)となり、SW1~SW8はOFFとわかります。
②で2行目のみHにして、同様に列入力を読み込みます。SW10がONなので列入力データは0x02となり、SW9~SW16のうちSW10がONしているとわかります。
③で3行目のみHにして、同様に列入力を読むことでSW17~SW24はOFFとわかります。
④で4行目のみHにして、同様に列入力を読むことでSW25~SW32はOFFとわかります。
①~④の動作を1mS~10mS周期※2で繰り返します。

※2.スキャン全体の時間は行数によって変わります。定周期で1行あたり1mS~10mSになるようにすれば良いと思います。
キーONを検知する仕組み

このスキャンをタイムチャートにすると下図のようになります。
ここで注意するのは、行出力を切り換えてすぐに列入力を読み込むのではなく、図のように行を切り換える直前に読み込むことです。それは、スイッチがONになっていたとしても、出力ポートの動作速度や配線の容量などの影響で、行出力を切り換えた直後では正しく反応しない場合があるからです。
キースキャンと読み込みタイミング

3.ダイオードの意味

出力ポートに入っているダイオードは、出力ポートを保護するためにあります。
もし桁出力が通常のCMOS出力(トーテムポール出力)で下図のようにダイオードがない場合、図のSW-aとSW-cのスイッチが同時に押されると、Hの出力ポートO2からLの出力ポートO1に短絡電流が流れるため、これらの出力ポートは壊れる可能性があります。
ダイオードがないときの動作
4.誤認識がある簡易回路

先に紹介した32個のスイッチがある回路は、行出力用の出力ポートに1個ずつダイオードが入っています。これは、ダイオードの数を節約した簡易回路です。
そのため、ある条件で複数のスイッチを押すと、押していないスイッチをONとみなしてしまう誤認識が発生します。

下図の例で、SW-a,SW-b,SW-dの3個のスイッチを同時にONすると、押していないSW-cも押していると認識されてしまいます。
しかし、3個以上のスイッチを同時に押すということは、故意に押さない限り通常はないと考えられるので、この簡易回路は良く使われます。
ダイオードがあるときの誤認識説明図
このような誤認識を防ぐには、下図のように個々のスイッチに直列にダイオードを入れます。
誤認識のない回路
5.プログラム例

下記に、先に紹介した32個のスイッチがある回路を、マイコンRX62N/RX621で読み込む場合のプログラム例を示します。
RX62N/RX621用といってもマイコン固有の部分は少ないので、インターバルタイマによる定周期割り込みと、同様の入出力ポートがあれば、わずかな修正で他のマイコンでも利用できます。
ただし、このプログラム例には、定周期割り込み発生に関する部分やI/Oポートの初期化などは含まれていません。

キーマトリクス方式キー入力のプログラム例(ヘッダファイル)

キーマトリクス方式キー入力のプログラム例(ソースファイル)

注意:これらは例であり、必ずしも正常にコンパイルおよび正常に動作することを保証するものではありません。

このプログラム例でのチャタリングキャンセルは、スキャンにより複数回ON状態を検知することで行っています。またこのプログラム例では、複数のスイッチが押されていた場合、ONとなっているスイッチの中で最初に検知した1つを有効としています。
コメントを数多く入れているので、このプログラム例を使う、または参考にしたい人は、コメントを読んでみてください。

ホームページに戻るトップページに戻る前ページに戻る次ページに進む最終ページに進む
■■■ 注 意 ■■■
1.ここに掲載された内容(写真,図,表などを含む)の、全てまたは一部を無断で使用しないでください。
2.ここで紹介した手法(構造や仕組み,回路,プログラムなどを含む)を使用したことにより、問題や不利益が発生したとしても一切関知しません。
3.ここで紹介したプログラム例は、正常なコンパイルおよび正常な動作を保証するものではありません。