まず,どのスイッチが押されているかを認識するフローチャートだが,同僚が最初に書いてくれた部分でおおよそいけそうだ。P74をHighにセットした状態で,P70をチェック。分岐命令を使ってP70から出力があれば音を出すプログラムに移行するし,なければ今度はP71をチェックしにいく。さらになければP72。そしてどの出力もHighにならないのなら,入力側を変更しP74をLowにして代わりにP75をHighにセット。そして出力をチェック。これをP77まで繰り返してどのスイッチが押されているかをチェックする。どのスイッチも押されていないのなら,スイッチが押されるまでこのループを繰り返す(図5)。

図5
図5 押されたスイッチが分かるとすぐに音を出すフローチャート

 こう簡単に考えたが,この流れではどこか一つのスイッチが押されたことを認識するとすぐに音を出しにいく。このため,間違って二つ以上のスイッチが押されていても,エラーとは認識しない。これでは同僚の上げたハードルを満たしていないというわけだ。必要なことは,途中でスイッチが押されていようが,その後のスイッチが押されているかどうかをチェックしなくてはいけないということ。

 ただし,すべてのスイッチが押されていることを必ずしも調べる必要はない。スイッチが二つ押されているなら,それはエラーだ。そこで,スイッチが押されていることを認識したら,レジスタの値を+1する処理を追加。さらにその後で,レジスタの値が2以上になっていないかをチェックする。ここも分岐命令を使って,2以上になればプログラムの最初に戻るようにし,1なら続いてほかのスイッチが押されているかをどんどんチェックする。これを12個のスイッチに対して処理を続けていくことで,どのスイッチが押されたかを認識する部分は完了することになる(図6)。

図6
図6 押されたスイッチをすべてチェックするフローチャート

どのスイッチが押されたか分かるように

 と考えたのだが,スイッチが押されたことを認識してからすぐに音を出しにいくわけではないので,どれか一つだけスイッチが押されていることが保障できても,どのスイッチが押されているかが最後までチェックすると分からなくなってしまった。どのスイッチが押されたかが分かるように,どこかにフラグを残すようにしなくてはいけない。

 今回利用するマイコン「μPD78F0547D」のメモリマップを調べてみると,高速のデータ転送ができるショート・ダイレクト・アドレッシングが256バイト分用意されている。この領域をフラグを立てる部分として利用すれば,うまくいくに違いない(図7)。

図
図7 どのスイッチが押されたかが認識できるフローチャート

 ここまででおそらくどのボタンが押されているかを認識する部分のフローチャートは,うまく書けたはずだ。(次のページへ