;******************************************************************************************
;  EEP(AT24C)アクセスサンプル
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.08.01
;   History      :
;******************************************************************************************
;====================== 以下は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
EEPWDAT	EQU	28H
ATEEPAD0 EQU	29H
ATEEPAD1 EQU	2AH
ATEEPDAT EQU	2BH
LPEEP	EQU	2CH
LPWATP01 EQU	2DH
WRT24TMP EQU	2EH
I2CRSLP	EQU	2FH
I2CSDTMP EQU	30H
I2CSDLP EQU	31H
I2CRSTMP 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'001000'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を選択

;=====================================================================
	CALL	DEMO1
MAIN
	CALL	DEMO2W
	CALL	DEMO3W
	CALL	DEMO2R
	CALL	DEMO3R

	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 : DEMO2W
;   Disctiption   : PIC内部EEPにデータを書き込むデモ 
;                   (00～04にデータを書く)
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMO2W
;
	MOVLW	'('
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'P'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'I'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'C'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'I'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'n'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	's'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'i'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'd'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'e'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'['
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'W'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	']'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	')'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
;
;
	CALL	REC	
	MOVFW	IODAT
	MOVWF	EEPWDAT
	MOVLW	H'00'
	CALL	WRTEEP
	CALL	SEND
;
	CALL	REC	
	MOVFW	IODAT
	MOVWF	EEPWDAT
	MOVLW	H'01'
	CALL	WRTEEP
	CALL	SEND
;
	CALL	REC	
	MOVFW	IODAT
	MOVWF	EEPWDAT
	MOVLW	H'02'
	CALL	WRTEEP
	CALL	SEND
;
	CALL	REC	
	MOVFW	IODAT
	MOVWF	EEPWDAT
	MOVLW	H'03'
	CALL	WRTEEP
	CALL	SEND
;
	CALL	REC	
	MOVFW	IODAT
	MOVWF	EEPWDAT
	MOVLW	H'04'
	CALL	WRTEEP
	CALL	SEND
;
	RETURN

;******************************************************************************************
;   Function Name : DEMO2R
;   Disctiption   : PIC内部EEPからデータを読み、PCに表示するデモ 
;                   (00～04のデータを読む)
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMO2R
;
	MOVLW	'('
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'P'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'I'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'C'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	' '
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'I'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'n'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	's'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'i'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'd'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'e'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'['
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'R'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	']'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	')'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	CALL	REDEEP
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
	MOVLW	H'01'
	CALL	REDEEP
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
	MOVLW	H'02'
	CALL	REDEEP
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
	MOVLW	H'03'
	CALL	REDEEP
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
	MOVLW	H'04'
	CALL	REDEEP
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001

	RETURN

;******************************************************************************************
;   Function Name : DEMO3R
;   Disctiption   : AT24Cからデータを読み、PCに表示するデモ
;                   (00～04にデータを書く)
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMO3R
;
	MOVLW	'('
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'A'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'T'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'2'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'4'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'C'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'X'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'X'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'['
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'R'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	']'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	')'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	ATEEPAD1
	MOVLW	H'00'
	MOVWF	ATEEPAD0
	CALL	RED24EEP
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
	MOVLW	H'00'
	MOVWF	ATEEPAD1
	MOVLW	H'01'
	MOVWF	ATEEPAD0
	CALL	RED24EEP
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
	MOVLW	H'00'
	MOVWF	ATEEPAD1
	MOVLW	H'02'
	MOVWF	ATEEPAD0
	CALL	RED24EEP
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
	MOVLW	H'00'
	MOVWF	ATEEPAD1
	MOVLW	H'03'
	MOVWF	ATEEPAD0
	CALL	RED24EEP
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
	MOVLW	H'00'
	MOVWF	ATEEPAD1
	MOVLW	H'04'
	MOVWF	ATEEPAD0
	CALL	RED24EEP
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001

	RETURN

;******************************************************************************************
;   Function Name : DEMO3W
;   Disctiption   : AT24Cにデータを書き込むデモ
;                   (00～04のデータを読む)
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMO3W
;
	MOVLW	'('
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'A'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'T'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'2'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'4'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'C'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'X'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'X'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'['
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	'W'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	']'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
	MOVLW	')'
	MOVWF	IODAT
	CALL	SEND
	CALL	WATP001
;
;
;

	CALL	REC	
	MOVLW	H'00'
	MOVWF	ATEEPAD1
	MOVLW	H'00'
	MOVWF	ATEEPAD0
	MOVFW	IODAT
	CALL	WRT24EEP
	CALL	SEND


	CALL	REC	
	MOVLW	H'00'
	MOVWF	ATEEPAD1
	MOVLW	H'01'
	MOVWF	ATEEPAD0
	MOVFW	IODAT
	CALL	WRT24EEP
	CALL	SEND

	CALL	REC	
	MOVLW	H'00'
	MOVWF	ATEEPAD1
	MOVLW	H'02'
	MOVWF	ATEEPAD0
	MOVFW	IODAT
	CALL	WRT24EEP
	CALL	SEND

	CALL	REC	
	MOVLW	H'00'
	MOVWF	ATEEPAD1
	MOVLW	H'03'
	MOVWF	ATEEPAD0
	MOVFW	IODAT
	CALL	WRT24EEP
	CALL	SEND

	CALL	REC	
	MOVLW	H'00'
	MOVWF	ATEEPAD1
	MOVLW	H'04'
	MOVWF	ATEEPAD0
	MOVFW	IODAT
	CALL	WRT24EEP
	CALL	SEND
;
	RETURN

;*******************************************************************************************
;   関数名    : RED24EEP　　　　
;   機能      : AT24Cからデータを読み込む 
;   引数      : Input
;                  ATEEPAD1    アドレス2桁め
;		   ATEEPAD0    アドレス1桁め 
;             : Output : 
;                  ATEEPDAT,W  読込みデータ
;   変数      :
;   注意      :
;   補足
;     A1(O) : AT24C1024(SCL:Serial Clock Input)
;     A2(O) : AT24C1024(SDA:Serial Data)
;*******************************************************************************************
RED24EEP
; 1.Dummy Write
; (1)Start Condition
	CALL	I2CSTR
; (2)ヘッダー送信(1010,0000)
	MOVLW	B'10100000'
	CALL	I2CSEND
; (3)アドレス送信
;   上位アドレス送信
	BCF	ATEEPAD1,7	; 不定
;	BSF	ATEEPAD1,6	; MSBセット
	MOVFW	ATEEPAD1
	CALL	I2CSEND
;   下位アドレス送信
	MOVFW	ATEEPAD0
	CALL	I2CSEND
; 2.READ
; (1)Start Condition
	CALL	I2CSTR
; (2)ヘッダー送信(1010,0001)
	MOVLW	B'10100001'
	CALL	I2CSEND
; (3)読込み
	CALL	I2CRES

; (4)Stop Condition
	CALL	I2CSTP
	MOVFW	ATEEPDAT
	RETURN

;*******************************************************************************************
;   関数名    : WRT24EEP　　　　
;   機能      : AT24Cにデータを書き込む 
;   引数      : Input
;                  ATEEPAD1  アドレス2桁め
;		   ATEEPAD0  アドレス1桁め 
;                  W         書き込みデータ
;             : Output : なし
;   変数      :
;   注意      :
;   補足
;     A1(O) : AT24C1024(SCL:Serial Clock Input)
;     A2(O) : AT24C1024(SDA:Serial Data)
;*******************************************************************************************
WRT24EEP
	MOVWF	WRT24TMP
; (1)Start Condition
	CALL	I2CSTR
; (2)ヘッダー送信(1010,0000)
	MOVLW	B'10100000'
	CALL	I2CSEND
; (3)アドレス送信
;   上位アドレス送信
	BCF	ATEEPAD1,7	; 不定
;	BSF	ATEEPAD1,6	; MSBセット
	MOVFW	ATEEPAD1
	CALL	I2CSEND
;   下位アドレス送信
	MOVFW	ATEEPAD0
	CALL	I2CSEND
; (4)データ送信
	MOVFW	WRT24TMP
	CALL	I2CSEND
; (5)Stop Condition
	CALL	I2CSTP

	RETURN

;*******************************************************************************************
;   関数名    : I2CSTR　　　　
;   機能      : I2Cプロトコルでスタートコンディションを与える 
;   引数      : Input  : なし
;             : Output : なし
;   変数      :
;   注意      :
;   補足
;     A1(O) : AT24C1024(SCL:Serial Clock Input)
;     A2(O) : AT24C1024(SDA:Serial Data)
;*******************************************************************************************
I2CSTR
	BSF	GPIO,2		; SDA信号(1)
	BSF	GPIO,1		; SCL信号(1)
	CALL	WATP000001	; 0.6μS以上
	BCF	GPIO,2		; SDA信号(0)
	CALL	WATP000001	; 0.6μS以上
	BCF	GPIO,1		; SCL信号(0)
	CALL	WATP000001	; 0.6μS以上
	RETURN

;*******************************************************************************************
;   関数名    : I2CSTP　　　　
;   機能      : I2Cプロトコルでストップコンディションを与える 
;   引数      : Input  : なし
;             : Output : なし
;   変数      :
;   注意      :
;   補足
;     A1(O) : AT24C1024(SCL:Serial Clock Input)
;     A2(O) : AT24C1024(SDA:Serial Data)
;*******************************************************************************************
I2CSTP
	BCF	GPIO,1		; SCL信号(0)
	BCF	GPIO,2		; SDA信号(0)
	CALL	WATP000001	; 0.6μS以上
	BSF	GPIO,1		; SCL信号(1)
	BCF	GPIO,2		; SDA信号(0)
	CALL	WATP000001	; 0.6μS以上
	BSF	GPIO,2		; SDA信号(1)
	CALL	WATP000001	; 0.6μS以上
	RETURN

;*******************************************************************************************
;   関数名    : I2CRES　　　　
;   機能      : I2Cプロトコルで8ビットのデータをバスから受ける 
;   引数      : Input  : なし
;             : Output : W
;   変数      :
;   注意      :
;   補足
;     A1(O) : AT24C1024(SCL:Serial Clock Input)
;     A2(O) : AT24C1024(SDA:Serial Data)
;*******************************************************************************************
I2CRES
	BSF	STATUS,RP0	; BANK1を選択
	MOVLW	B'001100'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を選択

;1:8Bit受信
; 0)ループ変数設定
	MOVLW	H'08'
	MOVWF	I2CRSLP
I2CRES2
; 1)クロック設定(1)
	CALL	WATP000001
	BSF	GPIO,1
	CALL	WATP000001
; 2)データ設定
	BTFSS	GPIO,2		; 
	BCF	I2CRSTMP,0 	; 
	BTFSC	GPIO,2		; 
	BSF	I2CRSTMP,0 	;
; 3)クロック設定(0)
	BCF	GPIO,1
	MOVFW	I2CRSTMP	; 1回分の余計なシフトを補正
	MOVWF	ATEEPDAT	; 1回分の余計なシフトを補正
	RLF	I2CRSTMP,F
	DECFSZ	I2CRSLP,F
	GOTO	I2CRES2
;2:NoAct
	CALL	I2CCLOK
	CALL	WATP000001
;3:元に戻す
	BSF	STATUS,RP0	; BANK1を選択
	MOVLW	B'001000'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を選択
;4:結果を返す
	MOVFW	ATEEPDAT
	RETURN

;*******************************************************************************************
;   関数名    : I2CSEND　　　　
;   機能      : I2Cプロトコルで8ビットのデータを与える 
;   引数      : Input  :  W 書き込みデータ
;             : Output : なし
;   変数      :
;   注意      :
;   補足
;     A1(O) : AT24C1024(SCL:Serial Clock Input)
;     A2(O) : AT24C1024(SDA:Serial Data)
;*******************************************************************************************
I2CSEND
	MOVWF	I2CSDTMP
;1：8Bit送信
; 0)ループ変数設定
	MOVLW	H'08'
	MOVWF	I2CSDLP
I2CSEND2
; 1)データ設定
	BTFSS	I2CSDTMP,7	; 
	BCF	GPIO,2	 	; 
	BTFSC	I2CSDTMP,7	; 
	BSF	GPIO,2	 	;
; 2)クロック信号  
	CALL	I2CCLOK		;
; 3)ACTのリターンでデバイス衝突が起きないようにゼロにする 
	BCF	GPIO,2	 	;
; 4)シフト 
	RLF	I2CSDTMP,F
	DECFSZ	I2CSDLP,F
	GOTO	I2CSEND2
;(2)ACT検知
	CALL	I2CACT
	RETURN

;*******************************************************************************************
;   関数名    : I2CACT　　　
;   機能      : I2CプロトコルでACT信号を検知する
;   引数      : Input  : なし
;             : Output : なし
;   変数      :
;   注意      :
;   補足
;     A1(O) : AT24C1024(SCL:Serial Clock Input)
;     A2(O) : AT24C1024(SDA:Serial Data)
;*******************************************************************************************
I2CACT
	BSF	STATUS,RP0	; BANK1を選択
	MOVLW	B'001100'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を選択
	CALL	WATP000001	; 
	BSF	GPIO,1		; SCL信号(1)
	CALL	WATP000001	; 
I2CACT2
	BTFSC	GPIO,2		; 
	GOTO	I2CACT2		;
	BCF	GPIO,1		; SCL信号(0)
	CALL	WATP000001	; 
;
	BSF	STATUS,RP0	; BANK1を選択
	MOVLW	B'001000'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を選択
	RETURN
;*******************************************************************************************
;   関数名    : I2CCLOK　　　
;   機能      : I2Cプロトコルでクロックパルスを与える
;   引数      : Input  : なし
;             : Output : なし
;   変数      :
;   注意      :
;   補足
;     A1(O) : AT24C1024(SCL:Serial Clock Input)
;     A2(O) : AT24C1024(SDA:Serial Data)
;*******************************************************************************************
I2CCLOK
	BCF	GPIO,1		; SCL信号(0)
	CALL	WATP000001	; 1.3μS以上
	CALL	WATP000001	; 1.3μS以上
	BSF	GPIO,1		; SCL信号(1)
	CALL	WATP000001	; 0.6μS以上
	BCF	GPIO,1		; SCL信号(0)
	NOP			; Actのため時間を長くすると危険
	NOP			; Actのため時間を長くすると危険
	RETURN

;*******************************************************************************************
;   関数名    : REDEEP　　　　
;   機能      : PIC内部EEPからデータを読む 
;   引数      : Input  : W(アドレス:00-FF)
;             : Output : W(データ)
;   変数      :
;   注意      :
;*******************************************************************************************
REDEEP
	BSF	STATUS,RP0
	MOVWF	EEADR
	BSF	EECON1,RD
	MOVFW	EEDAT
	BCF	STATUS,RP0
	RETURN

;*******************************************************************************************
;   関数名    : WRTEEP　　　　
;   機能      : PIC内部EEPにデータを書き込む 
;   引数      : Input  : W(アドレス:00-FF)
;                        EEPWDAT(データ)
;             : Output : なし
;   変数      :
;   注意      :
;*******************************************************************************************
WRTEEP
	BSF	STATUS,RP0
	MOVWF	EEADR
	BCF	STATUS,RP0
	MOVFW	EEPWDAT
	BSF	STATUS,RP0
	MOVWF	EEDAT
;
	BSF	EECON1,WREN
	BCF	INTCON,GIE
	MOVLW	H'55'
	MOVWF	EECON2
	MOVLW	H'AA'
	MOVWF	EECON2
	BSF	EECON1,WR
	BSF	INTCON,GIE
	BCF	STATUS,RP0
	RETURN

;*******************************************************************************************
;   関数名    : WATP01　　　　
;   機能      : 0.01秒(10mS)タイマー 
;   引数      : なし 
;   変数      :
;   注意      : マクロでWATP001TMRを定義しておく
;*******************************************************************************************
WATP01
	MOVLW	H'0A'
	MOVWF	LPWATP01
WATP01A
	CALL	WATP001
	DECFSZ	LPWATP01,F
	GOTO	WATP01A
	RETLW	0

;*******************************************************************************************
;   関数名    : 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

;*******************************************************************************************
;   関数名    : WATP000001　　　　
;   機能      : 0.000001秒(1μ秒[1000n秒])タイマー 
;   引数      : なし 
;   変数      :
;   注意      : 内部8MHz用(4MHzで使うと2μ秒になる)
;*******************************************************************************************
WATP000001
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	RETLW	0

;******************************************************************************************
;   Function Name : REC
;   Disctiption   : ＲＳ２３２Ｃ受信サブルーチン(GPIO,3)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        :
;******************************************************************************************
; (0)変数初期化
	CLRF	IODAT
; (1)受信データを待つ
REC	BTFSC	GPIO,3
	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,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;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 : 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
