;******************************************************************************************
;  EEP-ROM(AT93C86)アクセスサンプル(ORG:8Bitで使用)
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H19.06.13
;   History      :
;   Description  :
;    1.ADRESS AND DATA
;        8Bit Data  => D0-D7, A0-A10
;       16Bit Data  => D0-D15,A0-A9 
;    2.GPIO I/O
;       GPIO(0);AT93C86(SK)
;       GPIO(1);AT93C86(DI)
;       GPIO(2);AT93C86(DO)
;       GPIO(3);RS232(RX)
;       GPIO(4);AT93C86(CS)
;       GPIO(5);RS232(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 
;
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
EEPADD0	EQU	29H
EEPADD1	EQU	2AH
EEPDAT	EQU	2BH
PLSHL	EQU	2CH
LPEEPRDR EQU	2DH
DUMPTMP EQU	2EH
DM0	EQU	2FH
DM1	EQU	30H


	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'00001100'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0	; BANK0を選択
; シリアル送信ポートの初期化
	BSF	GPIO,5
;
	CALL	DEMO1

	CALL	EEP93EWN
MAIN
	CALL	DEMOR
	CALL	DEMOW

	GOTO	MAIN


;******************************************************************************************
;   Function Name : DEMO1
;   Title         : PowerON デモ 
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMO1
	CALL	WATP001
	MOVLW	H'1B'
	MOVWF	MSGCNT
DEMO1A
	MOVFW	MSGCNT
	CALL	DEMO1TBL
	CALL	SEND
	CALL	WATP001
	DECFSZ	MSGCNT,F
	GOTO	DEMO1A
	RETURN
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 : DEMOR
;   Title         : EEPを5バイト読む
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMOR

	MOVLW	'-'
	CALL	SEND
	CALL	WATP001
	MOVLW	'R'
	CALL	SEND
	CALL	WATP001
	MOVLW	'-'
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	EEPADD1
	MOVLW	H'00'
	MOVWF	EEPADD0
	CALL	EEP93RDR
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	EEPADD1
	MOVLW	H'01'
	MOVWF	EEPADD0
	CALL	EEP93RDR
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	EEPADD1
	MOVLW	H'02'
	MOVWF	EEPADD0
	CALL	EEP93RDR
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	EEPADD1
	MOVLW	H'03'
	MOVWF	EEPADD0
	CALL	EEP93RDR
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	EEPADD1
	MOVLW	H'04'
	MOVWF	EEPADD0
	CALL	EEP93RDR
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	' '
	CALL	SEND
	CALL	WATP001

	RETURN

;******************************************************************************************
;   Function Name : DEMOW
;   Title         : EEPに5バイト書く
;   Input         : 
;   Output        : 
;******************************************************************************************
DEMOW

	MOVLW	'-'
	CALL	SEND
	CALL	WATP001
	MOVLW	'W'
	CALL	SEND
	CALL	WATP001
	MOVLW	'-'
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	EEPADD1
	MOVLW	H'00'
	MOVWF	EEPADD0
	CALL	REC
	MOVWF	IODAT
	CALL	EEP93WTR
	MOVFW	IODAT
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	EEPADD1
	MOVLW	H'01'
	MOVWF	EEPADD0
	CALL	REC
	MOVWF	IODAT
	CALL	EEP93WTR
	MOVFW	IODAT
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	EEPADD1
	MOVLW	H'02'
	MOVWF	EEPADD0
	CALL	REC
	MOVWF	IODAT
	CALL	EEP93WTR
	MOVFW	IODAT
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	EEPADD1
	MOVLW	H'03'
	MOVWF	EEPADD0
	CALL	REC
	MOVWF	IODAT
	CALL	EEP93WTR
	MOVFW	IODAT
	CALL	SEND
	CALL	WATP001
;
;
;
	MOVLW	H'00'
	MOVWF	EEPADD1
	MOVLW	H'04'
	MOVWF	EEPADD0
	CALL	REC
	MOVWF	IODAT
	CALL	EEP93WTR
	MOVFW	IODAT
	CALL	SEND
	CALL	WATP001
;
;
	MOVLW	' '
	CALL	SEND
	CALL	WATP001

	RETURN

;******************************************************************************************
;   Function Name : EEP93EWN
;   Title         : EWENコマンド(Writeする場合は、EWENコマンドによるモードの変更が必須)
;   Input         : 
;   Output        : 
;   Description   :
;       GPIO(0);AT93C86(SK)
;       GPIO(1);AT93C86(DI)
;       GPIO(2);AT93C86(DO)
;       GPIO(4);AT93C86(CS)
;******************************************************************************************
EEP93EWN
;  0.初期化
	CALL	INITPIO
;  1.EWENコマンド出力(10011)
;  (0)CS信号を出力
	BSF	GPIO,4		; CS(4)
;  (1)'1'を出力
	MOVLW	H'01'
	CALL	OUTPLS
;  (2)'0'を出力
	MOVLW	H'00'
	CALL	OUTPLS
;  (3)'0'を出力
	MOVLW	H'00'
	CALL	OUTPLS
;  (4)'1'を出力
	MOVLW	H'01'
	CALL	OUTPLS
;  (5)'1'を出力
	MOVLW	H'01'
	CALL	OUTPLS
;  (6)ダミー(8Bit-Wordの時は９クロック必要)
	MOVLW	H'09'
	MOVWF	LPEEPRDR
EEP93EWN1
	MOVLW	H'00'
	CALL	OUTPLS
	DECFSZ	LPEEPRDR,F
	GOTO	EEP93EWN1
;
;  2.完了処理
;    1)戻す
	BCF	GPIO,4		; CS(4)
;    2)待つ
	CALL	WATP1
;
	RETURN

;******************************************************************************************
;   Function Name : EEP93WTR
;   Title         : EEPにデータを書く
;   Input         : EEPADD1,EEPADD0,W-REG
;   Output        : 
;   Description   :
;       GPIO(0);AT93C86(SK)
;       GPIO(1);AT93C86(DI)
;       GPIO(2);AT93C86(DO)
;       GPIO(4);AT93C86(CS)
;******************************************************************************************
EEP93WTR
;  0.初期化
	MOVWF	EEPDAT
	CALL	INITPIO
;  1.WRITE-ヘッダー出力(101)
;  (0)CS信号を出力
	BSF	GPIO,4		; CS(4)
;  (1)'1'を出力
	MOVLW	H'01'
	CALL	OUTPLS
;  (2)'0'を出力
	MOVLW	H'00'
	CALL	OUTPLS
;  (3)'1'を出力
	MOVLW	H'01'
	CALL	OUTPLS
;  2.アドレス出力
;  (1)アドレス(A10-A8)を出力
	MOVLW	H'03'
	MOVWF	LPEEPRDR
EEP93WTR1
;    1)アドレス出力
	BTFSC	EEPADD1,2
	MOVLW	H'01'
	BTFSS	EEPADD1,2
	MOVLW	H'00'
;    2)出力
	CALL	OUTPLS
;    3)左シフト
	RLF	EEPADD1,F
	DECFSZ	LPEEPRDR,F
	GOTO	EEP93WTR1
;
;  (2)アドレス(A7-A0)を出力
	MOVLW	H'08'
	MOVWF	LPEEPRDR
EEP93WTR2
;    1)アドレス出力
	BTFSC	EEPADD0,7
	MOVLW	H'01'
	BTFSS	EEPADD0,7
	MOVLW	H'00'
;    2)出力
	CALL	OUTPLS
;    3)左シフト
	RLF	EEPADD0,F
	DECFSZ	LPEEPRDR,F
	GOTO	EEP93WTR2
;  3.データ出力
;  (2)データ(D7-D0)を出力
	MOVLW	H'08'
	MOVWF	LPEEPRDR
EEP93WTR3
;    1)データ出力
	BTFSC	EEPDAT,7
	MOVLW	H'01'
	BTFSS	EEPDAT,7
	MOVLW	H'00'
;    2)出力
	CALL	OUTPLS
;    3)左シフト
	RLF	EEPDAT,F
	DECFSZ	LPEEPRDR,F
	GOTO	EEP93WTR3
;
;  4.完了処理

;    1)DIビットを戻す
	BCF	GPIO,1		; DI(1)
	BCF	GPIO,4		; CS(4)
;    2)待つ
	CALL	TMD4PL
	CALL	TMD4PL
;    3)CS信号を送る
	BSF	GPIO,4		; CS(4)
;    4)Lを待つ
	BTFSC	GPIO,2
	GOTO	$-1
;    5)Hを待つ
	BTFSS	GPIO,2
	GOTO	$-1
;    6)10mS以上待つ(不要)
;	CALL	WATP1
;    7)終了 
	BCF	GPIO,4		; CS(4)
	CALL	TMD4PL
;
	RETURN

;******************************************************************************************
;   Function Name : EEP93RDR
;   Title         : EEPのデータを読む
;   Input         : EEPADD1,EEPADD0
;   Output        : W-REG,EEPDAT
;   Description   :
;       GPIO(0);AT93C86(SK)
;       GPIO(1);AT93C86(DI)
;       GPIO(2);AT93C86(DO)
;       GPIO(4);AT93C86(CS)
;******************************************************************************************
EEP93RDR
;  0.ポートの初期化
	CALL	INITPIO
;  1.READ-ヘッダー出力(110)
;  (0)CS信号を出力
	BSF	GPIO,4		; CS(4)
;  (1)'1'を出力
	MOVLW	H'01'
	CALL	OUTPLS
;  (2)'1'を出力
	MOVLW	H'01'
	CALL	OUTPLS
;  (3)'0'を出力
	MOVLW	H'00'
	CALL	OUTPLS
;  2.アドレス出力
;  (1)アドレス(A10-A8)を出力
	MOVLW	H'03'
	MOVWF	LPEEPRDR
EEP93RDR1
;    1)アドレス出力
	BTFSC	EEPADD1,2
	MOVLW	H'01'
	BTFSS	EEPADD1,2
	MOVLW	H'00'
;    2)出力
	CALL	OUTPLS
;    3)左シフト
	RLF	EEPADD1,F
	DECFSZ	LPEEPRDR,F
	GOTO	EEP93RDR1
;
;  (2)アドレス(A7-A0)を出力
	MOVLW	H'08'
	MOVWF	LPEEPRDR
EEP93RDR2
;    1)アドレス出力
	BTFSC	EEPADD0,7
	MOVLW	H'01'
	BTFSS	EEPADD0,7
	MOVLW	H'00'
;    2)出力
	CALL	OUTPLS
;    3)左シフト
	RLF	EEPADD0,F
	DECFSZ	LPEEPRDR,F
	GOTO	EEP93RDR2
;
;  3.データ読込み
;  (1)データ読込み
;    1)変数初期化
	CLRF	EEPDAT
;    2)データ読込み
	MOVLW	H'08'		; 
	MOVWF	LPEEPRDR
EEP93RDR3
;    3)データシフト
	RLF	EEPDAT,F
;    4)クロックパルス(H)
	CALL	TMD4PL		; 
	BSF	GPIO,0		; SK(0)
;    5)データ読む
	BTFSC	GPIO,2
	BSF	EEPDAT,0	; DO(2)
	BTFSS	GPIO,2
	BCF	EEPDAT,0	; DO(2)
;    6)クロックパルス(L)
	CALL	TMD4PL		; 
	BCF	GPIO,0		; SK(0)
;    7)待つ
	CALL	TMD4PL		; 
;
	DECFSZ	LPEEPRDR,F
	GOTO	EEP93RDR3
;  4.処理終了
;  (1)CS信号を戻す
	BCF	GPIO,4		; CS(4)
;  (2)W-REGへ代入
	MOVFW	EEPDAT
;
	RETURN

;******************************************************************************************
;   Function Name : OUTPLS
;   Title         : EEPに1パルスを出力する
;   Input         : W-REG
;   Output        : 
;******************************************************************************************
OUTPLS
; 0.引数を保存
	MOVWF	PLSHL
; 1.DIパルス出力
	BTFSC	PLSHL,0
	BSF	GPIO,1		; DI(1)
	BTFSS	PLSHL,0
	BCF	GPIO,1		; DI(1)
; 2.クロックパルスを出力
	CALL	TMD4PL		; 
	BSF	GPIO,0		; SK(0)
	CALL	TMD4PL		; 
	BCF	GPIO,0		; SK(0)
	CALL	TMD4PL		; 
	RETURN

;******************************************************************************************
;   Function Name : TMD4PL
;   Title         : 1/4 クロック待つ
;   Input         : 
;   Output        : 
;   Description   : >>250nS  ※OSC:8MHz用
;******************************************************************************************
TMD4PL
	NOP
	NOP
	RETURN

;******************************************************************************************
;   Function Name : INITPIO
;   Title         : ポートの初期化
;   Input         : 
;   Output        : 
;******************************************************************************************
INITPIO
	BCF	GPIO,0
	BCF	GPIO,1
	BCF	GPIO,4
	BSF	GPIO,5
	RETURN

;******************************************************************************************
;   Function Name : REC
;   Title         : ＲＳ２３２Ｃ受信サブルーチン(GPIO,3)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : 
;   Output        : W-Reg
;******************************************************************************************
REC
; (0)変数初期化
	CLRF	IODAT
; (1)受信データを待つ
REC0	BTFSC	GPIO,3
	GOTO	REC0
; (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
;
	MOVFW	IODAT
;
	RETURN

;******************************************************************************************
;   Function Name : SEND
;   Title         : ＲＳ２３２Ｃ送信サブルーチン(GPIO,5)
;                   9600BPS OSC;8.000MHz仕様
;   Input         : W-Reg
;   Output        :
;******************************************************************************************
SEND
	MOVWF	IODAT
; (1)送信開始
SEND0	
	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
;   Title         : タイマー(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



;*******************************************************************************************
;   関数名    : WATP1　　　　
;   機能      : 0.1秒(100mS)タイマー 
;   引数      : なし 
;   変数      :
;*******************************************************************************************
WATP1
	CALL	WATP01
	CALL	WATP01
	CALL	WATP01
	CALL	WATP01
	CALL	WATP01
	CALL	WATP01
	CALL	WATP01
	CALL	WATP01
	CALL	WATP01
	CALL	WATP01
	RETURN
;*******************************************************************************************
;   関数名    : WATP01　　　　
;   機能      : 0.01秒(10mS)タイマー 
;   引数      : なし 
;   変数      :
;*******************************************************************************************
WATP01
	CALL	WATP001
	CALL	WATP001
	CALL	WATP001
	CALL	WATP001
	CALL	WATP001
	CALL	WATP001
	CALL	WATP001
	CALL	WATP001
	CALL	WATP001
	CALL	WATP001
	RETURN
;*******************************************************************************************
;   関数名    : WATP001　　　　
;   機能      : 0.001秒(1mS)タイマー 
;   引数      : なし 
;   変数      :
;   注意      : 8/4MHz =(200)=> 10KHz =(10)=> 1KHz
;*******************************************************************************************
WATP001
	MOVLW	H'0A'
	MOVWF	CNT1
WATP001B
	MOVLW	H'43'
	MOVWF	CNT
WATP001A
	DECFSZ	CNT,F
	GOTO	WATP001A 
	DECFSZ	CNT1,F
	GOTO	WATP001B
	RETURN

	END

