⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 936isp_4800_7.3728m.asm

📁 p89lpc936 isp程序
💻 ASM
字号:
;************************************************
;	P89LPC922 ISP PROGRAM
;	VER:02/02
;	CODE ADDRESS: 1E00H~1FFFH
;	BOOT VECTOR: 1FH
;************************************************
$SET( AUTOBAUD = 0)
;************************************************
F1		BIT 	PSW.1

BRGCON	DATA	0BDH
BRGR0	DATA	0BEH
BRGR1	DATA	0BFH
P1M1	DATA	091H
P1M2	DATA	092H

addr_l		DATA	30H
addr_h		DATA	31H
data_n		DATA	33H
comm_type	DATA	34H
temp		DATA	35H

DATA_BUF	EQU	80H
PGM_MTP		EQU	0FF03H

;T_BPS = 256 - Fosc/16/2/BAUDRATE
T_BPS		EQU	0E6H			;4800BPS@4MHz
;T_BPS		EQU	0D0H			;4800BPS@7.3728MHz
;T_BPS		EQU	0FAH			;38400BPS@7.3728MHz
;************************************************
		ORG	3E00H
		
SOFT_RST:	ORL	0A2H,#08H		;SOFT RESET
;************************************************
$if 1
$if AUTOBAUD 
ISP_START:	ACALL	WDG_INIT	
            	MOV 	91H,#00H		;P1M1=91H
           	MOV	92H,#00H		;P1M2=92H
              	MOV	P1,#0FFH
              	MOV	TMOD,#10H
              	ANL	8FH,#0EFH		;TAMOD=8FH,TIMER1 MODE1
              	MOV	PCON,#80H
              	CLR	A
              	MOV	TH1,A
              	MOV	TL1,A
              
RXD_HIGH:     	ACALL	WDG_RST			
              	JNB   	P1.1,RXD_HIGH		;RXD=P1.1
RXD_LOW:      	ACALL 	WDG_RST
              	JB    	P1.1,RXD_LOW		;Waiting receive start, receive 'U'
              	SETB  	TR1
              	JNB   	P1.1,$			;Waiting one bit(bit 0) finish
              	CLR   	TR1		
              	
              	ACALL 	WDG_RST
              	MOV   	comm_type,TH1		;ATUOBAUD
              	MOV   	R1,#comm_type		
              	MOV   	A,TL1
              	XCHD  	A,@R1		
              	SWAP  	A			;(TH1*256+TL1)/16
              	
              	CPL   	A
              	INC   	A			;(0FFH-N)+1=256-N
$else 
ISP_START:	ACALL	WDG_INIT	
            	MOV 	91H,#00H		;P1M1=91H
           	MOV	92H,#00H		;P1M2=92H
              	MOV	P1,#0FFH
              	ANL	8FH,#0EFH		;TAMOD=8FH,TIMER1 MODE1
              	MOV	PCON,#80H
		MOV	A,#T_BPS
$endif 
              	MOV   	TL1,A			;TIMER VALUE=256 - ONE_BIT_TIME/16
              	MOV   	TH1,A
              	MOV   	TMOD,#20H	
              	SETB  	TR1
              	MOV   	SCON,#52H		;UART MODE1,ENABLE REN,SETB TI
$endif
;************************************************                   
WAIT_55H:    	ACALL	HAND_ASC	
              	CJNE  	A,#55H,WAIT_55H		;Waiting receive 'U'
WAIT_3AH:     	MOV   	R5,#00H			;R5=CHECK SUM
              	ACALL 	HAND_ASC
              	CJNE  	A,#3AH,WAIT_3AH		;Waiting receive ':'
              
              	ACALL 	GET_DATA
              	MOV   	data_n,temp		;RECEIVE DATA NUMBER
              	ACALL 	GET_DATA
              	MOV   	addr_h,temp		;RECEIVE HIGH 8 BIT ADDRESS
              	ACALL 	GET_DATA
              	MOV   	addr_l,temp		;RECEIVE LOW 8 BIT ADDRESS
              	ACALL 	GET_DATA
              	MOV   	comm_type,temp		;RECEIVE COMMAND TYPE
              
              	MOV   	A,data_n		;DATA NUMBER=0,RET
              	MOV   	R2,A
              	JZ    	RECV_END
              
              	MOV   	R1,#DATA_BUF		;DATA BUFFERS ADDRESS
RECV_LOOP:    	ACALL 	GET_DATA
              	MOV   	@R1,temp
              	INC   	R1
              	DJNZ  	R2,RECV_LOOP
              
RECV_END:     	MOV   	A,R5			;CHECK SUM COMPARE
              	MOV   	R4,A
              	ACALL 	GET_DATA
              	MOV   	A,R4
              	CJNE  	A,temp,RECV_ERR
              	AJMP  	ISP_COMMAND
              
RECV_ERR:     	MOV   	A,#58H			;SEND ERROR DATA 'X'
              	AJMP  	WRITE_OK1		;SEND 'X'&'ENTER',GOTO "WAIT_3AH"
;************************************************                   
GET_DATA:     	ACALL 	HAND_ASC		;RECEIVE ONE BYTE DATA
              	ACALL 	ASC_HEX
              	SWAP  	A
              	MOV   	temp,A
              	ACALL 	HAND_ASC
              	ACALL 	ASC_HEX
              	ORL   	temp,A
              	
              	MOV   	A,R5			;CHECK_SUM = CHECK_SUM - TEMP
              	CLR   	C
              	SUBB  	A,temp
              	MOV   	R5,A
              	RET
;************************************************
SEND_ASC:     	ACALL 	WDG_RST
              	JNB   	TI,SEND_ASC
              	CLR   	TI
              	MOV   	SBUF,A
              	RET
;************************************************
RECV_ASC:     	ACALL	WDG_RST
              	JNB   	RI,RECV_ASC
              	CLR   	RI
              	MOV   	A,SBUF
              	RET
;************************************************
HAND_ASC:     	ACALL 	RECV_ASC
              	ACALL 	SEND_ASC
              	JNB   	ACC.6,HAND_RET		;'A~Z':41H~5AH,'a~z':61H~7AH
              	CLR   	ACC.5			;a->A
HAND_RET:     	RET
;************************************************
ASC_HEX:      	JNB   	ACC.6,ASC_HEX1		;30H~39H -> N&0x0F: 0~9
              	ADD   	A,#09H			;41H~46H -> (N+9)&0x0F: A~F
ASC_HEX1:     	ANL   	A,#0FH
              	RET
;************************************************
HEX_ASC:      	ANL   	A,#0FH			
              	CLR   	C
              	SUBB  	A,#0AH			;N-10 -> C=0:A~F,C=1:0~9
              	JNC   	HEX_ASC1		
              	ADD   	A,#3AH			;0~9:30H~39H
              	RET

HEX_ASC1:     	ADD   	A,#41H			;A~F:41H~46H
              	RET
;************************************************
ISP_COMMAND:  	MOV   	A,comm_type
              	RL    	A
              	MOV   	DPTR,#COMMAND_TAB	;0ECFH/1ECFH
              	JMP   	@A+DPTR
              
COMMAND_TAB:  	AJMP  	WRITE_FLASH		;00
              	AJMP  	READ_IAP_ID		;01
              	AJMP  	WRITE_CFG		;02
              	AJMP  	READ_CFG		;03
              	AJMP  	ERASE_FLASH		;04
              	AJMP  	READ_SECTOR_CRC		;05
              	AJMP  	READ_GOLBER_CRC		;06
              	AJMP  	SET_BAUD		;07
              	AJMP  	SOFT_RST		;08
              	AJMP  	READ_USER_ID		;09
;************************************************                   
WDG_INIT:     	MOV   	0C1H,#0FFH		;WATCHDOG SET
              	ORL  	0A7H,#0E0H		
WDG_RST:      	MOV   	0C2H,#0A5H		
              	MOV   	0C3H,#5AH
              	RET
;************************************************
READ_IAP_ID:  	MOV   	A,#02H			;ISP_ID = 02
              	ACALL 	SEND_HEX
              	MOV   	A,#01H
              	LCALL 	PGM_MTP
              	MOV   	A,R7
              	ACALL 	SEND_HEX
              	AJMP  	WRITE_0K
              	NOP
              	NOP
;************************************************                  
		ORG	3F00H
    	
              	AJMP	ISP_START
;************************************************                   
WRITE_ERR:    	MOV   	A,#52H			;SEND 'R'
              	ACALL 	SEND_ASC
              	MOV   	A,R7
              	ACALL 	SEND_HEX		;SEND ERROR DATA
              	AJMP  	OP_END
;************************************************                   
WRITE_FLASH:  	MOV   	R3,data_n
              	MOV   	A,R3
              	JZ    	WRITE_0K
              
              	MOV   	R5,addr_l
              	MOV   	R4,addr_h
              	MOV   	R7,#DATA_BUF
              	MOV   	A,#00H			;WRITE FLASH
CALL_IAP:     	MOV   	R0,#0FFH
              	MOV   	@R0,#96H		;0FFH=0x96
              	CLR   	F1			;F1=0D0.1H
              	LCALL 	PGM_MTP
              	JB    	F0,WRITE_ERR
              
WRITE_0K:     	MOV   	A,#2EH			;SEND '.'
WRITE_OK1:    	ACALL 	SEND_ASC
              	AJMP  	OP_END
;************************************************                   
READ_USER_ID:  	MOV   	R0,#DATA_BUF
               	MOV   	DPH,@R0			;START ADDRESS
               	INC   	R0
               	MOV   	DPL,@R0
               	INC   	R0
               	MOV   	addr_h,@R0		;END ADDRESS
               	INC   	R0
               	MOV   	addr_l,@R0
               	INC   	R0			;RO=84H
               	JNB   	RI,$
               	CLR   	RI
               
USER_ID_START: 	CJNE  	@R0,#00H,USER_ID_LOOP	;R0=84H
               	ACALL 	ASC_ENTER
               	MOV   	R2,#10H			;16 BYTE 
               	MOV   	A,DPH			
               	ACALL 	SEND_HEX
               	MOV   	A,DPL
               	ACALL 	SEND_HEX
               	MOV   	A,#3DH			;SEND "ADDRESS="
               	ACALL 	SEND_ASC
               
USER_ID_LOOP:  	MOV   	R4,DPH
               	MOV   	R5,DPL
               	MOV   	A,#07H			;READ USER ID
               	LCALL 	PGM_MTP		
               	MOV   	A,R7
               	CJNE  	@R0,#00H,USER_ID_1
               	ACALL 	SEND_HEX
               	SJMP  	USER_ID_2

USER_ID_1:     	CJNE  	A,#00H,SEND_DPTR
USER_ID_2:     	MOV   	A,addr_h
               	CJNE  	A,DPH,DPTR_INC
               	MOV   	A,addr_l
               	CJNE  	A,DPL,DPTR_INC
               	CJNE  	@R0,#01H,OP_END
               	AJMP  	WRITE_0K
;************************************************                   
OP_END:   	ACALL 	ASC_ENTER		;SEND 'ENTER'
          	JNB   	TI,$
          	SETB  	REN
          	AJMP  	WAIT_3AH		;GOTO WAIT_3AH
;************************************************                   
DPTR_INC:   	INC   	DPTR
            	DJNZ  	R2,USER_ID_LOOP
            	AJMP  	USER_ID_START
;************************************************                   
SEND_DPTR:   	MOV   	A,DPH
             	ACALL 	SEND_HEX
             	MOV   	A,DPL
             	ACALL 	SEND_HEX
             	AJMP  	OP_END
;************************************************                   
WRITE_CFG:  	MOV   	R1,#DATA_BUF
            	MOV   	A,@R1
            	MOV   	R7,A			;R7: 00H=UCFG1,02H=BOOT VECTOR,03H=STATUS BITS
            	INC   	R1			;R7: 08H~0FH=SECURITY BITS
            	MOV   	A,@R1
            	MOV   	R5,A
            	MOV   	A,#02H			;WRITE CONFIG
            	AJMP  	CALL_IAP
;************************************************                  
OP_ERR:    	AJMP  	WRITE_ERR
;************************************************
READ_CFG:   	MOV   	R1,#DATA_BUF	
            	MOV   	A,@R1			;R7: 00H=UCFG1,02H=BOOT VECTOR,03H=STATUS BITS
            	MOV   	R7,A			;R7: 08H~0FH=SECURITY BITS
            	MOV   	A,#03H			;READ CONFIG
            	LCALL 	PGM_MTP
            	JB    	F0,OP_ERR
            	MOV   	A,R7
            	ACALL 	SEND_HEX
            	AJMP  	WRITE_0K                  
;************************************************                   
ERASE_FLASH: 	MOV   	R1,#DATA_BUF
             	MOV   	A,@R1
             	MOV   	R7,A			;R7: 00H=PAGE ERASE,01H=SECTOR ERASE
             	INC   	R1
             	MOV   	A,@R1
             	MOV   	R4,A			;R4,R5: SECTOR ADDRESS
             	INC   	R1
             	MOV   	A,@R1
             	MOV   	R5,A
             	MOV   	A,#04H			;ERASE FLASH
             	AJMP  	CALL_IAP
                   
READ_GOLBER_CRC:
	   	MOV   	A,#06H			;READ GOLBER CRC
             	AJMP  	SEND_CRC
;************************************************                   
READ_SECTOR_CRC:   
		MOV   	R1,#DATA_BUF
               	MOV   	A,@R1
            	MOV   	R7,A			;R7: SECTOR ADDRESS
            	MOV   	A,#05H			;READ SECTOR CRC
            	
SEND_CRC:   	LCALL 	PGM_MTP
            	JB    	F0,OP_ERR
            	MOV   	A,R4			;4 BYTE CRC DATA
            	ACALL 	SEND_HEX
            	MOV   	A,R5
            	ACALL 	SEND_HEX
            	MOV   	A,R6
            	ACALL 	SEND_HEX
            	MOV   	A,R7
            	ACALL 	SEND_HEX
           	AJMP  	WRITE_0K
;************************************************                   
ASC_ENTER:    	MOV   	A,#0DH
              	ACALL 	SEND_ASC
              	MOV   	A,#0AH
              	ACALL 	SEND_ASC
              	RET
;************************************************
SET_BAUD:    	MOV   	A,#2EH
             	ACALL 	SEND_ASC
             	MOV   	R1,#0FFH
             	DJNZ  	R1,$
             	DJNZ  	R1,$
             	CLR   	TR1
             	MOV   	R1,#DATA_BUF
             	MOV   	TH1,@R1
             	MOV   	TL1,@R1
             	SETB  	TR1
             	AJMP  	WRITE_0K
;************************************************                   
SEND_HEX:    	MOV   	R4,A
             	SWAP  	A	
             	ACALL 	HEX_ASC
             	ACALL 	SEND_ASC
             	MOV   	A,R4
             	ACALL 	HEX_ASC
             	ACALL 	SEND_ASC
             	RET
;************************************************ 
		END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -