12F629 赤外線リモコンの受信、データコードをEEPROMに書き込み
回路図
http://akizukidenshi.com/download/PL-IRM2161-C438.pdf
受信データコードサンプル
MPLAB IDE v8.63
プログラム//////////////////////////
LIST
P=12F629
INCLUDE
P12F629.INC
CB
=
_CPD_OFF
CB
&=
_CP_OFF
CB
&=
_BODEN_ON
CB
&=
_MCLRE_OFF
CB
&=
_PWRTE_ON
CB
&=
_WDT_OFF
CB
&=
_INTRC_OSC_NOCLKOUT
;_HS_OSC
__CONFIG
CB
;-----------------------------------
TCON1
EQU
H'20'
;TIMER用
TCON2
EQU
H'21'
TCON3
EQU
H'21'
CCON1
EQU
H'22'
;カウント用
CCON2
EQU
H'23'
CCON3
EQU
H'24'
CCON4
EQU
H'25'
DD1
EQU
H'2A'
;データー用
DD2
EQU
H'2B'
DD3
EQU
H'2C'
DD4
EQU
H'2D'
DD5
EQU
H'2E'
DD6
EQU
H'2F'
TEMPL
EQU
H'30'
;臨時アドレス
TEMPDD
EQU
H'31'
;書き込みデータ
TEMPDATA
EQU
H'32'
;リモコンデータ
;------------------------------------
ORG
H'0'
GOTO
INIT
ORG
H'04'
GOTO
INIT
;------------------------------------
INIT
BSF
STATUS,RP0
MOVLW
B'00001100'
MOVWF
TRISIO
BCF
STATUS,RP0
MOVLW
B'00000111'
MOVWF
CMCON
MOVLW
B'00000000'
MOVWF
GPIO
;------------------------------------
MAIN
CLRF
DD1
CLRF
DD2
CLRF
DD3
CLRF
DD4
IR
;信号待ち
BTFSS
GPIO,2
GOTO
IR
GOTO
SS
;/////////////////////////////////////////
;リーダー部分の確認コート、ON8=9MS,OFF4=4.5MS
;/////////////////////////////////////////
SS
SIRON
;リーダーコード HIチェック
MOVLW
D'95'
;9MS=100μSX90 OR 95
MOVWF
CCON1
SIRONL
;
CALL
TIMER1
;
BTFSS
GPIO,2
;90回チェック
GOTO
IR
;一致しない場合、
DECFSZ
CCON1,F
;CCON1=0
GOTO
SIRONL
;
SIROFF
;リーダーコード LOWチェック
BTFSC
GPIO,2
GOTO
SIROFF
;OFF待ち
MOVLW
D'47'
;4.5MS=100μSX45 OR
MOVWF
CCON1
SIROFFL
CALL
TIMER1
BTFSC
GPIO,2
;47回チェック
GOTO
IR
;一致しない場合
DECFSZ
CCON1,F
GOTO
SIROFFL
;////////////////////////////////////////
;データコードの読み込み
;////////////////////////////////////////
RDD1
;
0ビットから8ビットまで
CLRF
TEMPDATA
;データクリア
CALL
REDATA
;データコード読み込み
MOVF
TEMPDATA,W
;
MOVWF
DD1
;読み込んだデータコードを保存
RDD2
;
9ビットから16ビットまで
CLRF
TEMPDATA
CALL
REDATA
MOVF
TEMPDATA,W
MOVWF
DD2
RDD3
;
16ビットから24ビットまで
CLRF
TEMPDATA
CALL
REDATA
MOVF
TEMPDATA,W
MOVWF
DD3
RDD4
;
25ビットから32ビットまで
CLRF
TEMPDATA
CALL
REDATA
MOVF
TEMPDATA,W
MOVWF
DD4
;
読み込み完了、EEPROMに書き込み
CALL
REWTOEEPROM
CALL
TEST
;//////////////////
GOTO
IR
;信号待ちへ
;//////////////////////////////////////
;データコード読み込みサブルーチン
;//////////////////////////////////////
REDATA
BTFSS
GPIO,2
;ON待ち
GOTO
REDATA
MOVLW
D'9'
;9設定、8回LOOP
MOVWF
CCON2
RED1
DECF
CCON2,F
;8回ビットのカウント
BTFSC
STATUS,Z
;0の場合
RETURN
;8個のカウント終了、次の8ビットへ
CALL
SASH
;600μS HIの後
RLF
TEMPDATA
;シフト
BCF
TEMPDATA,0
;0ビット、0に設定
CALL
TIMER7
;700μS LOW 経過
BTFSC
GPIO,2
;700μS LOW 経過しても LOW の場合スキップ
GOTO
RED1
;700μS LOW 経過しても HI の場合
BSF
TEMPDATA,0
;0ビット、1に設定
CALL
SASL
;残ったLOWをHIまで消耗する
GOTO
RED1
;次のビットへ
;RETURN
;//////////////////////////////////////////
;赤外線、HI時のチェックサブルーチン
;//////////////////////////////////////////
;HI
SASH
MOVLW
D'4'
;4回チェック 約400μS
MOVWF
CCON3
SASHL
CALL
TIMER1
BTFSS
GPIO,2
;4回チェック
GOTO
IR
;一致しない場合、信号待ちへ
DECFSZ
CCON3
GOTO
SASHL
SASOK
BTFSC
GPIO,2
;4回チェック後、残った HI を消耗する
GOTO
SASOK
RETURN
;戻る
;-----------------------------
;LOW
SASL
BTFSS
GPIO,2
;残った LOW を消耗する
GOTO
SASL
RETURN
;戻る
;///////////////////////////////////////////
;データEEPROMに書き込み
;///////////////////////////////////////////
REWTOEEPROM
;
DD1の書き込み
MOVLW
H'00'
;書き込みアドレス
MOVWF
TEMPL
;サブルーチンへ
MOVF
DD1,W
;書き込みデータ
MOVWF
TEMPDD
;サブルーチンへ
CALL
REW
;サブルーチン呼び出す
;
DD2の書き込み
MOVLW
H'01'
;書き込みアドレス
MOVWF
TEMPL
MOVF
DD2,W
MOVWF
TEMPDD
CALL
REW
;
DD3の書き込み
MOVLW
H'02'
;書き込みアドレス
MOVWF
TEMPL
MOVF
DD3,W
MOVWF
TEMPDD
CALL
REW
;
DD4の書き込み
MOVLW
H'03'
;書き込みアドレス
MOVWF
TEMPL
MOVF
DD4,W
MOVWF
TEMPDD
CALL
REW
;
書き込み完了、臨時ファイルをクリア
CLRF
TEMPL
CLRF
TEMPDD
RETURN
;///////////////////////////////////////////
;EEPROM 書き込みサブルーチン
;//////////////////////////////////////////
REW
BSF
STATUS,RP0
;1バンクへ
MOVF
TEMPL,W
;書き込みアドレス
MOVWF
EEADR
;
MOVF
TEMPDD,W
;書き込みデータ
MOVWF
EEDATA
;
BSF
EECON1,WREN
;書き込み許可
MOVLW
H'55'
;書き込み手順
MOVWF
EECON2
;
MOVLW
H'AA'
;
MOVWF
EECON2
;
BSF
EECON1,WR
;
RWC
BTFSC
EECON1,WR
;書き込み終了待ち
GOTO
RWC
BCF
STATUS,RP0
;0バンクに戻る
RETURN
;戻る
;//////////////////////////////////////////
;タイマー
;4Mhz
1クロック=0.00000025S = 0.25μS
;4Mhz
1サイクル=1μS
;//////////////////////////////////////////
TIMER1
;100μS,100コマンド、24
MOVLW
D'24'
;1;99
MOVWF
TCON1
;1
T1LOP
NOP
;1
DECFSZ
TCON1
;1
GOTO
T1LOP
;2
RETURN
;2
;--------------------
TIMER2
;200μS,200コマンド、49
MOVLW
D'49'
;1;
MOVWF
TCON1
;1
T2LOP
NOP
;1
DECFSZ
TCON1
;1
GOTO
T2LOP
;2
RETURN
;2
;--------------------
TIMER4
;400μS,400コマンド、99
MOVLW
D'99'
;1;99
MOVWF
TCON1
;1
T4LOP
NOP
;1
DECFSZ
TCON1
;1
GOTO
T4LOP
;2
RETURN
;2
;--------------------
TIMER6
;600μS,600コマンド、149
MOVLW
D'149'
;1;149
MOVWF
TCON1
;1
T6LOP
NOP
;1
DECFSZ
TCON1
;1
GOTO
T6LOP
;2
RETURN
;2
;--------------------
TIMER7
;700μS,700コマンド、174
MOVLW
D'174'
;1;174
MOVWF
TCON1
;1
T7LOP
NOP
;1
DECFSZ
TCON1
;1
GOTO
T7LOP
;2
RETURN
;2
;--------------------
TEST
;DEBUG用
;TEST
MOVLW
B'00010000'
MOVWF
GPIO
CALL
TIMER7
MOVLW
B'00000000'
MOVWF
GPIO
CALL
TIMER7
RETURN
;TEST
;------------------------------------
END
;終了
;------------------------------------
プログラム画像