例題3.3 音を出力 -> 待機 -> 消音
音が出力されその後1秒たつと消音するプログラムを書いてみましょう. ここでは,初めてサブルーチンが出てきます.サブルーチンへのジャンプの仕方,戻り方を学習します.ちなみに,22,25,26行でfor文と同じ作業をしています. |
;******************************************** ;* 時間制御BEEP音発生プログラム * ;******************************************** ; ;------CPUの指定------- .CPU 300HA ; ;----シンボルの定義------ ;今回はポートBのみを使います. ;ポートBを出力に設定しています. ;ポートBのデータディレクションレジスタに書き込んでいます. MOV.B #H'FF,R0L ;ポートBを出力に設定するため MOV.B R0L,@H'FFFFD4 ;ポートBDDRにH'FFを書き込む ;このプログラムの流れは, ;1:R0Lに00000001を書き込む ;2:回数を設定する ;3:R0Lの中身をポートBに出力する ;4:待機する ;5:R0Lの1bit目を反転する ;6:残り回数を1回減らす ;7:残り回数が0でないならば3:へと飛ぶ(ループ) ;となります. ;待機する時間の長さにより音程が変わります. MOV.W #H'0100,R5 START: MOV.B R0L,@PBDR ;R0Lの内容をポートBに出力する JSR @TIME00 ;待機 BNOT #0,R0L ;R0Lのbit0を反転する (_____) #1,R5 ;残り回数から1引く BNE START ;残り回数がまだあればSTARTにジャンプする ;----タイマサブルーチン------ TIME00: MOV.W #H'1000,R6 ;タイマ TIME01: SUB.W #1,R6 ;R6にH'1000を書き込み1ずつ減算 BNE TIME01 ;0になるまで減算を繰り返す (___) ;元のルーチンに戻る
.END |
課題 3.3の説明
|
MOV.B #B'00000001,R0L ;R0Lに1を書き込む MOV.W #H'0100,R5 START: MOV.B R0L,@PBDR ;R0Lの内容をポートBに出力する JSR @TIME00 ;待機 BNOT #0,R0L ;R0Lの1bit目を反転する SUB.W #1,R5 ;残り回数から1引く BNE START ;残り回数がまだあればSTARTにジャンプする |
プログラムの上記の部分はfor文とよく似ています.for文は初期値から目標値まで繰り返すループです. 課題: できた人は音程を変えてみよう.また,鳴っている時間を変えてみよう. |