;******************************************************************************************
;  リモコン受信機サンプル
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.12.10
;   History      :
;******************************************************************************************
;   Description  
;    1.I/O Port
;      Port A
;         A0-A3  => Output 8-11
;         A4     => Recive
;      Port B
;         B0-B7  => Output 0-7 
;    2.Osc  20MHz  
;******************************************************************************************
;====================== 以下はPIC16F88用の記述 ======================
;   20MHz動作
	LIST	P=PIC16F88
	INCLUDE	"P16F88.inc"	
	__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC
	__CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF
;
IODAT	EQU	20H
LPRMTREV EQU	21H
LPRDR0	EQU	22H
LPTWL0	EQU	23H
LPTWL1	EQU	24H
LPRDRB0	EQU	25H
LPWAIT0	EQU	26H
LPWAIT1	EQU	27H
LPWAIT2	EQU	28H
LPWAIT3	EQU	29H
LPWAIT4	EQU	2AH
;
	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
	BANKSEL	PORTA	; PortAのBankを選択する(Bank0)
	CLRF	PORTA	; PortAの初期化
	CLRF	PORTB	; PortBの初期化
	BANKSEL	ANSEL	; ANSELのBankを選択する(Bank1)
	MOVLW	0x00	; 
	MOVWF	ANSEL	; Degital Inputに設定
	MOVLW	B'11110000'
	MOVWF	TRISA	; PortAのI/O設定
	MOVLW	B'00000000'
	MOVWF	TRISB	; PortBのI/O設定
	BANKSEL	PORTA	; PortAのBankを選択する(Bank0)
;=====================================================================
	CALL	INTPORT
	CALL	WAIT	; 赤外線受信モジュールが安定するのを待つ
MAIN
;  1.赤外線モジュールからデータがくるのを待つ
	CALL	RMTREV
;  2.データを送る
	CALL	OUTDAT
;
	GOTO	MAIN
;******************************************************************************************
;   Function Name : OUTDAT
;   Title         : ポートに出力する
;   Input         : W-REG
;   Output        : 
;   Description   : 
;******************************************************************************************
OUTDAT
; 1.初期化
	CALL	INTPORT
; 2.ポート出力
	MOVFW	IODAT
	XORLW	'0'
	BTFSC	STATUS,Z
	BSF	PORTB,0
;
	MOVFW	IODAT
	XORLW	'1'
	BTFSC	STATUS,Z
	BSF	PORTB,1
;
	MOVFW	IODAT
	XORLW	'2'
	BTFSC	STATUS,Z
	BSF	PORTB,2
;
	MOVFW	IODAT
	XORLW	'3'
	BTFSC	STATUS,Z
	BSF	PORTB,3
;
	MOVFW	IODAT
	XORLW	'4'
	BTFSC	STATUS,Z
	BSF	PORTB,4
;
	MOVFW	IODAT
	XORLW	'5'
	BTFSC	STATUS,Z
	BSF	PORTB,5
;
	MOVFW	IODAT
	XORLW	'6'
	BTFSC	STATUS,Z
	BSF	PORTB,6
;
	MOVFW	IODAT
	XORLW	'7'
	BTFSC	STATUS,Z
	BSF	PORTB,7
;
	MOVFW	IODAT
	XORLW	'8'
	BTFSC	STATUS,Z
	BSF	PORTA,0
;
	MOVFW	IODAT
	XORLW	'9'
	BTFSC	STATUS,Z
	BSF	PORTA,1
;
	MOVFW	IODAT
	XORLW	'A'
	BTFSC	STATUS,Z
	BSF	PORTA,2
;
	MOVFW	IODAT
	XORLW	'B'
	BTFSC	STATUS,Z
	BSF	PORTA,3
;
	RETURN
;******************************************************************************************
;   Function Name : RMTREV
;   Title         : 赤外線リモコン受信(8ビットデータ) 
;                   ※標準バースト波を使用 
;   Input         : 
;   Output        : IODAT
;   Description   : 
;******************************************************************************************
RMTREV
;  0.変数初期化
	CLRF	IODAT
;  1.リーダー部分
;  (1)開始の検知
	BTFSC	PORTA,4
	GOTO	$-1
;  (2)リーダーを飛ばす(13.5mS)
	CALL	WAITRDR
;  2.データ設定
	MOVLW	H'08'
	MOVWF	LPRMTREV
RMTREV2
;   (1)右シフト
	RRF	IODAT,F
;   (2)Wait 1/2TWL
	CALL	WAITTWL
;   (3)データ設定
	BTFSC	PORTA,4
	BCF	IODAT,7
	BTFSS	PORTA,4
	BSF	IODAT,7
;   (4)Wait 1/2TWL
	CALL	WAITTWL
;   (5)Loop-end
	DECFSZ	LPRMTREV,F
	GOTO	RMTREV2 
;   (6)ADD Shft
	RRF	IODAT,F
;   (7)Copy Data
	MOVFW	IODAT

	RETURN

;*******************************************************************************************
;   Function Name : WAITRDR
;   Title         : リーダー部分を読み飛ばす(13.5mSのWAIT;9mS+4.5mS) 
;   Input         : 
;   Output        :  
;   Description   : OSC:20/4MHz用 => 67,500ステップ(2400 * 45) 
;*******************************************************************************************
WAITRDR
	MOVLW	H'2D'	; 108,000 Step(45)
	MOVWF	LPRDR0
WAITRDR0
	CALL	WAITTWL
	DECFSZ	LPRDR0,F
	GOTO	WAITRDR0
	RETURN
;*******************************************************************************************
;   Function Name : WAITTWL
;   Title         : TWL(1/2)のWAIT(300μSのWAIT;600μS/2) 
;   Input         :  
;   Output        :  
;   Description   : OSC:20/4MHz用 => 1500ステップ
;*******************************************************************************************
WAITTWL
	MOVLW	H'0F'	; 1500 Step(30*100)
	MOVWF	LPTWL1
WAITTWL1
	MOVLW	H'20'	; 100 Step(32*3+2)
	MOVWF	LPTWL0
WAITTWL0
	DECFSZ	LPTWL0,F
	GOTO	$-1
	DECFSZ	LPTWL1,F
	GOTO	WAITTWL1
	RETURN

;******************************************************************************************
;   Function Name : WAIT
;   Title         : 約0.5秒のWAIT
;   Input         : 
;   Output        :
;   Description   : 20/4MHz(50)->100KHz(100)->1kHz(100)->10Hz(5)->2Hz 
;******************************************************************************************
WAIT
	MOVLW	H'05'	; Step(50*100*100*5)
	MOVWF	LPWAIT3
WAIT3
	MOVLW	H'64'	; Step(50*100*100)
	MOVWF	LPWAIT2
WAIT2
	MOVLW	H'64'	; Step(50*100)
	MOVWF	LPWAIT1
WAIT1
	MOVLW	H'18'	; Step(50:24*2+2)
	MOVWF	LPWAIT0
WAIT0
	DECFSZ	LPWAIT0,F
	GOTO	WAIT0
	DECFSZ	LPWAIT1,F
	GOTO	WAIT1
	DECFSZ	LPWAIT2,F
	GOTO	WAIT2
	DECFSZ	LPWAIT3,F
	GOTO	WAIT3
	RETURN

;******************************************************************************************
;   Function Name : INTPORT
;   Title         : 出力ポートの初期化
;   Input         : 
;   Output        :
;   Description   :
;******************************************************************************************
INTPORT
	CLRF	PORTB
	BCF	PORTA,0
	BCF	PORTA,1
	BCF	PORTA,2
	BCF	PORTA,3

	RETURN

	END
