⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 otp.asm

📁 using pic16c57 to realize the PIC writer for pic16c57
💻 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 + -