;******************************************************************************************
;  IBM PS/2 106キーボード接続サンプル(赤外線受信式・受信プログラム)
;    ※標準バースト波を使用
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.11.20
;   History      :
;******************************************************************************************
;   Define I/O
;     GP0:Senser Input
;     GP1:None 
;     GP2:None
;     GP3:None 
;     GP4:Tx (RS232C)
;     GP5:Rx (RS232C)
;
;******************************************************************************************
;====================== 以下はPIC12F683用の記述 ======================
	LIST	P=PIC12F683,ST=OFF,R=DEC
	INCLUDE	"P12F683.inc"	;標準ヘッダ定義ファイル
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF 
;
IODAT	EQU	20H
SENDLP	EQU	21H
SENDWAT	EQU	22H
RECLP	EQU	23H
RECWAT	EQU	24H
MSGCNT	EQU	25H
CNT	EQU	26H
CNT1	EQU	27H
CNT2	EQU	28H
CNT3	EQU	29H
OVER	EQU	2AH
LPRMTREV EQU	2BH
LPRDR0	EQU	2CH
LPTWL0	EQU	2DH
LPTWL1	EQU	2EH
LPRDRB0	EQU	2FH

BKIODAT	EQU	30H
MONDAT	EQU	31H
LPMON	EQU	32H

	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
	BSF	STATUS,RP0	; BANK1を選択
	BSF	OSCCON,6	; 8MHzを設定
	BSF	OSCCON,5	; 8MHzを設定
	BSF	OSCCON,4	; 8MHzを設定
	NOP
	NOP
	BCF	STATUS,RP0	; BANK0を選択
	MOVLW	07H		; BANK0でデジタルIO設定
	MOVWF	CMCON0		; BANK0でデジタルIO設定
	CLRF	GPIO		; BANK0でポート初期化
	BSF	STATUS,RP0	; BANK1を選択
	CLRF	ANSEL		; BANK1でデジタルIO初期化
	MOVLW	B'101111'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を選択
;=====================================================================
	CALL	DEMO1
	CALL	TIMERB
MAIN
;  1.赤外線モジュールからデータがくるのを待つ
	CALL	RMTREV
;  2.RS232Cでデータを送る
;	CALL	MON
	CALL	SEND
;
	GOTO	MAIN

;******************************************************************************************
;   Function Name : DEMO1
;   Disctiption   : PowerON デモ 
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMO1
;	CALL	WATP001
	MOVLW	H'1B'
	MOVWF	MSGCNT
DEMO1A
	MOVFW	MSGCNT
	CALL	DEMO1TBL
	MOVWF	IODAT
	CALL	SEND
;	CALL	WATP001
	DECFSZ	MSGCNT,F
	GOTO	DEMO1A
	RETLW	0
DEMO1TBL
	ADDWF	PCL,F
	RETLW	' '
	RETLW	'>'
	RETLW	'K'
	RETLW	'O'
	RETLW	' '
	RETLW	'3'
	RETLW	'8'
	RETLW	'6'
	RETLW	'F'
	RETLW	'2'
	RETLW	'1'
	RETLW	'C'
	RETLW	'I'
	RETLW	'P'
	RETLW	' '
	RETLW	'd'
	RETLW	'e'
	RETLW	't'
	RETLW	'c'
	RETLW	'e'
	RETLW	'n'
	RETLW	'n'
	RETLW	'o'
	RETLW	'C'
	RETLW	' '
	RETLW	' '
	RETLW	' '
	RETLW	' '

;******************************************************************************************
;   Function Name : MON
;   Title         : データ検証用モニタプログラム
;   Input         : IODAT
;   Output        : 
;   Description   : 
;******************************************************************************************
MON
	MOVFW	IODAT
	MOVWF	BKIODAT
	MOVWF	MONDAT
	MOVLW	'['
	MOVWF	IODAT
	CALL	SEND
	MOVLW	H'08'
	MOVWF	LPMON
MON1
	BTFSC	MONDAT,7
	MOVLW	'1'
	BTFSS	MONDAT,7
	MOVLW	'0'
	MOVWF	IODAT
	CALL	SEND
	RLF	MONDAT,F
	DECFSZ	LPMON,F
	GOTO	MON1 
;
	MOVLW	']'
	MOVWF	IODAT
	CALL	SEND
	MOVFW	BKIODAT
	MOVWF	IODAT
	RETURN

;******************************************************************************************
;   Function Name : RMTREV
;   Title         : 赤外線リモコン受信(8ビットデータ) 
;                   ※標準バースト波を使用 
;   Input         : 
;   Output        : IODAT
;   Description   : 
;******************************************************************************************
RMTREV
;  0.変数初期化
	CLRF	IODAT
;  1.リーダー部分
;  (1)開始の検知
	BTFSC	GPIO,0
	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	GPIO,0
	BCF	IODAT,7
	BTFSS	GPIO,0
	BSF	IODAT,7
;   (4)Wait 1/2TWL
	CALL	WAITTWL
;   (5)Loop-end
	DECFSZ	LPRMTREV,F
	GOTO	RMTREV2
; 
	RRF	IODAT,F
;
	RETURN

;*******************************************************************************************
;   Function Name : WAITRDR
;   Title         : リーダー部分を読み飛ばす(13.5mSのWAIT;9mS+4.5mS) 
;   Input         : 
;   Output        :  
;   Description   : OSC:8/4 MHz用 => 27,000 ステップ(600 * 45) 
;*******************************************************************************************
WAITRDR
	MOVLW	H'2D'	; 27,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:8/4 MHz用 => 600ステップ
;*******************************************************************************************
WAITTWL
	MOVLW	H'06'	; 600 Step(6)
	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 : REC
;   Title         : ＲＳ２３２Ｃ受信サブルーチン(GPIO,5)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
REC
; (0)変数初期化
	CLRF	IODAT
; (1)受信データを待つ
	BTFSC	GPIO,5
	GOTO	REC
; (2)1/2ビット分待つ
	MOVLW	H'21'	; 9600BPS,OSC;8MHz
	MOVWF   RECWAT
REC1	DECFSZ	RECWAT,F
	GOTO	REC1
; (3)データ受信(8ビット分)
	MOVLW	8
	MOVWF	RECLP
	NOP
REC2	MOVLW	H'42'	; 9600BPS,OSC;8MHz
	MOVWF	RECWAT
REC3	DECFSZ	RECWAT,F
	GOTO	REC3
	NOP
	BTFSS	GPIO,5	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	GPIO,5	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	REC2
	NOP
	NOP
;
	RETURN

;******************************************************************************************
;   Function Name : SEND
;   Title         : ＲＳ２３２Ｃ送信サブルーチン(GPIO,4)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
; (1)送信開始
SEND	
	BCF	GPIO,4	; 送信開始
	MOVLW	H'42'	; 9600BPS,OSC;8MHz
	MOVWF	SENDWAT
SEND1	DECFSZ	SENDWAT,F
	GOTO	SEND1
;
; (2)データ送信(8ビット)
	MOVLW	8	; 8ビットデータ分、送信する
	MOVWF	SENDLP
	NOP
SEND2	RRF	IODAT,F
	NOP
	BTFSS	STATUS,C ; ビットデータが0の時, 0を立てる	
	BCF	GPIO,4
	BTFSC	STATUS,C ; ビットデータが1の時, 1を立てる
	BSF	GPIO,4

	MOVLW	H'42'	; パルス(9600BPS,OSC;8MHz)
	MOVWF	SENDWAT
SEND3	DECFSZ	SENDWAT,F
	GOTO	SEND3

	DECFSZ	SENDLP,F
	GOTO	SEND2
; (3)終了
	BSF	GPIO,4	; フラグを戻す
; (4)送信後、少し待つ
	CALL	TIMER

	RETURN
;
;******************************************************************************************
;   Function Name : TIMERB
;   Title         : タイマー
;   Input         : 
;   Output        :
;******************************************************************************************
TIMERB
	MOVLW	H'0A'
	MOVWF	CNT3
TIMERB1
	MOVLW	H'0A'
	MOVWF	CNT2
TIMERB2
	CALL	TIMER
	DECFSZ	CNT2,F
	GOTO	TIMERB2 
	DECFSZ	CNT3,F
	GOTO	TIMERB1

	RETURN

;******************************************************************************************
;   Function Name : TIMER
;   Title         : タイマー(1000回ループ)
;   Input         : 
;   Output        :
;******************************************************************************************
TIMER
	MOVLW	H'0A'
	MOVWF	CNT1
TIMER1
	MOVLW	H'64'
	MOVWF	CNT
TIMER2
	DECFSZ	CNT,F
	GOTO	TIMER2 
	DECFSZ	CNT1,F
	GOTO	TIMER1

	RETURN

	END
