PICマイコン演習 サンプルプログラム(1)
I/O制御の基本
‐ 振動スイッチのON/OFFを調べ点灯するLEDを変える -
■ 目的(要求)と考え方
「振動スイッチのON/OFFを調べる」
→ スイッチの端子電圧をマイコンに入力(Input)し、その電圧(High or Lowレベル?)を判定する。
「スイッチがONならばLED1を点灯、OFFならばLED2を点灯」
→ LED1、LED2をそれぞれマイコン端子に接続する。それら端子に出力(Output)する信号電圧によってLEDの点灯を制御する。
* 下線部の「電圧を判定する」や「信号を出力する」手続きがプログラムで記述される。

入出力関係
ブレッドボードの部品配置例
■ 回路構成
振動スイッチをRA5(4ピン)に接続する。このRA5ピンは抵抗R1によってプルアップされており、スイッチがオープン(OFF)の時にHigh(1)、クローズ(ON)の時にはLow(0)の値を得る。また、LED1から4の発光ダイオードは、抵抗器を介してアノード側を電源3Vに、カソード側をマイコンに接続している。マイコンにおいて0(ゼロ)を出力した時、LEDの両端子間には電圧差が生じるため、LEDは点灯する。
*このサンプルでは、LED3及びLED4は不要です。
■ 処理の流れ
スイッチの状態(ON/OFF)を調べ[CHECK1の部分]、その結果を受けて処理が2つ[SELECT1, SELECT2]に分かれる。

■ サンプルプログラム LED03A.asm
;
; SAMPLE 01 - 振動スイッチのON/OFFに応じて2つのLEDを点灯
;
;--- デバイスの選択,コンフィグレーションの設定 ---
LIST P=PIC16F648A
INCLUDE "P16F648A.INC"
__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _CP_OFF
;--- ユーザエリア ----------------
#DEFINE UA 30H
#DEFINE UB 31H
#DEFINE UC 32H
;--- リセット, 割り込みベクタ ---
ORG 0
GOTO MAIN
ORG 4
GOTO MAIN
;========= メインルーチン ==============
MAIN
BCF INTCON,7 ;割り込み不許可
BSF STATUS,RP0 ;バンク1に切り替え
MOVLW 20H ;20H = B'00100000'
MOVWF TRISA ;ポートAのデータ方向(入出力)設定
MOVLW 00H
MOVWF TRISB ;ポートBのデータ方向(入出力)設定
BSF PCON,OSCF ;内部発生クロック 4MHz選択
;--------------------------
MOVLW 080H ;オプションレジスタの設定
MOVWF OPTION_REG
BCF STATUS,RP0 ;バンク0に切り替え
NOP
CHECK1
BTFSC PORTA,5 ;ポートAの5ビット(PA5)を検査、0(クリア)なら次の命令をスキップ
GOTO SELECT2 ;SELECT2へジャンプ
SELECT1
MOVLW B'01111111' ;01111111をwレジスタに保存
MOVWF PORTB ;wレジスタの内容をポートBへ出力(LED1が点灯)
GOTO CHECK1 ;CHECK1へジャンプ
SELECT2
MOVLW B'10111111' ;10111111をwレジスタに保存
MOVWF PORTB ; (LED2が点灯)
GOTO CHECK1
end ;ソースファイルの終わりを宣言
![]()
1)MAINルーチンでは、ポートAとポートBに対してデータ方向(入出力)の設定が行われている。ここで「1」を指定したビットが入力用として扱われ、「0」の指定では出力用として扱われる。
2)振動スイッチの状態検出には、BTFSC(Bit Test F Skip Clear)命令が用いられている。ポートAの5ビット(RA5)がクリア(0)の場合には、次の命令(GOTO)がスキップされ、SELECT1へ進む。SELECT1ルーチンでは、最上位の7ビットが0となっており、ポートBの7ビット(RB7)に接続したLED1が点灯する。