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が点灯する。