例題3.4 SWITCH2プログラム


スイッチ 1,2が押されると音が変わるプログラムを作成します.
;              BEEP3.SRC      (c)yas@E-SYS Lab.

;**************************************************
;*      BEEP音のスイッチによる制御プログラム   *
;**************************************************
;
;------CPUの指定-------
        .CPU    300HA
;
;----シンボルの定義------
;今回はポート4とポートBを使います.

P4DR    .EQU    H'FFFFC7       ;ポート4データレジスタ
PBDR    .EQU    H'FFFFD6       ;ポートBデータレジスタ
        .SECTION       ROM,CODE,LOCATE=H'000100       ;セクションの宣言

;-----I/Oの初期設定----
;ポート4を入力に設定しています.
;ポート4のデータディレクションレジスタに書き込んでいます.
;ポートBを出力に設定しています.
;ポートBのデータディレクションレジスタに書き込んでいます

INIT:   MOV.L   #H'FFFF10,ER7  ;スタックポインタの設定
        MOV.B   #H'00,R0L      ;ポート4を入力に設定するため
        MOV.B   R0L,@H'FFFFC5  ;コントロールレジスタにH'00を書き込む
        MOV.B   #H'FF,R0L      ;ポート4をプルアップに設定するため
        MOV.B   R0L,@H'FFFFDA  ;入力プルアップMOSコントロールレジスタにH'FFを書き込む
        MOV.B   #H'FF,R0L      ;ポートBを出力に設定するため
        MOV.B   R0L,@H'FFFFD4  ;ポートBDDRにH'FFを書き込む

;----MAINルーチン-----
;このプログラムの流れは,
;1:R0Lに00000001を書き込む
;2:R0Lの中身をポートBに出力する
;3:待機する
;4:R0Lの1bit目を反転する
;5: 2:へと飛ぶ(ループ)
;となります.
;待機する時間の長さにより音程が変わります.

        MOV.B   #B'00000001,R0L ;R0Lに1を書き込む
START:  MOV.B   R0L,@PBDR      ;R0Lの内容をポートBに出力する
        MOV.B   @P4DR,R0H      ;現在のSW-1,2,3,4の状態をR0Hに読み込む
        (____)  #4,R0H
        BNE     SW2
SW1:    JSR     @TIME00 ;待機
        JMP     (______)
SW2:    BTST    #5,R0H
        BNE     OTHER
        JSR     @TIME10
        JMP     @CKEND
OTHER:  JSR     @TIME20
CKEND:  (____)  #0,R0L         ;R0Lの1bit目を反転する
        JMP     @START         ;STARTにジャンプする
 


;----タイマサブルーチン------
TIME00: MOV.W   #H'1000,R6     ;タイマ
TIME01: SUB.W   #1,R6          ;R6にH'1000を書き込み1ずつ減算
        BNE     TIME01         ;0になるまで減算を繰り返す
        RTS                    ;元のルーチンに戻る
TIME10: MOV.W   #H'2000,R6     ;タイマ
TIME11: SUB.W   #1,R6          ;R6にH'2000を書き込み1ずつ減算
        BNE     TIME11         ;0になるまで減算を繰り返す
        RTS                    ;元のルーチンに戻る
TIME20: MOV.W   #H'4000,R6     ;タイマ
TIME21: SUB.W   #1,R6          ;R6にH'4000を書き込み1ずつ減算
        BNE     TIME21         ;0になるまで減算を繰り返す
        RTS                    ;元のルーチンに戻る

        .END       

課題 3.4の説明

  • 7行目:CPUの指定をしています.
  • 10〜11行目:シンボルの定義をしています.ポート4データレジスタをP4DR,ポートBデータレジスタ PBDRと表しました.
  • 13行目:セクションの宣言をしています.
  • 16〜22行目:初期設定,スタックポインタの設定.ポート4,Bをそれぞれ入力,出力に設定しています.P4DDR,PBDDRに制御コードを書き込みます.付録からP4DDR,PBDDRの番地はそれぞれH'FFFFC5,H'FFFFD4であることが分かりますから,その番地に,入力ビットに設定するなら0を,出力ビットに設定したいなら1を書き込みます.また同時に,ポート4の入力ピンを内蔵のMOS-FETでプルアップ(プルアップ抵抗と同じ働き)するため,P4PCR(入力プルアップMOSコントロール)にはH'FF(全ビットプルアップ)を書き込みます.
  • 25〜38行目:次に,ポート4のbit4,接続しているSW-1,2の状態をR0Hに読み込みます.そして,SW-1の状態(bit4)をチェックしています.押されていれば,TIME00にジャンプし,CKENDにジャンプします.押されていなければSW2にジャンプし,SW-2の状態(bit5)をチェックしています.押されていれば,TIME10にジャンプし,CKENDにジャンプします.押されていなければOTHERにジャンプします.OTHERではTIME20にジャンプします.CKENDではPBDRの0bitを反転させて,STARTにジャンプします.
  • 41〜44行目:WAITのサブルーチンです.H'1000から値を1ずつ引いていき,ゼロになるまでこの作業を繰り返します.値がゼロになったらメインルーチンに戻ります.
  • 46〜49行目:WAITのサブルーチンです.H'2000から値を1ずつ引いていき,ゼロになるまでこの作業を繰り返します.値がゼロになったらメインルーチンに戻ります.
  • 51〜54行目:WAITのサブルーチンです.H'4000から値を1ずつ引いていき,ゼロになるまでこの作業を繰り返します.値がゼロになったらメインルーチンに戻ります.

課題:スイッチの数を増やしてみよう.スイッチ 3,4はそれぞれポート4のbit6とbit7に接続されています.
hint
スイッチ1,2はそれぞれポート4のbit4とbit5に接続されています.そのため,28行でのスイッチ1についてのチェックで#4を指定しています.また,32行でスイッチ2についてのチェック#5を指定しています.

課題:スイッチ同時押しでも音を変えてみよう.



[山口研究室] <back | index | next >