;******************************************************************************************
;  リモコン送信機サンプル
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.12.10
;   History      :
;******************************************************************************************
;   Description  
;    1.I/O Port
;      Port A
;         A0-A1  => Push Switch 8-9
;         A2     => LED
;         A3-A4  => Push Switch 10-11  
;      Port B
;         B0-B7  => Push Switch 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
LPRMTSND  EQU	21H
LPTWLPLS  EQU	22H
LPTWLWAT1 EQU	23H
LPTWLWAT0 EQU	24H
LPRDRPLS  EQU	25H
LPWATCRY  EQU	26H
LPRDRWAT1 EQU	27H
LPRDRWAT0 EQU	28H
LPWAITSW0 EQU	29H
LPWAITSW1 EQU	2AH
LPWAITSW2 EQU	2BH
LPWAITSW3 EQU	2CH

	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'1111011'
	MOVWF	TRISA	; PortAのI/O設定
	MOVLW	B'1111111'
	MOVWF	TRISB	; PortAのI/O設定
	BANKSEL	PORTA	; PortAのBankを選択する(Bank0)
;=====================================================================
;  0.初期化
	BCF	PORTA,2
MAIN
;  1.基板スイッチからの入力を待つ
	CALL	SEACHSW
;  2.赤外線で出力
	CALL	RMTSND
;  3.WAIT処理(チャッターリング防止)
	CALL	WAITSW
;
	GOTO	MAIN

;******************************************************************************************
;   Function Name : SEACHSW
;   Title         : 基板スイッチからの入力を待つ
;   Input         : 
;   Output        : W-REG
;******************************************************************************************
SEACHSW
	BTFSC	PORTB,0
	RETLW	'0'
	BTFSC	PORTB,1
	RETLW	'1'
	BTFSC	PORTB,2
	RETLW	'2'
	BTFSC	PORTB,3
	RETLW	'3'
	BTFSC	PORTB,4
	RETLW	'4'
	BTFSC	PORTB,5
	RETLW	'5'
	BTFSC	PORTB,6
	RETLW	'6'
	BTFSC	PORTB,7
	RETLW	'7'
	BTFSC	PORTA,0
	RETLW	'8'
	BTFSC	PORTA,1
	RETLW	'9'
	BTFSC	PORTA,3
	RETLW	'A'
	BTFSC	PORTA,4
	RETLW	'B'
	GOTO	SEACHSW

;******************************************************************************************
;   Function Name : RMTSND
;   Title         : 赤外線リモコン送信(8ビットデータ) 
;                   ※標準バースト波を使用 
;   Input         : W-REG
;   Output        :
;******************************************************************************************
RMTSND
; (0)変数設定
	BCF	PORTA,2
	MOVWF	IODAT	
; (1)送信開始
; 1.リーダー送信
;  (1)リーダー(パルス)
	CALL	RDRPLS
;  (2)リーダー(Wait)
	CALL	RDRWAT
; 2.データ送信
;  (1)ループ設定
	MOVLW	H'08'
	MOVWF	LPRMTSND
RMTSND1
;  (2)送信
	BTFSC	IODAT,0
	CALL	TWLPLS
	BTFSS	IODAT,0
	CALL	TWLWAT
;  (3)右シフト
	RRF	IODAT,F
	DECFSZ	LPRMTSND,F
	GOTO	RMTSND1
;
	BCF	PORTA,2
	RETURN

;******************************************************************************************
;   Function Name : TWLPLS
;   Title         : 赤外線送信Ｈパルス
;   Input         : 
;   Output        :
;   Description   : キャリア周波数;38KHz,600μS　(13.16μS*2 * 22.79回)
;******************************************************************************************
TWLPLS
; 1.ループ変数設定
	MOVLW	H'17'
	MOVWF	LPTWLPLS
; 2.パルス出力
TWLPLS1
; (1)'1'を出力
	BSF	PORTA,2
; (2)WAIT(13.16μS)
	CALL	WATCRY
; (3)'0'を出力
	BCF	PORTA,2
; (4)WAIT(13.16μS)
	CALL	WATCRY
; (5)LOOP
	DECFSZ	LPTWLPLS,F
	GOTO	TWLPLS1
	RETURN

;******************************************************************************************
;   Function Name : TWLWAT
;   Title         : 赤外線送信Ｌパルス
;   Input         : 
;   Output        :
;   Description   : 600μS ※OSC:20/4 MHz用 => 3000ステップ
;******************************************************************************************
TWLWAT
	MOVLW	H'1E'	; 3000 Step(30*100)
	MOVWF	LPTWLWAT1
TWLWAT1
	MOVLW	H'20'	; 100 Step(32*3+2)
	MOVWF	LPTWLWAT0
	NOP
	NOP
TWLWAT0
	DECFSZ	LPTWLWAT0,F
	GOTO	$-1
	DECFSZ	LPTWLWAT1,F
	GOTO	TWLWAT1
	RETURN

;******************************************************************************************
;   Function Name : RDRPLS
;   Title         : 赤外線リーダーパルスを出力
;   Input         : 
;   Output        :
;   Description   : キャリア周波数;38KHz,9mS(13.16μS*2 * 342回)
;******************************************************************************************
RDRPLS
; 1.リーダーパルスを出力(255回)
	MOVLW	H'FF'
	MOVWF	LPRDRPLS
RDRPLS1
; (1)'1'を出力
	BSF	PORTA,2
; (2)WAIT(13.16μS)
	CALL	WATCRY
; (3)'0'を出力
	BCF	PORTA,2
; (4)WAIT(13.16μS)
	CALL	WATCRY
; (5)ループ
	DECFSZ	LPRDRPLS,F
	GOTO	RDRPLS1
;
; 2.リーダーパルスを出力(87回)
	MOVLW	H'57'
	MOVWF	LPRDRPLS
RDRPLS2
; (1)'1'を出力
	BSF	PORTA,2
; (2)WAIT(13.16μS)
	CALL	WATCRY
; (3)'0'を出力
	BCF	PORTA,2
; (4)WAIT(13.16μS)
	CALL	WATCRY
; (5)ループ
	DECFSZ	LPRDRPLS,F
	GOTO	RDRPLS2
	RETURN

;******************************************************************************************
;   Function Name : WATCRY
;   Title         : 赤外線の搬送波(38kHz)のパルス間隔(13.15789μS)
;   Input         : 
;   Output        :
;   Description   : OSC:20/4 MHz用 => 66(62)ステップ
;******************************************************************************************
WATCRY
	MOVLW	H'14'	; 62 Step(20*3+2)
	MOVWF	LPWATCRY
	DECFSZ	LPWATCRY,F
	GOTO	$-1
	NOP
	RETURN

;******************************************************************************************
;   Function Name : RDRWAT
;   Title         : 赤外線リーダーの空白部分を作成(4.5mS)
;   Input         : 
;   Output        :
;   Description   : OSC:20/4MHz用 => 22500ステップ (225 * 100) 
;******************************************************************************************
RDRWAT
	MOVLW	H'64'	; 100 Step(64)
	MOVWF	LPRDRWAT1
RDRWAT1
	MOVLW	H'16'	; 225 Step(10*22+5)
	MOVWF	LPRDRWAT0
	NOP
	NOP
	NOP
RDRWAT0
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	LPRDRWAT0,F
	GOTO	RDRWAT0
	DECFSZ	LPRDRWAT1,F
	GOTO	RDRWAT1
	RETURN

;******************************************************************************************
;   Function Name : WAITSW
;   Title         : 約0.5秒のWAIT
;   Input         : 
;   Output        :
;   Description   : 20/4MHz(50)->100KHz(100)->1kHz(100)->10Hz(5)->2Hz 
;******************************************************************************************
WAITSW
	MOVLW	H'02'	; Step(50*100*100*5)
	MOVWF	LPWAITSW3
WAITSW3
	MOVLW	H'64'	; Step(50*100*100)
	MOVWF	LPWAITSW2
WAITSW2
	MOVLW	H'64'	; Step(50*100)
	MOVWF	LPWAITSW1
WAITSW1
	MOVLW	H'18'	; Step(50:24*2+2)
	MOVWF	LPWAITSW0
WAITSW0
	DECFSZ	LPWAITSW0,F
	GOTO	WAITSW0
	DECFSZ	LPWAITSW1,F
	GOTO	WAITSW1
	DECFSZ	LPWAITSW2,F
	GOTO	WAITSW2
	DECFSZ	LPWAITSW3,F
	GOTO	WAITSW3
	RETURN

	END
