たかがLチカされどLチカ、バイナリコードでLEDを点滅させるオリジナルCPUでバイナリコード入門(9)(2/3 ページ)

» 2023年10月12日 07時00分 公開
[今岡通博MONOist]

LEDの点灯時間と消灯時間を1対1にする

 次のLチカプログラムは、blink1.asmの課題であったLEDの点灯時間と消灯時間を1対1にするためのblink2.asm(リスト3)です。

ram[0] <=8'b1010_0001;  // mvi R0,1
ram[1] <=8'b1010_0001;  // mvi R0,1
ram[2] <=8'b1010_0000; 	// mvi R0,0
ram[3] <=8'b1001_0000;  // jmp 	0
リスト3 blink2.asmのコード

 先ほどのLチカプログラムではLEDの消灯時間がjmp 0の実行時間の分だけ長かったので、新たにmvi R0,1を挿入することで点灯時間を2クロック分にしてみました。このプログラムではmvi R0,1を追加したのですが、ramの1番地で実行する命令はこれ以外でも1クロック分の時間を消費する命令であれば他の命令でも構いません。ただし、レジスタR0に影響を与えない命令である必要があります。

 それでは実際にプログラムを動かしてみましょう。どうでしょう、点滅がずいぶんゆっくりになってしまいましたね。点灯時間と消灯時間が1対1になったのはいいのですが、ともに2クロック分の時間を費やすことになりました。まあ、このままでもいいのですが、できればLEDの点灯時間と消灯時間を1クロックにしてLチカらしく点滅してる雰囲気にしたいですよね。ということで、次のプログラムで検討してみましょう。

もっと小気味よいLチカを

 ここまでのLチカプログラムはレジスタR0の値を操作することによりドットマトリックスのLEDを点滅させています。今回は、プログラムカウンタのレジスタR7を使ってLEDを点滅させてみます。それがblink3.asm(リスト4)です。

ram[0] <=8'b1010_0000; 	// mvi R0,0
ram[1] <=8'b1001_0000;  // jmp 	0
リスト4 blink3.asmのコード

 プログラムカウンタは、命令を書かなくてもCPUが勝手にカウントアップしてくれるのでそれを利用します。そしてjmp 0でループさせることによりプログラムカウンタの値が0と1を繰り返します。ramの0番地に書いたコードはレジスタの値に影響を与えない命令であれば何でもいいです。1クロック分の時間を消費して、プログラムカウンタをカウントアップさせるだけの役割ですから。

 それでは実際に実行させてみましょう。

 図2がblink3.asmを実行させているところです。いかがでしょうか。最下段左端のLEDだけが点滅しており、1クロック分の時間で点灯と消灯が繰り返されているのもあって小気味よいLチカですね。

図2 図2 blink3.asmによるLEDドットマトリクスのLチカ[クリックで拡大]

Copyright © ITmedia, Inc. All Rights Reserved.