;******************************************************************************************
;  直流安定化電源基板サンプル
;   Program Name : 
;   Programer    :
;   Create date  : 2005/10/14 
;   History      :
;   Discription  : 
;******************************************************************************************
;  (1)Description I/O 
;     B0～B7  : A/D Converter
;     A3      : Serial Port(RX)
;     A4      : Serial Port(TX)
;     A5      : Mode SW
;******************************************************************************************
;
	LIST	P=PIC16F88,ST=OFF,R=DEC
	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 & _INTRC_IO
;	__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
SENDLP	EQU	21H
SENDWAT	EQU	22H
RECLP	EQU	23H
RECWAT	EQU	24H
INC0	EQU	25H
INC1	EQU	26H
INC2	EQU	27H
INSUM	EQU	28H
IND	EQU	29H
TMP1	EQU	2AH
TMP2	EQU	2BH
CNT	EQU	2CH
CNT1	EQU	2DH
;
	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
; Bank0での設定
	BANKSEL	PORTA	; 
	CLRF	PORTA	; PortAの初期化(Bank0)
	CLRF	PORTB	; PortBの初期化

; Bank1での設定
	BANKSEL	ANSEL	; 
	MOVLW	B'01111110'	;内部OSC選択,内部OSCに8MHzを選択
	MOVWF	OSCCON
	MOVLW	B'00000000'	; 全てをDegitalに設定
	MOVWF	ANSEL	; Degital Inputに設定(Bank1)
	MOVLW	B'11101111'
	MOVWF	TRISA	; PortAのI/O設定(Bank1)
	MOVLW	B'00000000'
	MOVWF	TRISB	; PortBのI/O設定(Bank1)
; Bank0に戻す
	BANKSEL	PORTA	; 
;
	CLRF	PORTB
MAIN
;  *********************************************************************
;    MODE0
;       バイナリー16進数8ビット仕様(マザーボード／制御ボード用)
;  *********************************************************************
;	CALL	MODE0
;  *********************************************************************
;    MODE1
;       キャラクタ10進数3桁入力仕様(ハイパワーターミナルでのテスト用)
;  *********************************************************************
	CALL	MODE1
;
	GOTO	MAIN

;******************************************************************************************
;   Function Name : MODE0
;   Disctiption   : 16進バイナリーで使用するモード
;                     入力フォーマット：HEX
;   Input         : 
;   Output        :
;******************************************************************************************
MODE0
	CALL	REC
	MOVFW	IODAT
	MOVWF	PORTB
	GOTO	MODE0

;******************************************************************************************
;   Function Name : MODE1
;   Disctiption   : 10進データで使用するモード
;                     入力フォーマット：D2/D1/D0
;   Input         : 
;   Output        :
;******************************************************************************************
MODE1
	CALL	MESCON
MODE1A
	CALL	REC
	CALL	SEND
	MOVFW	IODAT
	XORLW	'D'	; 'D'なら10進データ(Decimal)入力
	BTFSC	STATUS,Z
	CALL	SETDEC
	GOTO	MODE1A

;******************************************************************************************
;   Function Name : SETDEC
;   Disctiption   : 10進データで使用する
;                     入力フォーマット：D2/D1/D0
;   Input         : 
;   Output        :
;******************************************************************************************
SETDEC
;  1.10進データ(キャラクタ)を変数に設定
;    (1)3桁めを設定
	CALL	REC
	CALL	SEND
	MOVFW	IODAT
	MOVWF	INC2
;      数値型以外なら抜ける
	ANDLW	B'11110000'
	XORLW	H'30'	; 数値型(3X)以外なら処理しないで抜ける
	BTFSS	STATUS,Z
	RETURN
;    (2)2桁めを設定
	CALL	REC
	CALL	SEND
	MOVFW	IODAT
	MOVWF	INC1
;      数値型以外なら抜ける
	ANDLW	B'11110000'
	XORLW	H'30'	; 数値型(3X)以外なら処理しないで抜ける
	BTFSS	STATUS,Z
	RETURN
;    (3)1桁めを設定
	CALL	REC
	CALL	SEND
	MOVFW	IODAT
	MOVWF	INC0
;      数値型以外なら抜ける
	ANDLW	B'11110000'
	XORLW	H'30'	; 数値型(3X)以外なら処理しないで抜ける
	BTFSS	STATUS,Z
	RETURN
;  2.キャラクタをバイナリーに変換
	CALL	CNVDEC
;  3.出力確認
	CALL	REC
	CALL	SEND
	MOVFW	IODAT
	XORLW	'E'	; 'E'以外なら出力しないで抜ける
	BTFSS	STATUS,Z
	RETURN
;  5.ポートBへ出力
	MOVFW	INSUM
	MOVWF	PORTB
;  6.完了メッセージ出力
	CALL	MESOK

	RETURN

;******************************************************************************************
;   Function Name : CNVDEC
;   Disctiption   : 10進キャラクタを16進バイナリーに変換
;                    INC2/INC1/INC0 => INSUM
;   Input         : 
;   Output        :
;******************************************************************************************
CNVDEC
;  0.変数初期化
	CLRF	INSUM
;  1.3桁目の処理
;   (1)キャラクタを数値に変換
	MOVFW	INC2
	ANDLW	B'00001111'
	MOVWF	IND
;   (2)10進バイナリーを16進バイナリーに変換
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	CNVDEC2S
	MOVFW	INSUM
CNVDEC1
	ADDLW	H'64'
	DECFSZ	IND,F
	GOTO	CNVDEC1
	MOVWF	INSUM
;
;  2.2桁目の処理
CNVDEC2S
;   (1)キャラクタを数値に変換
	MOVFW	INC1
	ANDLW	B'00001111'
	MOVWF	IND
;   (2)10進バイナリーを16進バイナリーに変換
	XORLW	H'00'
	BTFSC	STATUS,Z
	GOTO	CNVDEC3S
	MOVFW	INSUM
CNVDEC2
	ADDLW	H'0A'
	DECFSZ	IND,F
	GOTO	CNVDEC2
	MOVWF	INSUM
;  3.1桁目の処理
CNVDEC3S
;   (1)キャラクタを数値に変換
	MOVFW	INC0
	ANDLW	B'00001111'
	MOVWF	IND
;   (2)10進バイナリーを16進バイナリーに変換
	MOVFW	INSUM
	ADDWF	IND,W
	MOVWF	INSUM

	RETURN

;******************************************************************************************
;   Function Name : MESCON
;   Disctiption   : CONNECT OKメッセージ
;   Input         : 
;   Output        :
;******************************************************************************************
MESCON
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'P'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'I'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'C'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
;
	MOVLW	'C'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'o'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'n'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'n'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'e'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'c'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	't'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'e'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'd'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'O'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'K'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'>'
	MOVWF	IODAT
	CALL	SEND
	RETURN

;******************************************************************************************
;   Function Name : MESOK
;   Disctiption   : OKメッセージ
;   Input         : 
;   Output        :
;******************************************************************************************
MESOK
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'O'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'U'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'T'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'P'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'U'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'T'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'O'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'K'
	MOVWF	IODAT
	CALL	SEND
	MOVLW	'>'
	MOVWF	IODAT
	CALL	SEND
	RETURN

;******************************************************************************************
;   Function Name : REC
;   Disctiption   : ＲＳ２３２Ｃ受信サブルーチン(PORTA3)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
REC
; (0)変数初期化
	CLRF	IODAT
; (1)受信データを待つ
REC0	BTFSC	PORTA,3
	GOTO	REC0
; (2)1/2ビット分待つ
	MOVLW	H'21'	; 9600BPS OSC;8.000MHz仕様
	MOVWF   RECWAT
REC1	DECFSZ	RECWAT,F
	GOTO	REC1
; (3)データ受信(8ビット分)
	MOVLW	8
	MOVWF	RECLP
	NOP
REC2	MOVLW	H'42'	; 9600BPS OSC;8.000MHz仕様
	MOVWF	RECWAT
REC3	DECFSZ	RECWAT,F
	GOTO	REC3
	NOP
	BTFSS	PORTA,3	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	PORTA,3	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	REC2
	NOP
	NOP
;
	RETURN

;******************************************************************************************
;   Function Name : SEND
;   Disctiption   : ＲＳ２３２Ｃ送信サブルーチン(PORTA4)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
; (1)送信開始
SEND	
	MOVFW	IODAT
	MOVWF	TMP1
;
	BCF	PORTA,4	; 送信開始
	MOVLW	H'42'	; 9600BPS OSC;8.000MHz仕様
	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	PORTA,4
	BTFSC	STATUS,C ; ビットデータが1の時, 1を立てる
	BSF	PORTA,4

	MOVLW	H'42'	; 9600BPS OSC;8.000MHz仕様
	MOVWF	SENDWAT
SEND3	DECFSZ	SENDWAT,F
	GOTO	SEND3

	DECFSZ	SENDLP,F
	GOTO	SEND2
; (3)終了
	BSF	PORTA,4	; フラグを戻す
; (4)少し待つ
	CALL	TIMER
; (5)退避変数を戻す
	MOVFW	TMP1
	MOVWF	IODAT
	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
