PIC16F84電子遊戯(51)
最終更新日:2001年11月30日
掛け算九九マシーン(1ページ)へ (2ページ)へ (3ページ) (4ページ)へ

掛け算九九マシーンのキースキャンのサブルーチン
掛け算九九マシーンのキースキャンはPIC16F84のポート数が少ないため、74HC138のデーコダICがお手伝いをいたします。トータル12キーのスキャンをこのICを使用することにより、3本の出力端子と2本の入力端子で可能になります。
単純にスキャンすれば4x3で7本の入出力端子が必要ですので2本得したことになります。
さて、実際のキースキャンですが、74HC138の出力を順番に駆動しながら、2本の入力ポートの状態を調べて押されているキーを検出します。
私のソフトでは次のようにひとまずキー番号を決めます。
74HC138出力 RB6入力 RB7入力
Y0 00h(SW1) 01h(SW7)
Y1 02h(SW2) 03h(SW8)
Y2 04h(SW3) 05h(SW9)
Y3 06h(SW4) 07h(SW10)
Y4 08h(SW5) 09h(SW11)
Y5 0Ah(SW6) 0Bh(SW12)

キー入力が無い

0Fh

例えばY0をL出力したときにRB6ポートがLであればキー番号を「00」とします。
詳細は別ページで公開するソースを見てもらえばわかると思いますが、キーはスキャン順を優先して1キーしか認識しません。従って例のようにキー番号が「00」と確定すると他のキーはスキャンしません。
サブルーチンからは、キー番号をWレジスタに入れて戻ってきます。
掛け算九九マシーンのキー決定処理
今回の掛け算九九マシーンには本格的(?)なキー決定処理を導入しています。
キーを入力するときにチャタリングが発生しないようにしています。
まずキー処理に関するRAMを定義しましょう。
key_data1 key_data2
1回目のキー番号 2回目のキー番号
単純に処理したキー番号は入力した数字と一致しないので、一度変換します。
その変換済みキー番号を入れるRAMも定義します。
key_no key_buff
変換済みキー番号 前回の変換済みキー番号
キー決定処理の概要を示します。
1回目のキースキャン(番号をkey_data1に入れる)
2回目のキースキャン(番号をkey_data2に入れる)
1回目の番号と2回目の番号が同じか調べる
同じ番号のときはチャタリング無しと判断する(それ以外は無効キー処理へ)
キー入力が無い時は無効キー処理へ
有効キーのときキー番号変換を変換する(変換済み番号をkey_noに入れる)
前回の変換済みキー番号と同じ番号であればキーEND処理へ
新しく押されたキーとみなし、各処理を行う
数字を表示データに変換する
キーEND処理 key_noのデータをkey_buffに入れる
無効キー処理 key_noとkey_buffをキー無しとする
キー処理終了
どうでしょうか、キー決定処理の流れはつかんでいただけましたか。
次に変換済みキー番号が入力した数字とどう対応するかの表も付けます。
入力キー 変換済みキー番号
[0] 00h
[1] 01h
[2] 02h
[3] 03h
[4] 04h
[5] 05h
[6] 06h
[7] 07h
[8] 08h
[9] 09h
[C]クリア 0Ch
[R]リターン 0Dh
掛け算九九マシーンのキー処理
各キーが新しく押された時の処理は、入力された数字の位置を示すポインタ input_p の値によって変化します。その概要を示します。
input_p [0]から[9]の処理 [C]クリアの処理 [R]リターンの処理
0 数字表示(input_p=1) 初期に戻る(input_p=0) 処理無し
1 数字表示(input_p=3) 初期に戻る(input_p=0) 処理無し
2 --- --- ---
3 数字表示(input_p=4) 初期に戻る(input_p=0) 処理無し
4 左シフト後数字表示(input_p=4) 初期に戻る(input_p=0) 答え判定
一応、答えを入れ間違えても直せるようにしてあります。(答えは左シフトしながら何文字でも入れられます)
式を間違えたときは[C]クリアキーで戻って下さい。
掛け算九九マシーンの答え判定
掛け算九九マシーンの答えの判定には難しい計算は一切しておりません。
正しいかどうかは予め入れてあるデータと比較しているだけです。
幸い、九九に限定すると式は1バイトのデータで表すことが可能です。。
そうです、掛けられる数字と掛ける数字を1バイトの上位4ビットと下位4ビットに圧縮するのです。
(例)2x3 => 23h
式を全て1バイトに圧縮し、そのデータに合致するところに答えのデータを入れておきます。
(例)23h => 06h
この答えと合っていれは正解!! 違っていれば不正解!! となります。
次が、ここで使うRAMです。
suji_m kekka
圧縮したデータ テーブルより求めた正解データ
ということで、今回はここまでとしましょう。次回はいよいよ完成です。
これからも益々面白くなる「PIC16F84電子遊戯」をよろしくお願いいたします。

不明点などあればメールお願いいたします。nonchansoft@nifty.com

Copyright(c)2000-2001 nonchansoft