LIST P=PIC16F84A
INCLUDE P16F84A.INC
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF     <−−− ここまでおまじない

;------------タイマーループ用固定変数----------------
GPR1 EQU 0Ch          ;GPRの1バイト目:0.4msを生成する回数を代入する
GPR2 EQU 0Dh          ;GPRの2バイト目:100msを生成回数を代入する
GPR3 EQU 0Eh          ;GPRの3バイト目:500msを生成回数を代入する

ORG 0             ;擬似命令:開始番地を0にする       <−−− プログラム開始位置設定
MAIN
    ;-------ポートBを出力にする---------
  BSF STATUS,RP0       ;1:バンク1に切り替える=STATUSのRP0を1
  CLRF TRISB         ;2:ポートBを全て出力にする=TRISBを全て0
  BCF STATUS,RP0       ;3:バンク0に戻る=TATUSのRP0を0
LOOP1
    ;-------処理開始----------------
  MOVLW 80h         ;Wという固定変数に10000000を代入:2桁しか記述出来ないのでRB7は16進で       <−−− ONにする
  MOVWF PORTB        ; W変数の値をPORTBに代入する=RB7を1にする
  CALL Timer        ;タイマー呼び出し

  MOVLW 1h         ;Wという固定変数に00000001を代入                           <−−− OFFにする
  MOVWF PORTB        ; W変数の値をPORTBに代入する=RB0〜RB7を0にする
  CALL Timer        ;タイマー呼び出し

  GOTO LOOP1

;--------------0.5sタイマールーチンセット(固定)-------------------------
    ;----------100ms*5=0.5sを作る------------
    Timer
    MOVLW 5h             ;W=5
    MOVWF GPR3            ;Wの内容をデータ領域3バイト目に書き込む
    imeLoop    NOP            ;何もしない
    CALL Timer2            ;999*249*5+Timer2&3のサイクルで500.005msになるそうだ
    DECFSZ GPR3,1        ;W=W-1
    GOTO TimeLoop
    RETURN                ;もしW=0になら戻る

    ;----------400us*250サイクル=100msを作る------------    
    Timer2
    MOVLW 0F9h             ;W=249
    MOVWF GPR2            ;Wの内容をデータ領域2バイト目に書き込む
    imeLoop2    NOP            ;何もしない
    CALL Timer1            ;999サイクルを249回呼ぶ
    DECFSZ GPR2,1        ;W=W-1
    GOTO TimeLoop2
    RETURN                ;もしW=0になら戻る

    ;----------0.4um*999サイクル=400usを作る------------    
    Timer1    
    MOVLW 0F9h             ;W=249
    MOVWF GPR1            ;Wの内容をデータ領域1バイト目に書き込む
    imeLoop1    NOP            ;何もしない
    DECFSZ GPR1,1        ;W=W-1
    GOTO TimeLoop1
    RETURN                ;もしW=0になら戻る
;---------------------------------------    
END