MOV IAP_ADDRL,#0 ;First write the “LJMP ISP_ENTRY” instruction at the starting
address of page 2
MOV IAP_ADDRH,#02H
LCALL ISP_ERASEIAP
MOV A,#02H
LCALL ISP_PROGRAMIAP ;Programming User Code Reset Vector Code
MOV A,#HIGH ISP_ENTRY
LCALL ISP_PROGRAMIAP ;Programming User Code Reset Vector Code
MOV A,#LOW ISP_ENTRY
LCALL ISP_PROGRAMIAP ;Programming User Code Reset Vector Code
MOV IAP_ADDRL,#0 ;User code address starts from 0
MOV IAP_ADDRH,#0
LCALL ISP_ERASEIAP
MOV A,#02H
LCALL ISP_PROGRAMIAP ;Programming User Code Reset Vector Code
MOV A,#HIGH ISP_ENTRY
LCALL ISP_PROGRAMIAP ;Programming User Code Reset Vector Code
MOV A,#LOW ISP_ENTRY
LCALL ISP_PROGRAMIAP ;Programming User Code Reset Vector Code
MOV IAP_ADDRL,#0 ;new code buffer address
MOV IAP_ADDRH,#02H
MOV R7,#124 ;Erase 62.5K bytes
ISP_ERASEAP:
LCALL ISP_ERASEIAP
INC IAP_ADDRH ;target address+512
INC IAP_ADDRH
DJNZ R7,ISP_ERASEAP ;Determine if erasing is complete
MOV IAP_ADDRL,#LOW APENTRY
MOV IAP_ADDRH,#HIGH APENTRY
LCALL ISP_ERASEIAP
MOV A,#5AH ;Return 5A A5 to PC, indicating that the ISP programming module
is ready
LCALL ISP_SENDUART
MOV A,#0A5H
LCALL ISP_SENDUART
LCALL ISP_RECVACK ;Receive response data
LCALL ISP_RECVUART ;Receive length high byte
MOV R0,A
LCALL ISP_RECVUART ;Receive length low byte
MOV R1,A
CLR C ; total length -3
MOV A,#03H
SUBB A,R1
MOV DPL,A
CLR A
SUBB A,R0
MOV DPH,A ;Total length complement stored in DPTR
LCALL ISP_RECVUART ;Map user code reset entry code to map area
LCALL ISP_PROGRAMIAP ;0000
LCALL ISP_RECVUART
LCALL ISP_PROGRAMIAP ;0001