;******************************************************************************************
;  I/Oボードサンプル
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.08.01
;   History      :
;******************************************************************************************
;    サンプルボード仕様
;      GP0:Output(LED/リレー:0)　
;      GP1:Output(LED/リレー:1)
;      GP2:Input Degital(0)
;      GP3:RS232C(RA.1) 
;      GP4:Input Degital(1)
;      GP5:RS232C(RA.0)
;====================== 以下はPIC12F683用の記述 ======================
	LIST	P=PIC12F683 	;
	INCLUDE	"P12F683.inc"	;標準ヘッダ定義ファイル
	__CONFIG _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _WDT_OFF
IODAT	EQU	20H
SENDLP	EQU	21H
SENDWAT	EQU	22H
RECLP	EQU	23H
RECWAT	EQU	24H
CNT	EQU	25H
CNT1	EQU	26H
MSGCNT	EQU	27H
IODATBK	EQU	28H
	ORG	0
	BCF	STATUS,RP0
	MOVLW	07H		; BANK0でデジタルIO設定
	MOVWF	CMCON0		; BANK0でデジタルIO設定
	CLRF	GPIO		; BANK0でポート初期化
	BSF	STATUS,RP0
	CLRF	ANSEL		; BANK1でデジタルIO初期化
	MOVLW	B'011100'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0

;=====================================================================
MAIN
; 1.パソコンとの接続完了メッセージを出力	
	CALL	MSGDEMO
START
; 2.パソコンからのコマンドを待つ
;  (1)コマンド受信
	CALL	REC
	MOVFW	IODAT
	MOVWF	IODATBK
;  (2)エコーバック
	CALL	SEND
	CALL	TIMER
	MOVFW	IODATBK
	MOVWF	IODAT
; 3.コマンド実行
MA0
	MOVFW	IODAT
	XORLW	'H'
	BTFSS	STATUS,Z
	GOTO	MA1
; (1) 'H'コマンド処理(指定したポートを'1'にする)
	CALL	REC
	MOVFW	IODAT
	MOVWF	IODATBK
	CALL	SEND
	CALL	TIMER
	MOVFW	IODATBK
	MOVWF	IODAT
	XORLW	'0'
	BTFSS	STATUS,Z
	GOTO	MA01
;   a)ポート0を'1'にする
	BSF	GPIO,0
	GOTO	START
MA01
	MOVFW	IODAT
	XORLW	'1'
	BTFSS	STATUS,Z
	GOTO	MA02
;   b)ポート1を'1'にする
	BSF	GPIO,1
	GOTO	START
MA02	
;   c)入力されたコマンドに誤りがある
	CALL	HELP
	GOTO	START
MA1
	MOVFW	IODAT
	XORLW	'L'
	BTFSS	STATUS,Z
	GOTO	MA2
; (2) 'L'コマンド処理(指定したポートを'0'にする)
	CALL	REC
	MOVFW	IODAT
	MOVWF	IODATBK
	CALL	SEND
	CALL	TIMER
	MOVFW	IODATBK
	MOVWF	IODAT
	XORLW	'0'
	BTFSS	STATUS,Z
	GOTO	MA11
;   a)ポート0を'0'にする
	BCF	GPIO,0
	GOTO	START
MA11
	MOVFW	IODAT
	XORLW	'1'
	BTFSS	STATUS,Z
	GOTO	MA12
;   b)ポート1を'0'にする
	BCF	GPIO,1
	GOTO	START
MA12	
;   c)入力されたコマンドに誤りがある
	CALL	HELP
	GOTO	START
MA2
	MOVFW	IODAT
	XORLW	'I'
	BTFSS	STATUS,Z
	GOTO	MA3
; (3) 'I'コマンド処理(指定したポートが、'0'か'1'かを調べてパソコンに送信する)
	CALL	REC
	MOVFW	IODAT
	MOVWF	IODATBK
	CALL	SEND
	CALL	TIMER
	MOVFW	IODATBK
	MOVWF	IODAT
	XORLW	'0'
	BTFSS	STATUS,Z
	GOTO	MA21
;
;   a)ポート2を調べる
	BTFSS	GPIO,2
	GOTO	MA20A
	CALL	MINPON
	GOTO	START
MA20A
	CALL	MINPOF
	GOTO	START
MA21
	MOVFW	IODAT
	XORLW	'1'
	BTFSS	STATUS,Z
	GOTO	MA22
;   b)ポート4を調べる
	BTFSS	GPIO,4
	GOTO	MA21A
	CALL	MINPON
	GOTO	START
MA21A
	CALL	MINPOF
	GOTO	START
MA22	
	CALL	HELP
	GOTO	START
MA3
; (4) それ以外のコマンド処理(ヘルプをパソコンに送信する)
	CALL	HELP
	GOTO	START

;******************************************************************************************
;   Function Name : MINPON
;   Disctiption   : パソコンに'ON'メッセージを出力する
;   Input         : 
;   Output        : 
;******************************************************************************************
MINPON
	MOVLW	H'03'
	MOVWF	MSGCNT
MINPON1
	MOVFW	MSGCNT
	CALL	ONTBL
	MOVWF	IODAT
	CALL	SEND
	CALL	TIMER
	DECFSZ	MSGCNT,F
	GOTO	MINPON1
	RETURN
ONTBL
	ADDWF	PCL,F
	RETLW	' '
	RETLW	'N'
	RETLW	'O'
	RETLW	' '

;******************************************************************************************
;   Function Name : MINPON
;   Disctiption   : パソコンに'OFF'メッセージを出力する
;   Input         : 
;   Output        : 
;******************************************************************************************
MINPOF
	MOVLW	H'04'
	MOVWF	MSGCNT
MINPOF1
	MOVFW	MSGCNT
	CALL	OFTBL
	MOVWF	IODAT
	CALL	SEND
	CALL	TIMER
	DECFSZ	MSGCNT,F
	GOTO	MINPOF1

	RETURN
OFTBL
	ADDWF	PCL,F
	RETLW	' '
	RETLW	'F'
	RETLW	'F'
	RETLW	'O'
	RETLW	' '

;******************************************************************************************
;   Function Name : MSGDEMO
;   Disctiption   : パソコンとの接続完了メッセージを出力する
;   Input         : 
;   Output        : 
;******************************************************************************************
MSGDEMO
	MOVLW	H'12'
	MOVWF	MSGCNT
MSGDEM1
	MOVFW	MSGCNT
	CALL	MDETBL
	MOVWF	IODAT
	CALL	SEND
	CALL	TIMER
	DECFSZ	MSGCNT,F
	GOTO	MSGDEM1
	RETLW	0
MDETBL
	ADDWF	PCL,F
	RETLW	' '
	RETLW	'>'
	RETLW	'K'
	RETLW	'O'
	RETLW	' '
	RETLW	'd'
	RETLW	'e'
	RETLW	't'
	RETLW	'c'
	RETLW	'e'
	RETLW	'n'
	RETLW	'n'
	RETLW	'o'
	RETLW	'C'
	RETLW	' '
	RETLW	'C'
	RETLW	'I'
	RETLW	'P'
	RETLW	' '

;******************************************************************************************
;   Function Name : HELP
;   Disctiption   : 操作説明をパソコンに出力する
;   Input         : 
;   Output        : 
;******************************************************************************************
HELP
	MOVLW	H'1A'
	MOVWF	MSGCNT
HELP1
	MOVFW	MSGCNT
	CALL	HTBL
	MOVWF	IODAT
	CALL	SEND
	CALL	TIMER
	DECFSZ	MSGCNT,F
	GOTO	HELP1
	RETLW	0
HTBL
	ADDWF	PCL,F
	RETLW	' '
	RETLW	'>'
	RETLW	'?'
	RETLW	'K'
	RETLW	'O'
	RETLW	' '
	RETLW	')'
	RETLW	'1'
	RETLW	'/'
	RETLW	'0'
	RETLW	'('
	RETLW	'n'
	RETLW	'I'
	RETLW	'/'
	RETLW	')'
	RETLW	'1'
	RETLW	'/'
	RETLW	'0'
	RETLW	'('
	RETLW	'n'
	RETLW	')'
	RETLW	'L'
	RETLW	'/'
	RETLW	'H'
	RETLW	'('
	RETLW	'f'
	RETLW	'?'



;******************************************************************************************
;   Function Name : REC
;   Disctiption   : ＲＳ２３２Ｃ受信サブルーチン(GPIO,3)
;                   9600BPS OSC;4.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
; (0)変数初期化
	CLRF	IODAT
; (1)受信データを待つ
REC	BTFSC	GPIO,3
	GOTO	REC
; (2)1/2ビット分待つ
	MOVLW	H'0F'
	MOVWF   RECWAT
REC1	DECFSZ	RECWAT,F
	GOTO	REC1
; (3)データ受信(8ビット分)
	MOVLW	8
	MOVWF	RECLP
	NOP
REC2	MOVLW	H'1F'
	MOVWF	RECWAT
REC3	DECFSZ	RECWAT,F
	GOTO	REC3
	NOP
	BTFSS	GPIO,3	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	GPIO,3	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	REC2
	NOP
	NOP
;
	RETURN

;******************************************************************************************
;   Function Name : SEND
;   Disctiption   : ＲＳ２３２Ｃ送信サブルーチン(GPIO,5)
;                   9600BPS OSC;4.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
; (1)送信開始
SEND	BCF	GPIO,5	; 送信開始
	MOVLW	H'1F'
	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,5
	BTFSC	STATUS,C ; ビットデータが1の時, 1を立てる
	BSF	GPIO,5

	MOVLW	H'1F'	; パルス(9600BPS)
	MOVWF	SENDWAT
SEND3	DECFSZ	SENDWAT,F
	GOTO	SEND3

	DECFSZ	SENDLP,F
	GOTO	SEND2
; (3)終了
	BSF	GPIO,5	; フラグを戻す

	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
