📄 e51p.asm
字号:
ACALL SET_VPP5
LOCK_BIT3_C51:
MOV A,RX4
CJNE A,#0FFH,LOCK_BIT_C51_RET
SETB PROG
SETB BUSY
CLR P2.7
SETB P2.6
CLR P3.7
SETB P3.6
MOV R0,#0FH
DJNZ R0,$
ACALL SET_VPP12
MOV R0,#0FH
DJNZ R0,$
CLR PROG
MOV R0,#0FH
DJNZ R0,$
SETB PROG
MOV R0,#0FH
DJNZ R0,$
ACALL SET_VPP5
LOCK_BIT_C51_RET:
ACALL MODE_C51
MOV TX0,RX0
MOV TX1,RX1
MOV TX2,RX2
MOV TX3,RX3
MOV TX4,RX4
ACALL TX_PC
AJMP WAIT_COMM
READ_SIGN_C51:
MOV ADDRESS_H,#00H
MOV ADDRESS_L,#30H
ACALL _READ_SIGN_C51
MOV TX2,RET0
MOV ADDRESS_L,#31H
ACALL _READ_SIGN_C51
MOV TX3,RET0
MOV ADDRESS_L,#32H
ACALL _READ_SIGN_C51
MOV TX4,RET0
READ_SIGN_C51_RET:
ACALL MODE_C51
ACALL TX_PC
AJMP WAIT_COMM
_READ_SIGN_C51:
SETB RST
ACALL SET_VPP5 ;设置成读SIGN状态 P3.6=L P3.7=L
SETB PROG ; P2.7=L P2.6=L
CLR P3.6
CLR P3.7
CLR P2.6
CLR P2.7
MOV R0,#0FH
DJNZ R0,$
MOV P1,ADDRESS_L
MOV A,#00111111B
ANL A,ADDRESS_H
MOV P2,A ;高地址
MOV P0,#0FFH ;读先置1
MOV R0,#0FH
DJNZ R0,$
MOV A,P0
MOV RET0,A
RET
ERASE_C51:
SETB PROG
SETB P2.6
CLR P2.7
CLR P3.7
CLR P3.6
ACALL SET_VPP12
MOV R0,#02H
ACALL DELAY
CLR PROG
MOV R0,#10H
ACALL DELAY
SETB PROG
ACALL MODE_C51
ACALL TX_PC
AJMP WAIT_COMM
VPP_5V: ACALL SET_VPP5
ACALL TX_PC
AJMP WAIT_COMM
VPP_12V: ACALL SET_VPP12
ACALL TX_PC
AJMP WAIT_COMM
SET_VPP12: SETB VPP_12
JNB F_VPP,WAIT_VPP12
RET
WAIT_VPP12: MOV R0,WAIT_VOL
DJNZ R0,$
SETB F_VPP
RET
SET_VPP5: CLR VPP_12
JB F_VPP,WAIT_VPP5
RET
WAIT_VPP5: MOV R0,WAIT_VOL
DJNZ R0,$
CLR F_VPP
RET
MODE_C51: ACALL SET_VPP5
SETB RST
SETB PROG
MOV P0,#0FFH
SETB P3.6
SETB P3.7
CLR P2.7
CLR P2.6
MOV P2,#00000000B
MOV P1,#0FFH
RET
INC_ADDRESS:MOV R0,ADDRESS_L
MOV R1,ADDRESS_H
CJNE R0,#0FFH,INC_LADDR
INC_HADDR: MOV R0,#00H
INC R1
SJMP RET_ADDR
INC_LADDR: INC R0
RET_ADDR: MOV ADDRESS_L,R0
MOV ADDRESS_H,R1
RET
;------------------------------------------------------------
; FOR AT89S51
;------------------------------------------------------------
ERASE_S51: ACALL READY_PROG
MOV SOUT1,#10101100B
MOV SOUT2,#10000000B
ACALL SCK_INSTRUC
MOV R0,#255
ACALL DELAY
MOV R0,#255
ACALL DELAY
ACALL MODE_S51
ACALL TX_PC
AJMP WAIT_COMM
INIT_WRITE_S51:
MOV ADDRESS_L,#00H
MOV ADDRESS_H,#00H
ACALL READY_PROG
ACALL TX_PC
AJMP WAIT_COMM
WRITE_S51: MOV _R0,#RX2
MOV _R1,#TX2
WRITE_16BYTES_S51:
MOV R0,_R0
MOV PARAM0,@R0
ACALL _WRITE_S51
MOV R1,_R1
MOV @R1,RET0
MOV A,RET0
CJNE A,PARAM0,WRITE_S51_RES_ERROR
INC _R0
INC _R1
ACALL INC_ADDRESS
MOV R0,_R0
CJNE R0,#RX17+1,WRITE_16BYTES_S51
WRITE_S51_RES:
MOV SBUF,#00H
CLR TI
JNB TI,$
CLR TI
AJMP WAIT_COMM
WRITE_S51_RES_ERROR:
MOV SBUF,#0FFH
CLR TI
JNB TI,$
CLR TI
ACALL MODE_S51
AJMP WAIT_COMM
_WRITE_S51:
MOV SOUT1,#01000000B
MOV SOUT2,ADDRESS_H
MOV SOUT3,ADDRESS_L
MOV SOUT4,PARAM0
ACALL SCK_INSTRUC
MOV RET0,PARAM0
MOV R0,#1
ACALL DELAY
RET
READ_S51: MOV _R1,#TX2
READ_16BYTES_S51:
ACALL _READ_S51
MOV R1,_R1
MOV @R1,RET0
INC _R1
ACALL INC_ADDRESS
MOV R1,_R1
CJNE R1,#TX17+1,READ_16BYTES_S51
ACALL TX_PC
READ_NEXT_S51:
CLR RI
JNB RI,$; 检查接收的一个字节,查询是否结束
MOV A,SBUF
CJNE A,#01H,READ_S51;01表示结束
ACALL MODE_S51
AJMP WAIT_COMM
_READ_S51: MOV SOUT1,#00100000B
MOV SOUT2,ADDRESS_H
MOV SOUT3,ADDRESS_L
MOV SOUT4,#00
ACALL SCK_INSTRUC
MOV RET0,SIN4
RET
LOCK_BIT_S51:
ACALL READY_PROG
MOV SOUT1,#10101100B
MOV SOUT2,#11100000B
MOV SOUT3,#00000000B
MOV SOUT4,#00000000B
LOCK_BIT1_S51:
MOV A,RX2
CJNE A,#0FFH,LOCK_BIT2_S51
MOV SOUT2,#11100001B
ACALL SCK_INSTRUC
MOV R0,#1
ACALL DELAY
LOCK_BIT2_S51:
MOV A,RX3
CJNE A,#0FFH,LOCK_BIT3_S51
MOV SOUT2,#11100010B
ACALL SCK_INSTRUC
MOV R0,#1
ACALL DELAY
LOCK_BIT3_S51:
MOV A,RX4
CJNE A,#0FFH,_LOCK_BIT_S51
MOV SOUT2,#11100011B
ACALL SCK_INSTRUC
MOV R0,#1
ACALL DELAY
_LOCK_BIT_S51:
ACALL MODE_S51
ACALL TX_PC
AJMP WAIT_COMM
READ_SIGN_S51:
ACALL READY_PROG
MOV SOUT1,#00101000B
MOV SOUT2,#00000000B
MOV SOUT3,#00000000B
ACALL SCK_INSTRUC
MOV TX2,SIN4
MOV SOUT1,#00101000B
MOV SOUT2,#00000001B
MOV SOUT3,#00000000B
ACALL SCK_INSTRUC
MOV TX3,SIN4
MOV SOUT1,#00101000B
MOV SOUT2,#00000010B
MOV SOUT3,#00000000B
ACALL SCK_INSTRUC
MOV TX4,SIN4
ACALL MODE_S51
ACALL TX_PC
AJMP WAIT_COMM
MODE_S51: ACALL INIT_PIN
CLR SCK
SETB MISO
CLR MOSI
RET
READY_PROG: ACALL MODE_S51
SETB RST
MOV R0,#10
ACALL DELAY
MOV SOUT1,#10101100B
MOV SOUT2,#01010011B
MOV SOUT3,#00
MOV SOUT4,#00
ACALL SCK_INSTRUC
RET
SCK_INSTRUC:CLR MOSI
SETB MISO
MOV SOUT,SOUT1
ACALL SCK_BYTE
MOV SIN1,SIN
MOV SOUT,SOUT2
ACALL SCK_BYTE
MOV SIN2,SIN
MOV SOUT,SOUT3
ACALL SCK_BYTE
MOV SIN3,SIN
MOV SOUT,SOUT4
ACALL SCK_BYTE
MOV SIN4,SIN
RET
SCK_BYTE: CLR SCK
MOV C,SOUT.7
MOV MOSI,C
NOP
SETB SCK
NOP
MOV C,MISO
MOV SIN.7,C
CLR SCK
CLR SCK
MOV C,SOUT.6
MOV MOSI,C
NOP
SETB SCK
NOP
MOV C,MISO
MOV SIN.6,C
CLR SCK
CLR SCK
MOV C,SOUT.5
MOV MOSI,C
NOP
SETB SCK
NOP
MOV C,MISO
MOV SIN.5,C
CLR SCK
CLR SCK
MOV C,SOUT.4
MOV MOSI,C
NOP
SETB SCK
NOP
MOV C,MISO
MOV SIN.4,C
CLR SCK
CLR SCK
MOV C,SOUT.3
MOV MOSI,C
NOP
SETB SCK
NOP
MOV C,MISO
MOV SIN.3,C
CLR SCK
CLR SCK
MOV C,SOUT.2
MOV MOSI,C
NOP
SETB SCK
NOP
MOV C,MISO
MOV SIN.2,C
CLR SCK
CLR SCK
MOV C,SOUT.1
MOV MOSI,C
NOP
SETB SCK
NOP
MOV C,MISO
MOV SIN.1,C
CLR SCK
CLR SCK
MOV C,SOUT.0
MOV MOSI,C
NOP
SETB SCK
NOP
MOV C,MISO
MOV SIN.0,C
CLR SCK
RET
;------------------------------------------------------------
; GOBAL SUB PROCESSES
;------------------------------------------------------------
SET_WAIT: MOV A,RX1 ;设置电压转换所用的时间WAIT_VOL*2 US
MOV WAIT_VOL,A
MOV TX1,A
MOV TX2,A
ACALL TX_PC
AJMP WAIT_COMM
TX_PC: MOV R0,#TX0
TX_BYTE: CLR TI
MOV A,@R0
MOV SBUF,A
INC R0
JNB TI,$
CJNE R0,#TX17+1,TX_BYTE
CLR TI
RET
RX_PC: SETB P3.0
MOV R0,#RX0
RX_BYTE: CLR RI
JNB RI,$
MOV A,SBUF
MOV @R0,A
INC R0
CJNE R0,#RX17+1,RX_BYTE
CLR RI
RET
DELAY: MOV R1,#0FBH ;延时R0*MS
MOV R2,#0FBH
DJNZ R1,$
DJNZ R2,$
DJNZ R0,DELAY
RET
INIT_PIN: CLR VPP
CLR RST
SETB BUSY
SETB PROG
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
SETB P3.7
SETB P3.6
RET
REPORT_ERROR:
MOV TX0,#0FFH
ACALL TX_PC
RET
REPORT_INVALID:
MOV TX0,#0F0H
ACALL TX_PC
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -