;******************************************************************************************
;  16*32ドット表示機用 通信制御サンプル
;    ※このプログラムは、18F452/16F877用とペアで使用する
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.08.01
;   History      :
;******************************************************************************************
;  (1)Descript I/O 
;      GP0 : PIC18F452からのシグナル入力 
;      GP1 : PIC18F452へのデータ出力
;      GP4 : Input (RS)
;      GP5 : Output(TX)
;
;******************************************************************************************
	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
BKIODAT	EQU	28H

	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を設定
	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'010001'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を選択

	BSF	GPIO,1
	CALL	DEMO1
MAIN
	CALL	REC
	BCF	GPIO,1
	MOVFW	IODAT
	MOVWF	BKIODAT
MAIN1
	BTFSC	GPIO,0
	GOTO	MAIN1
	BSF	GPIO,1
	CALL	PSEND
	MOVFW	BKIODAT
	MOVWF	IODAT
	CALL	SEND
	GOTO	MAIN

;*******************************************************************************************
;   関数名    : DEMO1　　　　
;   機能      : PowerON デモ 
;   引数      :
;   変数      :
;   注意      :
;*******************************************************************************************
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 : REC
;   Disctiption   : ＲＳ２３２Ｃ受信サブルーチン(GPIO,4)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
; (0)変数初期化
	CLRF	IODAT
; (1)受信データを待つ
REC	BTFSC	GPIO,4
	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,4	; ビットデータが0の時, 0を立てる
	BCF	STATUS,C
	BTFSC	GPIO,4	; ビットデータが1の時, 1を立てる
	BSF	STATUS,C
	RRF	IODAT,F	; 変数内でビットをシフトする
	DECFSZ	RECLP,F
	GOTO	REC2
	NOP
	NOP
;
	RETURN

;******************************************************************************************
;   Function Name : SEND
;   Disctiption   : ＲＳ２３２Ｃ送信サブルーチン(GPIO,5)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
; (1)送信開始
SEND	BCF	GPIO,5	; 送信開始
	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,5
	BTFSC	STATUS,C ; ビットデータが1の時, 1を立てる
	BSF	GPIO,5

	MOVLW	H'42'	; パルス(9600BPS,OSC;8MHz)
	MOVWF	SENDWAT
SEND3	DECFSZ	SENDWAT,F
	GOTO	SEND3

	DECFSZ	SENDLP,F
	GOTO	SEND2
; (3)終了
	BSF	GPIO,5	; フラグを戻す
; (4)送信後、少し待つ
	CALL	TIMER

	RETURN

;******************************************************************************************
;   Function Name : PSEND
;   Disctiption   : 18F452への送信サブルーチン(GPIO,1)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
; (1)送信開始
PSEND	BCF	GPIO,1	; 送信開始
	MOVLW	H'42'	; 9600BPS,OSC;8MHz
	MOVWF	SENDWAT
PSEND1	DECFSZ	SENDWAT,F
	GOTO	PSEND1
;
; (2)データ送信(8ビット)
	MOVLW	8	; 8ビットデータ分、送信する
	MOVWF	SENDLP
	NOP
PSEND2	RRF	IODAT,F
	NOP
	BTFSS	STATUS,C ; ビットデータが0の時, 0を立てる	
	BCF	GPIO,1
	BTFSC	STATUS,C ; ビットデータが1の時, 1を立てる
	BSF	GPIO,1

	MOVLW	H'42'	; パルス(9600BPS,OSC;8MHz)
	MOVWF	SENDWAT
PSEND3	DECFSZ	SENDWAT,F
	GOTO	PSEND3

	DECFSZ	SENDLP,F
	GOTO	PSEND2
; (3)終了
	BSF	GPIO,1	; フラグを戻す
; (4)送信後、少し待つ
	CALL	TIMER

	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

;*******************************************************************************************
;   関数名    : WATP001　　　　
;   機能      : 0.001秒(1mS)タイマー 
;   引数      : なし 
;   変数      :
;   注意      : マクロでWATP001TMRを定義しておく
;*******************************************************************************************
WATP001
	MOVLW	WATP001TMR
	MOVWF	CNT1
WATP001B
	MOVLW	H'64'
	MOVWF	CNT
WATP001A
	DECFSZ	CNT,F
	GOTO	WATP001A 
	DECFSZ	CNT1,F
	GOTO	WATP001B
	RETLW	0

	END

