📄 otp.asm
字号:
include "otp.equ"
;*****************************************************
;宏指令的定义
;*****************************************************
CMP_NMD MACRO X,K1,K2 ;if(x!=k1) 跳转
MOVLW K1 ;else goto K2
XORWF X,0
BTFSS 3,2
GOTO K2
ENDM
;*******************
CMP_YMD MACRO X,K1,K2 ;if(x==k1) 跳转
MOVLW K1 ;else goto K2
XORWF X,0
BTFSC 3,2
GOTO K2
ENDM
;*******************
CMP_NMW MACRO X,K2 ;if(x!=W) 跳转
XORWF X,0 ;else goto K2
BTFSS 3,2
GOTO K2
ENDM
;*******************
CMP_YMW MACRO X,K2 ;if(x==W) GOTO K2
XORWF X,0 ;else 往下运行
BTFSC 3,2
GOTO K2
ENDM
;*******************
CMP_NMM MACRO X1,X2,K2 ;if(X1!=X2) goto K2
MOVFW X2
XORWF X1,0 ;else 往下运行
BTFSS 3,2
GOTO K2
ENDM
;*******************
CMP_YMM MACRO X1,X2,K2 ;if(x1==X2) GOTO K2
MOVFW X2
XORWF X1,0 ;else 往下运行
BTFSC 3,2
GOTO K2
ENDM
;*******************
EI MACRO ;中断开关
BSF 0BH,7
ENDM
DI MACRO
BCF 0BH,7
ENDM
;*********************
SETPAGE MACRO PG
#IF PG-3
#IF PG-2
#IF PG-1
BCF STATUS,PA1 ;设置程序页
BCF STATUS,PA0
#ELSE
BCF STATUS,PA1
BSF STATUS,PA0
#ENDIF
#ELSE
BSF STATUS,PA1
BCF STATUS,PA0
#ENDIF
#ELSE
BSF STATUS,PA1
BSF STATUS,PA0
#ENDIF
ENDM
;*********************
MOV MACRO M0,M1 ;FM0=FM1
MOVF M1,0
MOVWF M0
ENDM
;*********************
MOVD MACRO M,K ;FM=K
MOVLW K
MOVWF M
ENDM
;*********************
ADDM MACRO F0,F1,F2 ;F0=F1+F2
MOVFW F1
ADDWF F2,0
MOVWF F0
ENDM
;*********************
SUBM MACRO F0,F1,F2 ;F0=F1-F2
MOVFW F2
SUBWF F1,0
MOVWF F0
ENDM
;*********************
ADD MACRO F0,F1 ;F0=F0+F1
MOVFW F1
ADDWF F0,1
ENDM
;*********************
SUB MACRO F0,F1 ;F0=F0-F1
MOVFW F1
SUBWF F0,1
ENDM
;*********************
ADDD MACRO F0,K1 ;F0=F0+K1
MOVLW K1
ADDWF F0,1
ENDM
;*********************
ADDDM MACRO F0,F1,K1 ;F0=F1+K1
MOVLW K1
ADDWF F1,0
MOVWF F0
ENDM
;*********************
SUBD MACRO F0,K1 ;F0=F0-K1
MOVLW K1
SUBWF F0,1
ENDM
;*********************
JB MACRO F,B,K ;if(f.b==1)跳转
BTFSC F,B
GOTO K
ENDM
;*********************
JNB MACRO F,B,K ;if(f.b==0)跳转
BTFSS F,B
GOTO K
ENDM
;*********************
JPNC MACRO F,K0,K1 ;if(f<k0)跳转
MOVLW K0
SUBWF F,1
BTFSS 3,0
GOTO K1
ENDM
;*********************
JPC MACRO F,K0,K1 ;if(f>k0)跳转
MOVLW K0
SUBWF F,1
BTFSC 3,0
GOTO K1
ENDM
;*********************
XOR MACRO F,K
MOVLW K
XORWF F,1
ENDM
;*********************
AND MACRO F,K
MOVLW K
ANDWF F,1
ENDM
;*********************
FAND MACRO F,K
MOVLW K
ANDWF F,0
ENDM
;*********************
ORD MACRO F,K
MOVLW K
IORWF F,1
ENDM
;*********************
OR MACRO M1,M2
MOVFW M2
IORWF M1,1
ENDM
;*********************
NOTW MACRO ;求反
XORLW 0FFH
ENDM
NOTF MACRO F
COMF F,1
ENDM
;*********************
OUTPWM MACRO
BSF TC,2
ENDM
MASKPWM MACRO
BCF TC,2
ENDM
;********************
MOVB MACRO A,a,B,b ;B.b送到A.a
BCF A,a
BTFSC B,b
BSF A,a
ENDM
;********************
BCDF MACRO M ;BCD码调整
MOVLW 6
ADDWF M
SKPNDC
MOVWF M
ENDM
;********************
ADDC MACRO M1,M2
MOVFW M2
BTFSC 3,0
INCF M1,F
ADDWF M1,1
ENDM
;********************
SUBC MACRO M1,M2
MOVFW M2
BTFSS 3,0
ADDLW 1
SUBWF M1,1
ENDM
;********************
DJNZ MACRO M,K ;M-1!=0 跳转
DECFSZ M,1
GOTO K
ENDM
;********************
ADDCD MACRO M,K
MOVLW K
BTFSC 3,0
INCF M,F
ADDWF M,1
ENDM
;********************
SUBCD MACRO M,K
MOVLW K
BTFSC 3,0
DECF M,1
SUBWF M,1
ENDM
;********************************
IF_KEY MACRO KEY_NAME,PROGRAM
MOVLW KEY_NAME
XORFW KEYM,W
SPKNZ
GOTO PROGRAM
ENDM
;**************************
IF_FSR MACRO K1,K2
MOVFW FSR ;else goto K2
XORLW K1+80H
BTFSS 3,2
GOTO K2
ENDM
;**************************
CLRB MACRO K,B
BCF K,B
ENDM
;**************************
SETB MACRO K,B
BSF K,B
ENDM
;***************************
ONVPP MACRO
BSF RC,VPPON
ENDM
OFFVPP MACRO
BCF RC,VPPON
ENDM
ORG 0
CLRF FSR
MOVLW 0FFH
TRIS RA
TRIS RB
MOVLW 0C0H
TRIS RC
MOVD RC,7FH
CLRB RC,OSCI1
MOVLW 40H
TRIS RC
OFFVPP
CLRF COUNTER
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,0FAH ;
TWT100 NOP
DECFSZ R1,F
GOTO TWT100
DECFSZ R0,F
GOTO TWT10
RETLW 0
;********************************************
TPW MOVD R0,10 ;>10u>=25,TRC
TPW0 NOP
DECFSZ R0,F
GOTO TPW0
RETLW 0
;********************************************
READY MOVLW 0FFH
TRIS RA
TRIS RB
OFFVPP
READKEY0 CLRF COUNTER
CALL TWAIT10
READKEY JB RC,KEY_PIN,READKEY0
INCF COUNTER,F
CMP_NMD COUNTER,3,READKEY
CLRF COUNTER
CLRB RC,GREEN_LED
CLRB RC,RED_LED
CLRF PC_H
CLRF PC_L
BLANK_CHECK ;检查目标片是否为空
CLRB RC,OSCI0
NOP
CLRB RC,OSCI1
NOP
SETB RC,T0CKI1
NOP
NOP
ONVPP ;开VPP
CALL TW100 ;TR=0.15-1.0-5u=12.5C
BLANK0 SETB RC,OSCI1 ;PC1++
CALL TPW
CLRB RC,OSCI1
CALL TPW
BLANK00 SETB RC,OSCI1 ;TACC>=0.25 u
NOP
NOP
NOP
; MOV INTERNALL,RA
; MOV INTERNALH,RB
MOVFW RA
ANDLW 0FH
XORLW 0FH
BNZ BLANKFAIL
BLANK1 MOVFW RB
NOTW
BZ BLANK2
BLANKFAIL
CLRB RC,OSCI1
NOP
OFFVPP
NOP
SETB RC,GREEN_LED ;NOT RASS
FREEKEY0 NOP
JNB RC,KEY_PIN,FREEKEY0
GOTO READY
BLANK2 NOP
CLRB RC,OSCI1 ;PC++
NOP ;>Toz
NOP
NOP
NOP
INCF PC_L,F
BNZ CMPPOIN
INCF PC_H,F
CMPPOIN INCF PC_L,W
BNZ BLANK00
CMP_NMD PC_H,ROMPAGE-1,BLANK00
PROGRAMMING ;开始编程
NOP
OFFVPP ;两芯片重新复位
CALL TW100 ;断电100 ms
MOVLW 0FFH
TRIS RA
TRIS RB
SETB RC,T0CKI1
NOP
CLRB RC,OSCI0
NOP
CLRB RC,OSCI1 ;01为输入
NOP
NOP
ONVPP
CALL TW100 ;TR
SETB RC,OSCI0 ;PC++进入数据写操作
CALL TPW ;TACC
MOV CONFIGM,RA ;读源片中的CONFIG
NOP
CLRB RC,OSCI0 ;两芯片PC++
CALL TPW
SETB RC,OSCI1
CALL TPW
CLRB RC,OSCI1
CALL TPW
WRITEDATA
CLRF COUNTER
CLRF PC_H
CLRF PC_L
INCF PC_L,F
WRITEDATA0
MOVLW 0FFH
TRIS RA ;RA,RB为输入
TRIS RB
NOP
NOP
SETB RC,OSCI0 ;0为输出
NOP ;TACC
NOP
NOP
NOP
MOV INTERNALL,RA
MOV INTERNALH,RB
NOP
CLRB RC,OSCI0 ;源片PC++
NOP ;0__输入
NOP
NOP
NOP
WRDATA0 NOP
CLRW
TRIS RA
TRIS RB
MOV RA,INTERNALL
MOV RB,INTERNALH
NOP ;TDS>1.0
NOP
NOP
NOP
NOP
CLRB RC,T0CKI1
CALL TPW ;写DATA TPW
SETB RC,T0CKI1
NOP ;TDH>1.0
NOP
NOP
NOP
NOP
MOVLW 0FFH
TRIS RA
TRIS RB
NOP
CLRB RC,T0CKI1 ;读
NOP ;TACC
NOP
NOP
NOP
MOVFW RA
CMP_YMW INTERNALL,WRDATA1
INCF COUNTER,F ;NOT RASS
CMP_YMD COUNTER,25,WRDATAFAIL
SETB RC,T0CKI1
NOP ;TOZ
NOP
NOP
GOTO WRDATA0
WRDATA1 MOVFW RB
CMP_YMW INTERNALH,WRDATA2
INCF COUNTER,F
CMP_YMD COUNTER,25,WRDATAFAIL ;COUNTER>25
SETB RC,T0CKI1
NOP ;TOZ
NOP
NOP
GOTO WRDATA0
WRDATA2 SETB RC,T0CKI1
NOP
NOP
NOP
MOVD COUNTER,3 ;RASS连写3次
WRDATA20 CLRW
TRIS RA
TRIS RB
MOV RA,INTERNALL
MOV RB,INTERNALH
NOP ;TDS>1.0
NOP
NOP
NOP
NOP
CLRB RC,T0CKI1
CALL TPW ;TPW
SETB RC,T0CKI1
CALL TPW ;TRC
MOVLW 0FFH
TRIS RA
TRIS RB
CLRB RC,T0CKI1 ;1__输出
CALL TPW ;TACC
SETB RC,T0CKI1
DECF COUNTER,F
BNZ WRDATA20
INCF PC_L,F
BNZ WRDATA21
INCF PC_H,F
CMP_YMD PC_H,ROMPAGE,WRCONFIG ;是否写完
WRDATA21 SETB RC,OSCI1 ;PC++
CALL TPW
CLRB RC,OSCI1
CLRF COUNTER
GOTO WRITEDATA0
WRCONFIG ;写加密位
OFFVPP
CALL TW100
CLRF COUNTER
SETB RC,T0CKI1
NOP
CLRB RC,OSCI0
NOP
CLRB RC,OSCI1
NOP
ONVPP
CALL TW100 ;电源上升到稳定值所需的时间
;MOVD CONFIGM,0DH ;
AND CONFIGM,7
CONFIG0 CLRW
TRIS RA
TRIS RB
MOV RA,CONFIGM
MOVD RB,0FFH
NOP
CLRB RC,T0CKI1
CALL TWAIT10 ;写CONFIG TPWF
SETB RC,T0CKI1
NOP
NOP
NOP
NOP
MOVLW 0FFH
TRIS RA
TRIS RB
CALL TPW ;TRC
CLRB RC,T0CKI1 ;第二个脉冲读
NOP ;TACC
NOP
NOP
NOP
MOVFW RA
ANDLW 0FH
CMP_YMW CONFIGM,CONFIG1
INCF COUNTER,F ;NOT RASS
CMP_YMD COUNTER,25,CONFAIL ;25次后还是不行--失败
SETB RC,T0CKI1
NOP ;TOZ
NOP
NOP
GOTO CONFIG0
CONFIG1 SETB RC,T0CKI1
NOP
NOP
NOP
MOVD COUNTER,3 ;RASS再连写3次
CONFIG20 CLRW
TRIS RA
TRIS RB
MOV RA,CONFIGM
MOVD RB,0FFH
NOP
NOP
NOP
NOP
CLRB RC,T0CKI1
CALL TWAIT10 ;TPWF
SETB RC,T0CKI1 ;TRC
NOP
NOP
NOP
NOP
MOVLW 0FFH
TRIS RA
TRIS RB
CALL TPW
CLRB RC,T0CKI1
CALL TPW ;TACC
SETB RC,T0CKI1
NOP ;TOZ
NOP
NOP
DECF COUNTER,F
BNZ CONFIG20
PRGEND OFFVPP
NOP
CLRB RC,GREEN_LED ;亮绿灯
NOP
SETB RC,RED_LED
NOP
GOTO FREEKEY2
WRDATAFAIL
CONFAIL OFFVPP
NOP
SETB RC,GREEN_LED ;亮红灯
NOP
CLRB RC,RED_LED
FREEKEY2 NOP
JNB RC,KEY_PIN,FREEKEY2
GOTO READY
org 7ffh
goto 0
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -