07

01

4ビットマイコンプログラミング演習 回答1

2010.07.01(23:03)

【問題1】数字LEDに、0から9まで1秒おきに表示し、繰り返す。

アドレスマシン語ソースコード 解説
00A99->YY = 9
02800 -> AA = 0
041A->OPAを数字LEDへ
053A <-> YAとYを入れ替える
06ECCAL TIMR(A+1)*0.1秒待つ
083A <-> YAとYを入れ替える
0991A + 1 -> AA += 1
0BCAA != A ?Aと10を比較
0DF04JUMP 04一致していなければ04へジャンプ
10F02JUMP 0202へジャンプ


【問題2】数字LEDに、9から0まで1秒おきに表示し、繰り返す。
アドレスマシン語ソースコード解説
00A99->YY = 9
02800 -> AA = 0
041A->OPAを数字LEDへ
053A <-> YAとYを入れ替える
06ECCAL TIMR(A+1)*0.1秒待つ
083A <-> YAとYを入れ替える
099FA + F -> AA += 15
0CF04JUMP 04桁あがりがあれば04へジャンプ
0FF02JUMP 0202へジャンプ

問題2は、問題1よりも1ステップ短くできる。

【問題3】数字LEDに、0からFまで1秒おきに表示し、繰り返す。
アドレスマシン語ソースコード解説
00A99 -> YY = 9
02800 -> AA = 0
041A->OPAを数字LEDへ
0591A + 1 -> AA += 1
073A <-> YAとYを入れ替える
08ECCAL TIMR(A+1)*0.1秒待つ
0A3A <-> YAとYを入れ替える。フラグ=1
0BF04JUMP 04フラグが1なら04へジャンプ

問題3は、問題2よりもさらに短くできる。ジャンプ命令を1つに減らす。


【問題4】2進 LEDを、左からビット6,5,4,3,2,1,0 として、1秒おきに、ビット0から順番に、右から左へ1つずつ順番に点灯させ、一番左にいったら右へもどって、繰り返す。
アドレスマシン語ソースコード解説
00899 -> AA = 9
02A00 -> YY = 0
04E1CAL SETR2進LEDのビット番号Yを点灯
06ECCAL TIMR(A+1)*0.1秒待つ
08E2CAL RSTR2進LEDのビット番号Yを消灯
0AB1Y + 1 -> YY += 1
0CD7Y != 7 ?Y と 7 を比較
0EF04JUMP 04一致していたら04番地へジャンプ
11F02JUMP 0202番地へジャンプ

レジスタを入れ替えなくてもできる。

【問題5】キー入力があった回数を、数字LEDに表示する。最初に0を表示し、任意のキーが押されるのを待ち、押されるたびに1ずつカウントアップする。
アドレスマシン語ソースコード解説
008FF -> YY = 15
02B1Y + 1 -> YY += 1
043A <-> YA = Y
051A -> OpAの値を数字LEDに点灯
063A <-> YY = A
070K -> A数字キーをAへ
08F07JUMP 07キーが押されない間は7番地へ
0B0K -> A数字キーをAへ
0CF02JUMP 02キーが離されたら02番地へジャンプ
0FF0BJUMP 0B0B番地へジャンプ

キーが押されたことと離されたことの両方を確認する。

【問題6】2進LEDを、左からビット 6,5,4,3,2,1,0 として、押されたキーの番号のビットを点灯させる。たとえば、3のキーが押されたら、ビット3 を点灯させ、ほかは消灯させる。次のキーが押されるまでは、その表示を継続する。
アドレスマシン語ソースコード解説
000K -> A数字キーをAへ
01F00JUMP 00キーが押されない間は0番地へ
04E2CAL RSTR2進LEDのビット番号Yを消灯
063A <-> YY = A
07E1CAL SETR2進LEDのビット番号Yを点灯
09F00JUMP 0000番地へジャンプ

2進LEDは消さないとつきっぱなしになる。

【問題7】2進LEDを、左からビット 6,5,4,3,2,1,0 として、押されたキーの値を2進数表示で、各ビットを点灯させる。たとえば、6のキーが押されたら、ビット 2と1 を点灯させ、ほかは消灯させる。次のキーが押されるまでは、その表示を継続する。
アドレスマシン語ソースコード解説
00800 -> AA = 0
02AFF -> YY = F
044A -> M(50+Y)番地にAを代入
05AEE -> YY = E
070K -> A数字キーをAへ
08F07JUMP 07キーが押されない間は07番地へ
0B4A -> M(50+Y)番地にAを代入
0CEDCAL DSPRデータメモリの値を2進LEDに点灯する
0EF07JUMP 0707番地へジャンプ

ビットシフトするよりも短く書ける。

コメントの投稿

非公開コメント

プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示