;******************************************************************************************
;  IBM PS/2 106キーボード接続サンプル(赤外線式・送信)
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.11.20
;   History      :
;******************************************************************************************
;   Define I/O
;     GP0:Clock Line (Key Bord)
;     GP1:Data Line (Key Bord)
;     GP2:None
;     GP3:None 
;     GP4:LED Output
;     GP5:None
;
;******************************************************************************************
;====================== 以下は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
MSGCNT	EQU	21H
CNT	EQU	22H
CNT1	EQU	23H
CNT2	EQU	24H
CNT3	EQU	25H
OVER	EQU	26H
BITDAT	EQU	27H
KEYDAT	EQU	28H
KEYRECLP EQU	29H
CODDAT	EQU	2AH
LPRMTSND EQU	2BH
LPTWLPLS EQU	2CH
LPTWLWAT1 EQU	2DH
LPTWLWAT0 EQU	2EH
LPRDRPLS EQU	2FH
LPWATCRY EQU	30H
LPRDRWAT1 EQU	31H
LPRDRWAT0 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を選択
;=====================================================================
;  0.初期化
	BCF	GPIO,4
MAIN
;  1.キーボードからの入力を待つ
	CALL	KEYREC
;  2.変換処理
	CALL	CHGTBL
;  3.赤外線で出力
	CALL	RMTSND
;
	GOTO	MAIN


;******************************************************************************************
;   Function Name : RMTSND
;   Title         : 赤外線リモコン送信(8ビットデータ) 
;                   ※標準バースト波を使用 
;   Input         : W-REG
;   Output        :
;******************************************************************************************
RMTSND
; (0)変数設定
	BCF	GPIO,4
	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	GPIO,4
	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	GPIO,4
; (2)WAIT(13.16μS)
	CALL	WATCRY
; (3)'0'を出力
	BCF	GPIO,4
; (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:8/4 MHz用 => 1200ステップ
;******************************************************************************************
TWLWAT
	MOVLW	H'0C'	; 1200 Step(12*100) 
	MOVWF	LPTWLWAT1
TWLWAT1
	MOVLW	H'20'	; 100 Step(32*3+4)
	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'FD'	; FF
	MOVWF	LPRDRPLS
RDRPLS1
; (1)'1'を出力
	BSF	GPIO,4
; (2)WAIT(13.16μS)
	CALL	WATCRY
; (3)'0'を出力
	BCF	GPIO,4
; (4)WAIT(13.16μS)
	CALL	WATCRY
; (5)ループ
	DECFSZ	LPRDRPLS,F
	GOTO	RDRPLS1
;
; 2.リーダーパルスを出力(87回)
	MOVLW	H'57'
	MOVWF	LPRDRPLS
RDRPLS2
; (1)'1'を出力
	BSF	GPIO,4
; (2)WAIT(13.16μS)
	CALL	WATCRY
; (3)'0'を出力
	BCF	GPIO,4
; (4)WAIT(13.16μS)
	CALL	WATCRY
; (5)ループ
	DECFSZ	LPRDRPLS,F
	GOTO	RDRPLS2
	RETURN

;******************************************************************************************
;   Function Name : WATCRY
;   Title         : 赤外線の搬送波(38kHz)のパルス間隔(13.16μS)
;   Input         : 
;   Output        :
;   Description   : OSC:8/4MHz用 => 26(22)ステップ 
;******************************************************************************************
WATCRY
	MOVLW	H'06'	; 22 Step(6*3+4)
	MOVWF	LPWATCRY
	DECFSZ	LPWATCRY,F
	GOTO	$-1
	NOP
	NOP
	NOP
	RETURN

;******************************************************************************************
;   Function Name : RDRWAT
;   Title         : 赤外線リーダーの空白部分を作成(4.5mS)
;   Input         : 
;   Output        :
;   Description   : OSC:8/4MHz(500nS/STEP)用 => 9000ステップ (90 * 100) 
;******************************************************************************************
RDRWAT
	MOVLW	H'64'	; 100 Step(64)
	MOVWF	LPRDRWAT1
RDRWAT1
	MOVLW	H'09'	; 90(9*9+9) STEP 
	MOVWF	LPRDRWAT0
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
RDRWAT0
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	LPRDRWAT0,F
	GOTO	RDRWAT0		; ! 2 STEP
	DECFSZ	LPRDRWAT1,F
	GOTO	RDRWAT1
	RETURN

;*******************************************************************************************
;   Function Name : CHGTBL
;   Disctiption   : コード変換処理(106キーボード仕様) 
;   Input         : KEYDAT
;   Output        : W-Register
;   Description   : 上記以外のコードの場合、H'FF'を返す
;*******************************************************************************************
CHGTBL
; ******************************
;    A-Z
; ******************************
	MOVFW	KEYDAT
	XORLW	H'1C'
	BTFSC	STATUS,Z
	RETLW	'A'
;
	MOVFW	KEYDAT
	XORLW	H'32'
	BTFSC	STATUS,Z
	RETLW	'B'
;
	MOVFW	KEYDAT
	XORLW	H'21'
	BTFSC	STATUS,Z
	RETLW	'C'
;
	MOVFW	KEYDAT
	XORLW	H'23'
	BTFSC	STATUS,Z
	RETLW	'D'
;
	MOVFW	KEYDAT
	XORLW	H'24'
	BTFSC	STATUS,Z
	RETLW	'E'
;
	MOVFW	KEYDAT
	XORLW	H'2B'
	BTFSC	STATUS,Z
	RETLW	'F'
;
	MOVFW	KEYDAT
	XORLW	H'34'
	BTFSC	STATUS,Z
	RETLW	'G'
;
	MOVFW	KEYDAT
	XORLW	H'33'
	BTFSC	STATUS,Z
	RETLW	'H'
;
	MOVFW	KEYDAT
	XORLW	H'43'
	BTFSC	STATUS,Z
	RETLW	'I'
;
	MOVFW	KEYDAT
	XORLW	H'3B'
	BTFSC	STATUS,Z
	RETLW	'J'
;
	MOVFW	KEYDAT
	XORLW	H'42'
	BTFSC	STATUS,Z
	RETLW	'K'
;
	MOVFW	KEYDAT
	XORLW	H'4B'
	BTFSC	STATUS,Z
	RETLW	'L'
;
	MOVFW	KEYDAT
	XORLW	H'3A'
	BTFSC	STATUS,Z
	RETLW	'M'
;
	MOVFW	KEYDAT
	XORLW	H'31'
	BTFSC	STATUS,Z
	RETLW	'N'
;
	MOVFW	KEYDAT
	XORLW	H'44'
	BTFSC	STATUS,Z
	RETLW	'O'
;
	MOVFW	KEYDAT
	XORLW	H'4D'
	BTFSC	STATUS,Z
	RETLW	'P'
;
	MOVFW	KEYDAT
	XORLW	H'15'
	BTFSC	STATUS,Z
	RETLW	'Q'
;
	MOVFW	KEYDAT
	XORLW	H'2D'
	BTFSC	STATUS,Z
	RETLW	'R'
;
	MOVFW	KEYDAT
	XORLW	H'1B'
	BTFSC	STATUS,Z
	RETLW	'S'
;
	MOVFW	KEYDAT
	XORLW	H'2C'
	BTFSC	STATUS,Z
	RETLW	'T'
;
	MOVFW	KEYDAT
	XORLW	H'3C'
	BTFSC	STATUS,Z
	RETLW	'U'
;
	MOVFW	KEYDAT
	XORLW	H'2A'
	BTFSC	STATUS,Z
	RETLW	'V'
;
	MOVFW	KEYDAT
	XORLW	H'1D'
	BTFSC	STATUS,Z
	RETLW	'W'
;
	MOVFW	KEYDAT
	XORLW	H'22'
	BTFSC	STATUS,Z
	RETLW	'X'
;
	MOVFW	KEYDAT
	XORLW	H'35'
	BTFSC	STATUS,Z
	RETLW	'Y'
;
	MOVFW	KEYDAT
	XORLW	H'1A'
	BTFSC	STATUS,Z
	RETLW	'Z'
;
; ******************************
;    0-9
; ******************************
	MOVFW	KEYDAT
	XORLW	H'45'
	BTFSC	STATUS,Z
	RETLW	'0'
;
	MOVFW	KEYDAT
	XORLW	H'16'
	BTFSC	STATUS,Z
	RETLW	'1'
;
	MOVFW	KEYDAT
	XORLW	H'1E'
	BTFSC	STATUS,Z
	RETLW	'2'
;
	MOVFW	KEYDAT
	XORLW	H'26'
	BTFSC	STATUS,Z
	RETLW	'3'
;
	MOVFW	KEYDAT
	XORLW	H'25'
	BTFSC	STATUS,Z
	RETLW	'4'
;
	MOVFW	KEYDAT
	XORLW	H'2E'
	BTFSC	STATUS,Z
	RETLW	'5'
;
	MOVFW	KEYDAT
	XORLW	H'36'
	BTFSC	STATUS,Z
	RETLW	'6'
;
	MOVFW	KEYDAT
	XORLW	H'3D'
	BTFSC	STATUS,Z
	RETLW	'7'
;
	MOVFW	KEYDAT
	XORLW	H'3E'
	BTFSC	STATUS,Z
	RETLW	'8'
;
	MOVFW	KEYDAT
	XORLW	H'46'
	BTFSC	STATUS,Z
	RETLW	'9'
;
; ******************************
;    0-9(テンキーより)
; ******************************
	MOVFW	KEYDAT
	XORLW	H'70'
	BTFSC	STATUS,Z
	RETLW	'0'
;
	MOVFW	KEYDAT
	XORLW	H'69'
	BTFSC	STATUS,Z
	RETLW	'1'
;
	MOVFW	KEYDAT
	XORLW	H'72'
	BTFSC	STATUS,Z
	RETLW	'2'
;
	MOVFW	KEYDAT
	XORLW	H'7A'
	BTFSC	STATUS,Z
	RETLW	'3'
;
	MOVFW	KEYDAT
	XORLW	H'6B'
	BTFSC	STATUS,Z
	RETLW	'4'
;
	MOVFW	KEYDAT
	XORLW	H'73'
	BTFSC	STATUS,Z
	RETLW	'5'
;
	MOVFW	KEYDAT
	XORLW	H'74'
	BTFSC	STATUS,Z
	RETLW	'6'
;
	MOVFW	KEYDAT
	XORLW	H'6C'
	BTFSC	STATUS,Z
	RETLW	'7'
;
	MOVFW	KEYDAT
	XORLW	H'75'
	BTFSC	STATUS,Z
	RETLW	'8'
;
	MOVFW	KEYDAT
	XORLW	H'7D'
	BTFSC	STATUS,Z
	RETLW	'9'
;
; ******************************
;    その他
; ******************************
	MOVFW	KEYDAT
	XORLW	H'5A'
	BTFSC	STATUS,Z
	RETLW	H'0A'
; ******************************
;    エラー
; ******************************
	RETLW	H'FF'
;*******************************************************************************************
;   Function Name : KEYREC
;   Disctiption   : キーボードからの受信処理 
;   Input         : 
;   Output        : KEYDAT
;   Description   : １ビットが60～100μSでクロック同期 
;*******************************************************************************************
KEYREC
;   1.スタートビットを待つ
	BTFSC	GPIO,0	; クロックが0以外ならクロックを待つ
	GOTO	KEYREC
	CALL	REDBIT
;   2.シリアルデータ受信(8Bit)
	CLRF	KEYDAT
	MOVLW	H'08'
	MOVWF	KEYRECLP
KEYREC0
	RRF	KEYDAT,F ; 変数内でビットをシフトする
KEYREC1
	BTFSC	GPIO,0	; クロックが0以外ならクロックを待つ
	GOTO	KEYREC1
	CALL	REDBIT
	BTFSS	BITDAT,0 ; ビットデータが0の時, 0を立てる
	BCF	KEYDAT,7
	BTFSC	BITDAT,0 ; ビットデータが1の時, 1を立てる
	BSF	KEYDAT,7
;
	DECFSZ	KEYRECLP,F
	GOTO	KEYREC0
;   3.パリティービットを待つ
KEYREC2
	BTFSC	GPIO,0	; クロックが0以外ならクロックを待つ
	GOTO	KEYREC2
	CALL	REDBIT
;   4.ストップビットを待つ
KEYREC3
	BTFSC	GPIO,0	; クロックが0以外ならクロックを待つ
	GOTO	KEYREC3
	CALL	REDBIT
;   5.Waitする
	CALL	TIMERB
	RETURN
;*******************************************************************************************
;   Function Name : REDBIT
;   Disctiption   : １ビットの受信 
;   Input         : 
;   Output        :  BITDAT
;   Description   : １ビットが60～100μSでクロック同期 
;*******************************************************************************************
REDBIT
	NOP
	CLRF	BITDAT
	BTFSC	GPIO,1
	BSF	BITDAT,0
	BTFSS	GPIO,1
	BCF	BITDAT,0
REDBIT1
	BTFSS	GPIO,0
	GOTO	REDBIT1
	NOP
	RETURN
;
;******************************************************************************************
;   Function Name : TIMERB
;   Disctiption   : タイマー
;   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
;   Disctiption   : タイマー(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
