ORG 	0000H
LJMP 	MAIN
ORG 	0003H
LJMP 	CANINT0					
ORG 	000BH
LJMP	T0-INTERRUPT
ORG 	0100H
MAIN:
MOV 	R0,#07FH
CLR 	A
MOV	@R0,A
DJNZ 	R0,$_1
MOV	@R0,A
MOV 	SP,#60H						
LCALL 	SJA1000_INIT0					
LCALL 	DISPLAY_INIT					
LCALL 	T0INIT						
SETB 	PX0							
SETB 	IT0							
SETB 	EX0							
SETB 	ET0 
SETB 	TR0							
SETB 	EA							
LOOPER:
JNB 	RCV_GOOD,LOOPER2				
CLR 	RCV_GOOD					
LCALL 	RCVDATA PRG					
LOOPER2:
JNB 	SEC_FLAG,LOOPER3
CLR 	SEC_FLAG 
LCALL 	SENDDATA_PRG				
LOOPER3:
JNB 	ERR_FLAG,LOOPER4
CLR 	ERR_FLAG
LCALL 	ERR_PRG						
LOOPER4:
JNB 		OVER_FLAG,LOOPER5			
CLR 	OVER_FLAG
LCALL 	DOVER_PRG					
LOOPER5: 
JNB 		DS_ENDLFLAG,LOOPER6			
CLR 	DS_END_FLAG
LCALL 	DSEND_PRG
LOOPER6:
JNB 		WUL FLAG,LOOPER7			
CLR 	WUL FLAG
LCALL 	WOKE_PRG					
LOOPER7:
AJMP 	LOOPER
SJA1000_INIT0: 						
LCALL 	CAN_CREATE_COMMUNATION
MOV 	R7,#12						
LCALL 	CAN_SET_BANDRATE			
MOV 	R7,#0A8H						
MOV 	R6,#0ffH						
LCALL 	CAN_SET_OBJECT
MOV 	R7,#0AAH						
MOV 	R6,#048H 
LCALL 	CAN_SET_OUTCLK 			
LCALL 	CAN_QUIT_RETMODEL			
MOV 	DPTR,# REG_CONTROL
MOV 	A,#01EH						
MOVX 	@DPTR,A
CLR 	F0
RET
ERR_PRG:
LCALL 	CAN_ENTER_RETMODEL		
LCALL 	SJA1000_INIT0					
MOV	ERROR_STATUS,#0FCH			
LCALL 	DISP_ERROR					
RET
DSENDLPRG:
LCALL 	DISP_OK						
RET 
RCVDATA_PRG:
MOV 	R0,#RCV_DATA_BUF1
LCALL 	CAN_DATA_RECEIVE			
MOV 	R7,#04H
LCALL 	CAN_CMD_PRG
RET
SENDDATA_PRG:
MOV 	R0,#SEND_DATA_BUFl
MOV	@R0,#0AFH
INC 		R0							
MOV	@R0,#08H
MOV 	A,TEST_DATA
INC 		R0							 
MOV 	@R0,A
MOV 	R0,#SEND_DATA_BUFl
LCALL 	CAN_DATA_WRITE
MOV 	R7,#01
LCALL 	CAN_CMD_PRG
RET
TO_INIT:
MOV 	A,TMOD						
ANL 	A,#0F0H
ORL 	A,#'01H
MOV 	TMOD,A						
MOV 	TH0,#0FCH
MOV 	TL0,#066H
MOV 	3AH,# 00H
RET
CAN_INT0:							
PUSH 	DPH							
PUSH 	DPL
PUSH 	PSW							
PUSH 	ACC
MOV 	DPTR,#REG INTERRUPT			
MOVX 	A,@DPTR
MOV 	SAVE_INT_INFO,A				
JNB 		ACC.0,CAN_INTl				
SETB	RCV_GOOD					
CAN_INT1: 							
MOV 	A,SAVE_INT_INFO
JNB 		ACC.2,CAN INT2				
SETB 	ERR_FLAG
CAN_INT2:
POP 		ACC
POP 		PSW
POP 		DPL
POP 		DPH
RETI
TO_INTERRUPT:
PUSH 	DPH							
PUSH	DPL
PUSH 	PSW							
PUSH 	ACC
MOV 	TH0,#80H
MOV 	TL0,#26H
LCALL 	DISPLAY
INC 		3AH						
MOV 	A,3AH
CJNE 	A,#40H,TO_QUIT				
MOV 	3AH,#00H
SETB 	SEC_FLAG
INC		TEST_DATA					
TO_QUIT:
POP 		ACC							
POP 		PSW
POP 		DPL
POP 		DPH
RETI
DISP_ERROR:
MOV 	R0,#DISPLAYBUFO+1			
MOV	@R0,#0EH
MOV 	R0,#DISPLAYBUFO+2
MOV	@R0,#l0H
INC 		R0							
MOV 	A,ERROR_STATUS
ANL 	A,#0F0H
SWAP 	A
MOV	@R0,A
INC 		R0
MOV 	A,ERROR_STATUS
ANL 	A,# 0FH
MOV	@R0,A
RET
DISP_OK: 								
MOV 	R0,#DISPLAYBUFO+1
MOV	@R0,#11H
MOV 	R0,#DISPLAYBUFO+2
MOV	R0,#l0H
MOV 	R0,#DISPLAYBUFO+3
MOV 	A,RCV_DATA_BUF3
ANL 	A,#0F0H							
SWAP 	A
MOV	@R0,A
INC 		R0
MOV 	A,RCV_DATA_BUF3
ANL 	A,#0FH
MOV	@R0,A
RET_
$INCLUDE(SJA_CANFunc. ASM) 			
$include( display_s. inc)
END
CAN_CREATE_COMMUNATION:
MOV 	DPTR,#REG_TEST					
MOVX 	A,.DPTR
MOV 	A,#0AAH							
MOVX	@DPTR,A
SETB 	F0
MOVX 	A,.DPTR
CJNE 	A,#OAAH,CAN_CM_QUIT				
MOV 	A,#055H						
MOVX 	@DPTR,A
MOVX 	A,@DPTR
CJNE 	A,#055H,CAN_CM_QUIT				
CLR 	A
MOVX	@DPTR,A
CLR 	F0
CAN_CM_QUIT:
RET
CAN_ENTER_RETMODEL:				
MOV 	DPTR,#REG_CONTROL				
MOVX 	A,@DPTR
ORL 	A,#01H							
MOVX	@DPTR,A 
CLR 	DWF0
MOVX 	DWA,@DPTR						
JB 		ACC.0,CAN_ER_QUIT
SETB 	F0
CAN_ER_QUIT:
RET
CAN-QUIT-RETMODEL:
MOV	DPTR,#REG_CONTROL				
MOVX 	A,@DPTR
ANL 	A,#OFEH							
MOVX	@DPTR,A 
CLR 	F0
MOVX 	A,@DPTR
JNB 		ACC. 0,CAN_QR_QUIT				
SETB 	F0
CAN_QR_QUIT:
RET
CAN_SET_BANDRATE: 						
MOV 	A,R7
CLR 	CY
SUBB 	A,#13
SETB 	F0
JNC 		CAN_SETBR_QUIT					
CLR 	F0 
MOV 	A,R7
RL 		A
MOV 	DPTR,#CAN SETBR					
MOVC 	A,@A+DPTR 
MOV 	R5,A								
MOV 	A,R7								
RL 		A
INC 		A
MOVC 	A,@A+DPTR
MOV 	R6,A								
MOV 	DPTR,# REGLBTR0					
MOV 	A,R5								
MOVX .	DPTR,A
SETB 	F0
MOVX 	A,QDPTR
XRL 	A,R5
JNZ 		CAN_SETBR_QUIT					
INC 		DPTR
MOV 	A,R6
MOVX 	@DPTR,A
MOVX 	A,@DPTR
XRL 	A,R6							
JNZ 		CAN_SETBR_QUIT
CLR 	F0
CAN_SETBR_QUIT:
RET
CAN_SETBR:
DB 	0EFH,0FFH							
DB 	0D7H,0FFH							
DB 	0CBH,0FFH							
DB 	0C5H,0FFH							
DB 	0C9H,0A9H							
DB 	0C2H,0FFH							
DB 	84H,0A7H								
DB 	82H,025H								
DB 	01H,045H								
DB	01H,025H								
DB	01H,012H								
DB 	00H,025H								
DB 	00H,012H								
CAN_SET_OBJECT:
MOV 	DPTR,#REG_ACR					
MOV 	A, R7 
MOVX 	@DPTR,A
MOVX 	A,@DPTR
SETB 	F0
XRL 	A,R7								
JNZ 		CAN_SETO_QUIT
CLR 	F0
INC 		DPTR							
MOV 	A,R6
MOVX 	@DPTR,A
MOVX 	A,DPTR
SETB 	F0
XRL 	A,R6								
JNZ 		CAN_SETO_QUIT
CLR 	F0
CAN_SETO_QUIT:
RET
CAN_SET_OUTCLK:
MOV 	DPTR,#REG_OCR					
MOV 	A,R7
MOVX 	@DPTR,A
MOVX 	A,@ DPTR						
SETB 	F0
XRL 	A,R7
JNZ 	CAN_SETOQ_QUIT
CLR		F0
MOV 	DPTR,#REG CDR				
MOV 	A,R6
MOVX 	@DPTR,A
MOV 	B,A
MOVX 	A,@ DPTR
SETB 	F0
XRL 	A,R6								
JNZ 		CAN_SETOC_QUIT
CLR 	F0
CAN_SETOC_QUIT
RET
CAN 	DATA WRITE:
MOV 	DPTR,# REG_STATUS
MOVX 	A,@DPTR
SETB 	F0
JNB 		ACC.3,CAN_DW_QUIT
CLR 	F0
MOVX 	A,@DPTR
SETB 	F0
JNB 		ACC.2,CAN_DW_QUIT
CLR 	F0
INC 		R0
MOV 	A, R0
DEC 	R0
MOV 	DPTR,#REG_TxBufferl
JB 		ACC.4, CAN_WYB
ANL 	A,#0FH							
ADD 	A,#02H							
MOV 	R7,A
AJMP 	CAN_WRTXBUF
CAN_WYB:
MOV	 R7,#02							
CAN_WRTXBUF:
MOV 	A,R0								
MOVX .	DPTR,A
SETB 	F0
MOVX 	A,@DPTR							
XRL 	A,.R0 
JNZ 		CAN_DW_QUIT					
CLR 	F0								
INC 		R0 
INC 		DPTR
DJNZ 	R7,CAN_WRTXBUF					
CAN_DW_QUIT:
RET
CAN_DATA_RECEIVE:
MOV 	DPTR,井REG_STATUS				
MOVX 	A,@DPTR							
SETB 	F0
JNB 		ACC.0,CAN_DR_QUIT
CLR 	F0
MOV 	DPTR,#REG_RxBuffer2
MOVX 	A,@DPTR
MOV 	DPTR,#REG RxBufferl
JB 		ACC. 4,CAN_RCVYB
ANL 	A,#0FH							
ADD 	A,# 02H							
MOV 	R7,A
AJMP 	CAN_RCVDATA
CAN_RCVYB:
MOV 	R7,#02							
CAN_RCVDATA:							
MOVX 	A,.DPTR
MOV	@R0,A
INC 		DPTR
INC 		R0
DJNZ 	R7,CAN RCVDATA
CAN_DR_QUIT:
RET
CAN_CMD_PRG:
MOV 	A,R7
CJNE 	A,#01,CAN_CMDl					
MOV 	DPTR,#REG COMMAND				
MOVX 	@DPTR,A							
CLR 	F0
RET
CAN_CMDl:
CJNE 	A,#02,CAN_CMD2
MOV 	DPTR,#REG STATUS					
MOVX 	A,@DPTR							
SETB 	F0
JB 		ACC.5,CAN_CMDLQUIT
CLR 	F0
CAN_CMD_QUIT:
RET
CAN_CMD2:
CJNE	#04,CAN CMD3						
MOV 	DPTR,# REG_COMMAND				
MOVX 	@DPTR,A							
NOP
NOP
MOV 	DPTR,#REG STATUS					
MOVX 	A,.DPTR
SETB 	F0
JB 		ACC.0,CAN_DB_QUIT
CLR 	F0
CAN_DB_QUIT:
RET
CAN_CMD3:
CJNE 	A,#08,CAN_CMD4					
MOV 	DPTR,# REG_COMMAND				
MOVX 	@DPTR,A							
NOP
NOP
MOV 	DPTR,#REG_STATUS				
MOVX 	A,@DPTR
SETB 	F0
JB 		ACC.1,CAN_DOVER_QUIT
CLR 	F0
CAN_DOVER_QUIT:
RET
SCAN CMD4:
CJNE 	A,#10H,CAN_CMD5					
MOV 	DPTR,#REG_COMMAND				
MOVX	@DPTR,A							
CLR 	F0
CAN 	CMD5:
RET



