例題2.5 BILNKER2
| LED1,3,5,7が点灯後1秒たつとLED1,3,5,7が消灯しLED2,4,6,8が点灯し,LED2,4,6,8が消灯します.この繰り返しをするプログラムを書きます.8連LEDはポートBに接続されています. |
; BLINKER2.SRC (c)yas@E-SYS Lab.
;******************************************
;* LED点滅プログラム(PORT B) *
;******************************************
;
;------CPUの指定-------
.CPU 300HA
;
;----シンボルの定義------
;今回は8連LEDを使用するので,
;ポート5ではなくポートBのみを使います.
;ポート5とポートBのアドレスが違うので注意してください.
PBDR .EQU H'FFFFD6 ;ポートBデータレジスタ
;
.SECTION ROM,CODE,LOCATE=H'000100 ;セクションの宣言
;
;-----I/Oの初期設定----
;ポートBを出力に設定しています.
;前回とは違い,ポートBのデータディレクションレジスタに書き込んでいます.
;
INIT: MOV.L #H'FFFF10,ER7 ;スタックポインタの設定
MOV.B #H'FF,R0L ;ポートBを出力に設定するため
MOV.B R0L,@H'FFFFD4 ;ポートBDDRにH'FFを書き込む
;
;----MAINルーチン-----
;このプログラムの流れは,
;1:R0Lに10101010を書き込む
;2:R0Lの中身をポートB(8連LED)に出力する
;3:1秒間待機する
;4:R0Lの中身を反転する
;5: 2:へと飛ぶ(ループ)
;となります.
;前回までとは異なり,LED8個分を一度に書き込んでいます.
;そして今回は反転命令を使うことによりR0Lを,
;10101010⇔01010101
;のように操作しています.
;
MOV.B #B'10101010,R0L ;R0Lに10101010を書き込む
START: MOV.B R0L,@PBDR ;R0Lの内容をポートBに出力する
JSR @TIME00 ;約1秒間待機
NOT.B (___) ;R0Lのbitを反転する
JMP @(_____) ;STARTにジャンプする
;
;----タイマサブルーチン------
TIME00: MOV.L #(________),ER6 ;約1秒間のタイマ
TIME01: SUB.L #1,ER6 ;ER6にH'280000を書き込み1ずつ減算
BNE TIME01 ;0になるまで減算を繰り返す
RTS ;元のルーチンに戻る
;
.END
|
|
課題 2.5の説明
|
今回新たに使ったニモニック
NOT | :デスティネーションオペランドの 1の補数をとり,結果をデスティネーションオペランドに格納します. |
Ex) NOT.B R0L ;R0レジスタの下位8bitのbitに対して,bitが0ならば1を,1ならば0をいれる |
課題 LEDが順番に点灯するプログラムを作りましょう. ヒント: これを繰り返すことによって,「ナイトライダー」ができます。試してみますか? |