テンキー接続編


LCDに文字を表示できて出力はOK。しかし、入力はAKI-H8マザーボードのタクトスイッチが4つとディップスイッチのみ。もうちょっとまともな入力インターフェースが欲しい。そう思っていたところ、日本橋でキーボード用のスイッチを見つけたので、テンキーを作ってみた。写真

0から9の数字キー・「決定」キー・「取消」キー・方向キーの合計16個のキーを用意した。それぞれのキーをI/Oポートにつなげれば入力はできるけど、たかが(?)キー入力のために16ピン分潰すのももったいないということでマトリクスにしてみた。

マザーボードのディップスイッチを取り去って、ポート2の8本をキーマトリクスに接続する。16本必要だったのが8本になった。複雑になった割には半分だね。

まず、ポート2の0〜3番ピンを出力。4〜7番ピンを入力にする。何故入力を下位にしなかったかというと、ダイオードを全部逆に付けてしまったからっていうのは内緒だ。さらに、入力ピンは内蔵のプルアップ抵抗をONにする。

で、「7」「8」「9」「↑」を読むときには0番ピンをLに、1〜3番ピンをHにする。この状態で4〜7番ピンを読む。押されていないキーに対応したピンはプルアップ抵抗によってLになる。押されたキーに対応したピンは、キー経由でLになる。他のキーは、0〜3番ピンを制御することによって読み込むことができる。

P0P1P2P3P4P5P6P7
0111
1011
1101
1110決定取消

キーごとについてあるダイオードは逆流防止用。キーを2つ押したときに出力同士が衝突するのを防ぐ。それ以外にも、キーを3つ以上押したときに起こる誤動作を防ぐ役目もある。


チャタリングについて。チャタリングとはキーを押したときと離したときに、ONとOFFを繰り返す現象。この現象は人間にとっては一瞬のことなので、間隔をあけて読むことによってたいてい防げる。
チャタリング以外にも、ノイズによってまれにデータが変わってしまうことがある。このノイズが2回読み込んで両方に現れるようなノイズでなければ、「読み込んだ結果が2回連続同じ状態ならばそれを採用する」ということでノイズの影響はなくなる。


これから実装。

読み込む周期はモジュールを呼び出す側で決めることにする。普通はタイマ割り込みを使って呼び出す。呼び出されると、キーの状態を読み、チャタリング・ノイズ処理を施した結果を変数に格納する。メインプログラムは、この変数を参照すればマトリクス・チャタリング・ノイズなど気にせずともキーの状態がわかるというわけ。

ノイズ対策は、4回一致で決定とする。キー一つ一つに何回連続しているか数えると時間がかかってしまうけど、ビット演算だけで済ませると簡単にできる。やり方はプログラムを参照。

こんな仕様で作るといきなりつまずいた。押してないはずのキーが反応してしまう。マトリクス制御の出力をした後、いきなり読み込んでいたので回路が間に合わなかったのが原因のようだ。そこで、キーのデータを読み込むと、次のスキャンをセットしてリターン。4回呼び出して16個のキーを調べ終わるようにした。

注意点として、4回呼び出して16個のキーを全て調べて、4回一致で決定するので、結果が反映されるまで(ノイズが入らなかったとして)16回呼び出さないといけない。例えば、「○○キーを押しながら電源を入れると○○モードに入る」ということをしたい場合は、キーが確定するまで待たないといけない。

あとは、サンプルを参照ということで。


今回のプログラム

KEY001.LZH 14203 bytes・・・ドキュメント

最新版は成果物のページ


今回は手抜きだった。
「PWMヲヤレ」との要望もあるので、次はモータ制御か?

続く


ご意見・ご感想は kumon@sam.hi-ho.ne.jp までどうぞ。

戻る