;******************************************************************************************
;  IBM PS/2 106キーボード接続サンプル
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.10.28
;   History      :
;******************************************************************************************
;   Define I/O
;     GP0:Clock Line (Key Bord)
;     GP1:Data Line (Key Bord)
;     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 
;
WATP001TMR = 80	; 8MHz用001秒タイマー分周値	
;
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
BITDAT	EQU	2BH
KEYDAT	EQU	2CH
KEYRECLP EQU	2DH
CODDAT	EQU	2EH


	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
	CALL	PRG01
	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 : PRG01
;   Disctiption   : 変換処理 
;   Input         : 
;   Output        : 
;*******************************************************************************************
PRG01
;  1.キーボードからの入力を待つ
	CALL	KEYREC
;  2.変換処理
	CALL	CHGTBL
;  3.RS232Cで出力
	MOVWF	IODAT
	XORLW	H'FF'
	BTFSS	STATUS,Z
	CALL	SEND
	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する(2バイト系以上のBreakコマンド等をキャンセルするため、数mS以上の時間が必要)
	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 : REC
;   Disctiption   : ＲＳ２３２Ｃ受信サブルーチン(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
;   Disctiption   : ＲＳ２３２Ｃ送信サブルーチン(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
;   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
