📄 936isp_4800_7.3728m.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 + -