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