例題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が順番に点灯するプログラムを作りましょう. ヒント: これを繰り返すことによって,「ナイトライダー」ができます。試してみますか? |