📄 otp65r.asm
字号:
LIST P=16C57
#include "C:\MPLAB\P16c5x.inc"
#include "otp65.inc"
#include "p16c57.mac"
ONVPP MACRO
SETP VPPON
ENDM
OFFVPP MACRO
CLRP VPPON
ENDM
;************************************
ORG 0
CLRF FSR
MOVLW 0FFH
TRIS PORTA
TRIS PORTB
MOVLW 0C0H
TRIS PORTC
MOVD PORTC,7FH
MOVLW TRISC_BUF0
TRIS PORTC
OFFVPP
CLRF COUNTER
TRIS_B B'00111111'
GOTO READY
;**********************************************
;子程序
;**********************************************
TWAIT10 MOVD R0,19H ;10ms=25,000指令周期
TWAIT100 MOVD R1,0FAH
TWAIT101 NOP
DECFSZ R1,F
GOTO TWAIT101
DECFSZ R0,F
GOTO TWAIT100
RETLW 0
;********************************************
TW100 MOVD R0,0FAH ;100ms=250,000指令周期
TWT10 MOVD R1,7DH ;
TWT100 NOP
NOP
NOP
nop
nop
DECFSZ R1,F
GOTO TWT100
DECFSZ R0,F
GOTO TWT10
RETLW 0
;********************************************
TPW MOVD R0,5 ;>10u>=25,TRC
TPW0 NOP
nop
nop
DECFSZ R0,F
GOTO TPW0
RETLW 0
;********************************************
TWAIT100u
MOVD R0,0x28
TT1m0
NOP
NOP
DJNZ R0,TT1m0
RETLW 0
;****************************************
LOAD_DATA
MOVLW LOAD_COM
LOAD_DATA0
CALL OUT_COMMAND
MOVD R0,0x10
MOV R1,INTERNALL
MOV R2,INTERNALH
WRDATA1
SETP RB6_CLK1
CLRC
RRF R2,F
RRF R1,F
BNC WRDATA2
SETP RB7_DT1
GOTO WRDATA3
WRDATA2
CLRP RB7_DT1
WRDATA3
NOP
NOP
CLRP RB6_CLK1
NOP
DJNZ R0,WRDATA1
RETLW 0
;****************************************
READ_DATA
CLRF INTERL
CLRF INTERH
MOVLW READ_COM
CALL OUT_COMMAND
TRIS_C TRISC_BUF ;PORTC RB7_DT1/I
MOVD R0,0x10
RDDATA0
NOP
SETP RB6_CLK1
NOP
NOP
CLRC
SNBP RB7_DT1
SETC
RRF INTERH,F
RRF INTERL,F
CLRP RB6_CLK1
DJNZ R0,RDDATA0
MOVLW 0xFE
ANDWF INTERL,F
MOVLW 0x7F
ANDWF INTERH,F
MOVLW TRISC_BUF0
TRIS PORTC
RETLW 0
;****************************************
OUT_COMMAND
MOVWF R1
MOVD R0,0x06 ;GP1_CLK=0
OUTCOM0
SETP RB6_CLK1
CLRC
RRF R1,F
BNC OUTCOM1
SETP RB7_DT1
GOTO OUTCOM2
OUTCOM1
CLRP RB7_DT1
OUTCOM2
NOP
NOP
CLRP RB6_CLK1
DJNZ R0,OUTCOM0
RETLW 0
;********************************************
OUT_COMMAND1
MOVWF R1
MOVD R0,0x06 ;GP1_CLK=0
OUTCOM10
SETP RB6_CLK0
CLRC
RRF R1,F
BNC OUTCOM11
SETP RB7_DT0
GOTO OUTCOM12
OUTCOM11
CLRP RB7_DT0
OUTCOM12
NOP
NOP
CLRP RB6_CLK0
NOP
DJNZ R0,OUTCOM10
RETLW 0
;********************************************
READ_PGDT
MOVLW READ_COM
CALL OUT_COMMAND1
READ_PGDT1
TRIS_B B'10111111'
CLRF INTERNALL
CLRF INTERNALH
MOVD R0,0x10
READ_PGDT10
NOP
NOP
SETP RB6_CLK0
NOP
NOP
CLRC
SNBP RB7_DT0
SETC
RRF INTERNALH,F
RRF INTERNALL,F
CLRP RB6_CLK0
DJNZ R0,READ_PGDT10
MOVLW 0xFE
ANDWF INTERNALL,F
MOVLW 0x7F
ANDWF INTERNALH,F
TRIS_B B'00111111'
MOVLW INCADDR_COM
CALL OUT_COMMAND1
RETLW 0
;********************************************
READY OFFVPP
READKEY0
MOVD COUNTER,3
READKEY
CALL TWAIT10
JBP KEY_PIN,READKEY0
DJNZ COUNTER,READKEY
CLRP GREEN_LED
CLRP RED_LED
MOVD PC_H,0x10
MOVD PC_L,0
MOVLW TRISC_BUF0
TRIS PORTC
GOTO PROGRAMMING;;WRCONFIG;;
BLANK_CHECK ;检查目标片是否为空
CLRP RB6_CLK1
CLRP RB7_DT1
CLRP RB6_CLK0
CLRP RB7_DT0
NOP
NOP
ONVPP ;开VPP
CALL TW100 ;TR=0.15-1.0-5u=12.5C
BLANK0
BLANK00
CALL READ_DATA
MOVFW INTERL
XORLW 0xFE
BNZ BLANKFAIL
BLANK1 MOVFW INTERH
XORLW 0x7F
BZ BLANK2
BLANKFAIL
NOP
OFFVPP
NOP
SETP GREEN_LED ;NOT PASS
FREEKEY0
CALL TWAIT10
JNBP KEY_PIN,FREEKEY0
GOTO READY
BLANK2
MOVLW INCADDR_COM
CALL OUT_COMMAND
DJNZ PC_L,BLANK0
DJNZ PC_H,BLANK0
;*******************************************************
PROGRAMMING ;开始编程
NOP
OFFVPP ;两芯片重新复位
CALL TW100 ;断电100 ms
CALL TW100
CLRP RB6_CLK1
CLRP RB7_DT1
CLRP RB6_CLK0
CLRP RB7_DT0
ONVPP
CALL TW100 ;TR
WRITEDATA
MOVD PC_H,0x10
MOVD PC_L,0
WRITE_DATA0
MOVD COUNTER,0x19
CALL READ_PGDT
WRITE_READY
; goto WRBTYEND
;--------------------------------------------
WR_DATA0
NOP
CALL LOAD_DATA
MOVLW BEGIN_COM
CALL OUT_COMMAND
CALL TWAIT100u
MOVLW END_COM
CALL OUT_COMMAND
CALL READ_DATA
CMP_NMM INTERL,INTERNALL,WR_DATA1
CMP_YMM INTERL,INTERNALL,WR_DATA2
WR_DATA1
DJNZ COUNTER,WR_DATA0
GOTO WRDATAFAIL
WR_DATA2
MOVD COUNTER,3
WR_DATA20
CALL LOAD_DATA
MOVLW BEGIN_COM
CALL OUT_COMMAND
CALL TWAIT100u
MOVLW END_COM
CALL OUT_COMMAND
NOP
DJNZ COUNTER,WR_DATA20
CALL READ_DATA
CMP_NMM INTERL,INTERNALL,WRDATAFAIL
CMP_NMM INTERH,INTERNALH,WRDATAFAIL
WRBTYEND
MOVLW INCADDR_COM
CALL OUT_COMMAND
DJNZ PC_L,WRITE_DATA0
DJNZ PC_H,WRITE_DATA0
;--------------------------------------------
WRCONFIG ;写加密位
MOVD INTERNALL,CONFIGL
MOVD INTERNALH,CONFIGH
MOVLW LOAD_CFG
CALL LOAD_DATA0
MOVD COUNTER,7
CONFIG
MOVLW INCADDR_COM
CALL OUT_COMMAND
DJNZ COUNTER,CONFIG
MOVD COUNTER,0x64
CONFIG0
CALL LOAD_DATA
MOVLW BEGIN_COM
CALL OUT_COMMAND
NOP
CALL TWAIT100u
CALL TWAIT100u
MOVLW END_COM
CALL OUT_COMMAND
CALL READ_DATA
MOVFW INTERL
ANDLW B'01111110' ;;;NOTE
XORWF INTERNALL,W
BZ CONFIG2
CONFIG1
DJNZ COUNTER,CONFIG0
GOTO CONFAIL ;25次后还是不行--失败
CONFIG2
MOVD COUNTER,3
CONFIG20
CALL LOAD_DATA
MOVLW BEGIN_COM
CALL OUT_COMMAND
NOP
CALL TWAIT100u
CALL TWAIT100u
MOVLW END_COM
CALL OUT_COMMAND
DJNZ COUNTER,CONFIG20
CALL READ_DATA
MOVFW INTERL
ANDLW B'01111110' ;;;NOTE
XORWF INTERNALL,W
BNZ CONFAIL
PRGEND
OFFVPP
NOP
CLRP GREEN_LED ;亮绿灯
SETP RED_LED
NOP
GOTO FREEKEY2
WRDATAFAIL
CONFAIL
OFFVPP
NOP
SETP GREEN_LED ;亮红灯
NOP
CLRP RED_LED
FREEKEY2
CALL TWAIT10
JNBP KEY_PIN,FREEKEY2
GOTO READY
org 7ffh
goto 0
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -