EADDRL	REG	26H	;28C66的位址
EADDRH	REG	27H	;28C66的位址
EDATA	REG	28H	;28c66的傳送資料
DO	REG	P3.7	;28C66  DO腳
DI	REG	P3.6	;28C66  DI腳
SK	REG	P3.5	;28C66  SK腳
CS	REG	P3.4	;28C66  CS腳
MEN 	REG	P3.2
REC1	REG	20H
REC2	REG	21H
POS	REG	22H
TMP	REG	23H
TEMP	REG	24H
ONLINE	REG	25H.0
MOTS	REG	29H
AXNS	REG	2AH
AXNTIME	REG	2BH
DELTIM	REG	2CH
AXNSPD 	REG	2DH
TEMP1	REG	2EH
TEMP2	REG	2FH
P2S	REG	30H
EADH	REG	31H
EADL	REG	32H
TI	REG	SCON.1
RI	REG	SCON.0

;---------------------------------------
	ORG	00H
	JMP	MAIN
	ORG	23H
	JMP 	RECOP
MAIN:
	MOV	P0,#0
	MOV	P1,#0
	MOV	AXNSPD,#6
	MOV	AXNS,#50
	MOV	MOTS,#24
	CLR	ONLINE
	CALL	INITUART
	CALL	INITEEP
;	
	MOV	R0,#50H
	MOV	R1,#30H		;MOT POS START ADD
	MOV	R4,#24
LOOP:
	INC	R0
	INC	R1
	MOV	@R0,#90
	MOV	@R1,#90
	DJNZ	R4,LOOP

	MOV	IE,#10010000B	
	MOV	R3,#0
	CALL	READAXN
;-----------------------------------
START:
	JB	ONLINE,J0
	CALL	READAXN
	MOV	R4,AXNTIME
;
J0:	
	MOV	R1,#30H		;@30START
	MOV	R0,#50H

	MOV	R2,#24		;R2,馬達數
	INC	R2
;*****************************1 TO 8	
	MOV	A,#00000001B
LOP0:	
	DJNZ	R2,J2
	JMP	CHKTIM
J2:
	INC	R1
	INC	R0
	MOV	POS,@R0
	PUSH	A
;-----------R0-NOW POS R1-NEX POS----------------
CHKOUT1:
	CLR	C
	MOV	A,@R1
	SUBB	A,@R0

	JNC	IN1	;減速度值
	MOV	A,AXNSPD
	XCH	A,@R0
	CLR	C	;減完是否借位
	SUBB	A,@R0
	JC	EQQ1	
	MOV	@R0,A
	CLR	C	;是否減過頭
	MOV	A,@R1
	SUBB	A,@R0
	JNC	EQQ1
	JMP	EXT1
IN1:
	CJNE	A,#0,DE1
	JMP	EXT1
DE1:
	MOV	A,AXNSPD;加速度值
	ADD	A,@R0
	MOV	@R0,A
	CLR	C	;是否加過頭
	MOV	A,@R1
	SUBB	A,@R0
	JC	EQQ1
	JMP	EXT1
EQQ1:
	MOV	A,@R1
	MOV	@R0,A
EXT1:
MODOUT1:	
	MOV 	TMOD,#21H
	MOV	A,#9
	MOV	B,POS
	MUL	AB
	CPL	A
	MOV	TL0,A
	MOV	A,B
	INC	A
	INC	A
	CPL	A
	MOV	TH0,A

	POP	A
	MOV	P0,A
	SETB 	TR0
	JNB 	TF0,$
	MOV	P0,#0

	CLR 	TF0
	CLR 	TR0
;
	RL	A
	CJNE	A,#01H,LOP0
;****************************9 TO 16
	SETB	MEN
LOP1:	
	DJNZ	R2,J3
	JMP	CHKTIM
J3:
	INC	R1
	INC	R0
	MOV	POS,@R0
	PUSH	A
;-----------R0-NOW POS R1-NEX POS----------------
CHKOUT2:
	CLR	C
	MOV	A,@R1
	SUBB	A,@R0

	JNC	IN2	;減速度值
	MOV	A,AXNSPD
	XCH	A,@R0
	CLR	C	;減完是否借位
	SUBB	A,@R0
	JC	EQQ2	
	MOV	@R0,A
	CLR	C	;是否減過頭
	MOV	A,@R1
	SUBB	A,@R0
	JNC	EQQ2
	JMP	EXT2
IN2:
	CJNE	A,#0,DE2
	JMP	EXT2
DE2:
	MOV	A,AXNSPD;加速度值
	ADD	A,@R0
	MOV	@R0,A
	CLR	C	;是否加過頭
	MOV	A,@R1
	SUBB	A,@R0
	JC	EQQ2
	JMP	EXT2
EQQ2:
	MOV	A,@R1
	MOV	@R0,A
EXT2:


MODOUT2:	
	MOV 	TMOD,#21H
	MOV	A,#9
	MOV	B,POS
	MUL	AB
	CPL	A
	MOV	TL0,A
	MOV	A,B
	INC	A
	INC	A
	CPL	A
	MOV	TH0,A
	POP	A
	MOV	P1,A
	SETB 	TR0
	JNB 	TF0,$
	MOV	P1,#0

	CLR 	TF0
	CLR 	TR0
;
	RL	A
	CJNE	A,#01H,LOP1
;****************************17 TO 24
	CLR	MEN
LOP2:	
	DJNZ	R2,J4
	JMP	CHKTIM
J4:
	INC	R1
	INC	R0
	MOV	POS,@R0
	PUSH	A
;-----------R0-NOW POS R1-NEX POS----------------
CHKOUT3:
	CLR	C
	MOV	A,@R1
	SUBB	A,@R0

	JNC	IN3	;減速度值
	MOV	A,AXNSPD
	XCH	A,@R0
	CLR	C	;減完是否借位
	SUBB	A,@R0
	JC	EQQ3	
	MOV	@R0,A
	CLR	C	;是否減過頭
	MOV	A,@R1
	SUBB	A,@R0
	JNC	EQQ3
	JMP	EXT3
IN3:
	CJNE	A,#0,DE3
	JMP	EXT3
DE3:
	MOV	A,AXNSPD;加速度值
	ADD	A,@R0
	MOV	@R0,A
	CLR	C	;是否加過頭
	MOV	A,@R1
	SUBB	A,@R0
	JC	EQQ3
	JMP	EXT3
EQQ3:
	MOV	A,@R1
	MOV	@R0,A
EXT3:

MODOUT3:	
	MOV 	TMOD,#21H
	MOV	A,#9
	MOV	B,POS
	MUL	AB
	CPL	A
	MOV	TL0,A
	MOV	A,B
	INC	A
	INC	A
	CPL	A
	MOV	TH0,A
	POP	A
	MOV	P1,A
	SETB 	TR0
	JNB 	TF0,$
	MOV	P1,#0

	CLR 	TF0
	CLR 	TR0
	RL	A
	CJNE	A,#01H,LOP2
CHKTIM:
	DJNZ	R4,JJ0
	JMP	START
JJ0:	JMP	J0
;---------------------------
READAXN:
	PUSH	A
	CJNE	R3,#0,RJ2	;資料計數結束

	MOV	EADDRL,#255	
	MOV	EADDRH,#1
	CALL	READBYTE
	MOV	MOTS,EDATA	;讀取馬達數
;
	MOV	EADDRL,#0
	MOV	EADDRH,#0
	CALL	READBYTE
	CALL	READBYTE
	MOV	EADL,#0
	MOV	EADH,#0
	MOV	TEMP1,#0
	MOV	TEMP2,#0
	MOV	R3,EDATA
	MOV	AXNS,R3
LOT:
	MOV	A,EDATA		;A=動作數
	MOV	B,MOTS
	INC	B
	INC	B		;B=資料寬度
	MUL	AB		
	ADD	A,TEMP1
	MOV	TEMP1,A
	MOV	A,B
	ADDC	A,TEMP2
	MOV	TEMP2,A
;
	CALL	READBYTE	;讀索引
	MOV	A,EDATA
	CJNE	A,#FEH,RJ0	;收到FE值
	JMP	RJ
RJ0:
	MOV	TEMP,EDATA
;
	CALL	READBYTE	;讀動作數
	MOV	A,P2
	CPL	A
	CJNE	A,TEMP,LOT	;索引等於P2
	MOV	R3,EDATA	;儲存索引對應動作數
	MOV	AXNS,R3
	MOV	EADL,TEMP1	;儲存位址差
	MOV	EADH,TEMP2
	JMP	LOT
RJ:		
	MOV	A,EADDRL
	ADD	A,EADL
	MOV	EADDRL,A
	MOV	A,EADDRH
	ADDC	A,EADH
	MOV	EADDRH,A
	
RJ2:
	CALL	READBYTE	;讀速度
	MOV	AXNSPD,EDATA
	CALL	READBYTE	;讀時間
	MOV	AXNTIME,EDATA

	MOV	R1,MOTS		;讀馬達位置
	MOV	R0,#30H
RLO:	INC	R0
	CALL	READBYTE
	MOV	@R0,EDATA
	DJNZ	R1,RLO

	DEC	R3		;資料計數-1
	POP	A
	RET
;--------------------------
RECOP:
	MOV	IE,#00000000B
	PUSH	A
	MOV	TMP,R1
;	
	CALL	UARTIN

	CJNE	A,#FFH,OUT2	;設定
	CALL	UARTIN

	CJNE	A,#55,OUT0	;下載
	JNB	ONLINE,OUTT
	CALL 	DOWNLOAD
	JMP	OUTT
OUT0:
	CJNE	A,#35,OUT1	;連線
	MOV	AXNSPD,#6
	MOV	AXNTIME,#10
	MOV	MOTS,#24
	SETB	ONLINE

	MOV	A,#"O"
	CALL	UARTOUT
	MOV	A,#"N"
	CALL	UARTOUT
	JMP	OUTT
OUT1:
	CJNE	A,#42,OUT2	;離線
	JNB	ONLINE,OUTT
	CLR	ONLINE
	MOV	R3,#0
	CALL	READAXN
	MOV	A,#"O"
	CALL	UARTOUT
	MOV	A,#"F"
	CALL	UARTOUT
	MOV	A,#"F"
	CALL	UARTOUT
	JMP	OUTT
OUT2:
	CJNE	A,#30,OUT3	;馬達數
	JNB	ONLINE,OUTT
	CALL	UARTIN
	MOV	MOTS,A
	JMP	OUTT
OUT3:
	CJNE	A,#50,OUT4	;速度
	JNB	ONLINE,OUTT
	CALL	UARTIN
	MOV	AXNSPD,A
	JMP	OUTT
OUT4:
	JNB	ONLINE,OUTT
	ADD	A,#30H
	MOV	R1,A
	CALL	UARTIN
	MOV	@R1,A

OUTT:
	MOV	R1,TMP
	POP	A
	MOV	IE,#10010000B
	RETI
;------------DOWNLOAD DATA----------
DOWNLOAD:
	MOV	EADDRL,#255
	MOV	EADDRH,#1
	CALL	UARTIN
	MOV	EDATA,A
	CALL	WRITEBYTE

	MOV	EADDRL,#0
	MOV	EADDRH,#0

DLOOP:	CALL	UARTIN
	CJNE	A,#FFH,OOP
	RET

OOP:	MOV	EDATA,A
	CALL	WRITEBYTE
	JMP	DLOOP
	RET
;***************串列訊號相關***************
;---------------初始化--------------------
INITUART:
	MOV 	SCON,#01010000B
	MOV	TMOD,#00100001B
	MOV	TH1,#253
	SETB	TR1
	RET
;--------------A=INDATA-------------------
UARTIN:
	JNB	RI,$
	MOV	A,SBUF
	CLR	RI
	RET
;--------------A=OUTDATA-------------------
UARTOUT:
	MOV	SBUF,A
	JNB	TI,$
	CLR	TI
	RET
;***************EEPROM相關***************
;--------------初始化--------------
INITEEP:
	CLR	CS
	SETB	SK
	CLR	DI
	SETB	DO
	CALL	EWEN
	RET
;--------------產生SK脈波-----------
CLOCK:
	CLR	SK
	SETB	SK
	RET
;---------檢查資料是否已寫入---------
CHK_EBUSY:
	CLR	CS
	SETB	CS
BUSY:	JNB	DO,BUSY
	CLR	CS
	RET
;--------------寫入位址--------------
WR_ADDR:
	MOV	A,EADDRH
	RRC	A
	MOV 	DI,C
	CALL	CLOCK
	MOV	A,EADDRL
	MOV	B,#08
WRADDR:
	RLC	A
	MOV	DI,C
	CALL	CLOCK
	DJNZ	B,WRADDR
	CLR	DI
	RET
;--------------寫入資料---------------
WR_EDATA:
	MOV	B,#08
WREDATA:
	RLC	A
	MOV	DI,C
	CALL	CLOCK
	DJNZ	B,WREDATA
	CLR	DI
	RET

;--------------接收資料--------------- A=接收的資料 
RD_DATA:
	MOV	B,#08
RDDATA:
	CALL	CLOCK
	MOV	C,DO
	RLC	A
	DJNZ	B,RDDATA
	RET
;--------------設定CS及DI=1------------
SET11:
	SETB	CS
	SETB	DI
	CALL	CLOCK
	RET
;--------------設定讀取模式-------------
SET_READ:
	MOV	A,#80H
	MOV	B,#02
SRD:
	RLC 	A
	MOV	DI,C
	CALL	CLOCK
	DJNZ	B,SRD
	RET
;--------------設定寫入模式--------------
SET_WRITE:
	MOV	A,#40H
	MOV	B,#02
SWR:
	RLC 	A
	MOV	DI,C
	CALL	CLOCK
	DJNZ	B,SWR
	RET
;--------------設定其他模式---------------
SET_ELSE:
	MOV	A,#00H
	MOV	B,#02H
SETELSE:
	RLC	A
	MOV	DI,C
	CALL	CLOCK
	DJNZ	B,SETELSE
	RET
;--------讀取EADDR位址的資料存於EDATA------
READBYTE:
	PUSH	B
	PUSH	A
;
	CALL	SET11
	CALL	SET_READ
	CALL	WR_ADDR
	CALL	RD_DATA
	MOV	EDATA,A
	CLR	CS
;
	INC	EADDRL
	MOV	A,EADDRL
	CJNE	A,#0,RJAM
	INC	EADDRH
RJAM:
;
	POP	A
	POP 	B
	RET

;------------將EDATA存於EADDR位址----------
WRITEBYTE:
	PUSH	B
	PUSH	A

	CALL	SET11
	CALL	SET_WRITE
	CALL	WR_ADDR
	MOV	A,EDATA
	CALL	WR_EDATA
	CALL	CHK_EBUSY
;
	INC	EADDRL
	MOV	A,EADDRL
	CJNE	A,#0,WJ
	INC	EADDRH
WJ:
;
	POP	A
	POP	B
	RET
;--------------讀寫致能----------------------
EWEN:
	PUSH	B
	PUSH	A
	PUSH	EADDRL
	PUSH	EADDRH
	CALL	SET11
	CALL	SET_ELSE
	MOV	EADDRL,#80H
	MOV	EADDRH,#01H
	CALL	WR_ADDR
	CLR	CS
	POP 	EADDRH
	POP	EADDRL
	POP 	A
	POP 	B
	RET
;-----------------------------------------
	END