20180629_04 条件分岐の実現 制御命令とビットテスト命令とを組み合わせて使用する。 ビットテスト命令 BTFSC命令、BTFSS命令 (例) BTFSS 30H,4 ファイルレジスタ30H番地の(0から数えて)4ビット目が1であったら(setされていたら)、 つぎの命令(つぎのプログラムメモリアドレスに置かれた命令)を、ひとつ飛ばし(skip)する。 (別の例) BTFSS STATUS,C ステータスレジスタ(専用レジスタのひとつ、05H番地)のCビット(bit0)が1であったら、 つぎの命令(つぎのプログラムメモリアドレスに置かれた命令)を、ひとつ飛ばし(skip)する。 Cビットは、直前の命令の実行結果で桁あふれ等があったときに(1に)セットされる。Cフラグともいう。 加算の場合には、桁上がり・桁あふれ(carry)、減算の場合には、桁下がり・桁借り(bollow)。  (注意)STATUSやCは、別のファイル(P16F877.INC等)で定義されている定数の名前である。 プログラムの先頭で、INCLUDE擬似命令を用いて、このファイルの内容を取り込むようにする。 INCLUDE P16F877.INC (プログラム例) INCLUDE P16F877.INC INPUT: EQU 20H OUTPUT: EQU 21H ORG 0 MOVLW 0AH ; W <- 10 SUBWF INPUT,W ; W <- INPUT - W ( W <- INPUT-10 ) BTFSS STATUS,C ; STATUSのCフラグが1ならば(INPUT<10ならば)、つぎの命令をスキップする。 GOTO BIG ; (STATUSのCフラグが0、つまりCOUNT>=10ならば、)BIGへ飛ぶ(分岐する。) SMALL: ; ここにはラベルは不要だが、プログラムの内容が分かりやすくなるように置いた。 MOVLW 0 ; INPUT<10の場合、 【注意】コメントは、1行毎ばかりではなく、 MOVWF OUTPUT ; OUTPUT <- 0    このように、複数行に渡って記述することも多い。 GOTO STOP ; STOPへ飛ぶ(合流する)。 BIG: ; COUNT>=10の場合、ここへ制御が移る(飛ぶ)。 MOVLW 0FFH MOVWF OUTPUT ; OUTPUT <- 0FFH STOP: ; プログラムの実行の終了(分岐した後で、ここへ合流する)。 GOTO $ ; $は、この命令が置かれたアドレス、つまり自分自身へ飛ぶ(無限ループ)。 END ; このプログラムは、 ; 変数INPUTの値が10以上であったら(INCF命令を使用)、 ; 変数OUTPUTへ0FFHを格納し、 ; そうでなかったら(10未満であったら)、 ; 変数OUTPUTへ0を格納する。 ; 条件分岐については、 ; INPUTの値が10以上であるかどうかを、 ; 減算命令(SUBWF)とビットテスト命令(BTSS)とで判定して、 ; それぞれの処理へ分岐している。 ; なお、飛び先のラベルについては、ラベルだけの行にしておくことがお勧め(後々の編集時に便利)。 ; 最後は、自分自身へ飛ぶ無限ループにして、プログラムの実行終了の代わりにしている。 (参考) skip命令(BTFSC命令、BTFSS命令、DECFSZ命令、INCFSZ命令)は、 条件によって、つぎに置かれた命令をひとつ飛ばし(skip)する制御命令の一種である。