📄 gj070613.asm
字号:
BCF SCK
DECFSZ BJSQ,F
GOTO LOOPR2
;
BSF SSEL
NOP
BSF SCK
MOVF VALUE,W
RETURN
;-----------------------------------------------
;写RC632寄存器:入口,地址在REGADR中,数据在VALUE中)
;工作单元:REGADR,UCADDR,BJSQ
WRITERAWRC ;2
BANKSEL TRISC
BCF TRISC,3
BCF TRISC,7
BCF TRISB,6
BCF TRISC,6
BSF TRISB,4
BANKSEL PIR1
;
BCF SCK
NOP
BCF SSEL
MOVF REGADR,W
MOVWF UCADDR
RLF UCADDR,W
ANDLW 0X7E
MOVWF UCADDR ;UCADDR=0AAAAAA0
MOVLW 0X08
MOVWF BJSQ
LOOPR10
BCF MOSI ;写地址
BTFSC UCADDR,7
BSF MOSI
;
BSF SCK
RLF UCADDR,F
;
BCF SCK
DECFSZ BJSQ,F
GOTO LOOPR10
;写数据
MOVLW 0X08
MOVWF BJSQ
LOOPR20
BCF MOSI
BTFSC VALUE,7
BSF MOSI
MOSI_21 BSF SCK
RLF VALUE,F
;
BCF SCK
DECFSZ BJSQ,F
GOTO LOOPR20
;
BSF SSEL
NOP
BSF SCK
RETURN
;----------------------------------------------
;置RC522寄存器位 ; 参数:REGADR , MASK;
;REGADR:寄存器地址,MASK:置位值;
;----------------------------------------------
SETBITMASK ;4
CALL READRAWRC ;读寄存器
MOVWF VALUE
MOVF MASK,W ;值修改
IORWF VALUE,F
CALL WRITERAWRC ;写寄存器
RETURN
;---------------------------------------------
;清RC522寄存器位 ; 参数:REG , MASK;
;REG:寄存器地址,MASK:置位值;
;---------------------------------------------
CLEARBITMASK ;5
CALL READRAWRC ;读寄存器
MOVWF VALUE
COMF MASK,W
ANDWF VALUE,F ;值修改
CALL WRITERAWRC ;写寄存器
RETURN
;---------------------------------------------
;开启天线 每次开启或关闭之间应至少有1MS间隔!
;工作单元: TEMPA;
PCDANTENNAON ;
MOVLW TXCONTROLREG ;0X14: INVT2RF INVT1RF INVTX2RF INVTX1RF TX2CW 0 TX2RFEN TX1RFEN
MOVWF REGADR
CALL READRAWRC
MOVWF TEMPA
MOVLW 0X03
ANDWF TEMPA,W
BTFSS STATUS,Z ;TX2RFEN,TX1RFEN=11?
RETURN ;
MOVLW 0X03 ;
MOVWF MASK
MOVLW TXCONTROLREG ;0X14
MOVWF REGADR ;
CALL SETBITMASK ;TX2RFEN,TX1RFEN=11
RETURN
;----------------------------------------------
;关闭 天线 每次开启或关闭之间应至少有1MS间隔!
PCDANTENNAOFF ;7
MOVLW TXCONTROLREG ;0X14: INVT2RF INVT1RF INVTX2RF INVTX1RF TX2CW 0 TX2RFEN TX1RFEN
MOVWF REGADR
MOVLW 0X03
MOVWF MASK
CALL CLEARBITMASK
RETURN
;-----------------------------------------------
;通过RC522和ISO14443卡通讯
;参数: COMMAND,RC522命令字,输入
;PINDATA:通过RC522发送到卡的数据,输入,开始地址PINDATA
;INLENBYTE:发送数据的字节长度,输入
;POUTDATA:接收到的卡片返回数据,输出
;POUTLENBIT:返回数据的长度
;------------------------------------------------
PCDCOMF522 ;9
MOVLW MI_ERR ;0XFE
MOVWF KA_STS
CLRF IRQEN
CLRF WAITFOR
MOVF COMMAND,W
;
XORLW PCD_AUTHENT ;0X0E
BTFSC STATUS,Z
GOTO YZMIMA
;
MOVF COMMAND,W
XORLW PCD_TRANSCEIVE ;0X0C
BTFSC STATUS,Z
GOTO TRANSCEIVE
GOTO NEXTA
;
YZMIMA MOVLW 0X12 ;验证密钥
MOVWF IRQEN
MOVLW 0X10
MOVWF WAITFOR
GOTO NEXTA
;
TRANSCEIVE MOVLW 0X77 ;发并收
MOVWF IRQEN
MOVLW 0X30
MOVWF WAITFOR
NEXTA
MOVLW COMIENREG ;0X02
MOVWF REGADR
MOVLW 0X80 ;ENABLE INTERRUPT
IORWF IRQEN,W
MOVWF VALUE
CALL WRITERAWRC ;WRITERAWRC(COMIENREG,IRQEN +0x80)
;
MOVLW COMIRQREG ;0X04
MOVWF REGADR
MOVLW 0X80 ;CLR IRQ FLAG
MOVWF MASK
CALL CLEARBITMASK
;
MOVLW COMMANDREG ;0X01
MOVWF REGADR
MOVLW 0X00 ;PCD_IDLE=0 开始执行命令
MOVWF VALUE
CALL WRITERAWRC
;
MOVLW FIFOLEVILREG ;0X0A
MOVWF REGADR
MOVLW 0X80
MOVWF MASK
CALL SETBITMASK ;清读/写缓冲区指针
;
MOVF PINDATA,W ;输入数据首地址送FSR
MOVWF FSR
MOVLW 0X00
MOVWF JSQI
LOOPLEN
MOVLW FIFODATAREG ;0X09
MOVWF REGADR
MOVF INDF,W
MOVWF VALUE
CALL WRITERAWRC
INCF FSR,F
INCF JSQI,F
MOVF INLENBYTE,W
XORWF JSQI,W
BTFSS STATUS,Z
GOTO LOOPLEN
;
MOVLW COMMANDREG ;0X01
MOVWF REGADR
MOVF COMMAND,W
MOVWF VALUE
CALL WRITERAWRC
;
MOVF COMMAND,W
XORLW PCD_TRANSCEIVE ;0X0C
BTFSS STATUS,Z
GOTO TIMETZ
MOVLW BITFRAMINGREG ;0X0D
MOVWF REGADR
MOVLW 0X80
MOVWF MASK
CALL SETBITMASK
TIMETZ
MOVLW 0X02
MOVWF JSQH
MOVLW 0X58
MOVWF JSQL ;JSQH,L=600
;
LOOPD1 MOVLW COMIRQREG ;0X04
MOVWF REGADR
CALL READRAWRC
MOVWF N_COUNT
DEC_JSQHL
DECF JSQL,F ;16 bit counter dec
MOVF JSQL,W
XORLW 0XFF
BTFSS STATUS,Z
GOTO DECOK
DECF JSQH,F
;
DECOK
MOVF JSQH,W
IORWF JSQL,W
BTFSC STATUS,Z
GOTO NEXTB ;JSQHL=0
MOVF N_COUNT,W
ANDLW 0X01
BTFSS STATUS,Z
GOTO NEXTB ;N_COUNT&0X01!=0
MOVF N_COUNT,W
ANDWF WAITFOR,W
BTFSS STATUS,Z
GOTO NEXTB ;N_COUNT&WAITFOR!=0
GOTO LOOPD1
;
NEXTB
MOVLW BITFRAMINGREG ;0X0D
MOVWF REGADR
MOVLW 0X80
MOVWF MASK
CALL CLEARBITMASK
;
MOVF JSQH,W
IORWF JSQL,W
BTFSC STATUS,Z
GOTO NEXTC ;JSQHL=0
MOVLW ERRORREG ;0X06
MOVWF REGADR
CALL READRAWRC
;
ANDLW 0X1B
BTFSS STATUS,Z
GOTO F_ELSE2 ;
MOVLW MI_OK ;0X00
MOVWF KA_STS
;
MOVF N_COUNT,W
ANDWF IRQEN,W
BTFSC STATUS,Z
GOTO NEXTD
ANDLW 0X01
BTFSC STATUS,Z
GOTO NEXTD
MOVLW MI_NOTAGERR ;0XFF
MOVWF KA_STS
;
NEXTD MOVF COMMAND,W
XORLW PCD_TRANSCEIVE ;0X0C
BTFSS STATUS,Z
GOTO NEXTC
MOVLW FIFOLEVILREG ;0X0A
MOVWF REGADR
CALL READRAWRC
MOVWF N_COUNT
MOVLW COTROLREG ;0X0C
MOVWF REGADR
CALL READRAWRC
ANDLW 0X07
MOVWF LASTBITS
;
MOVF POUTLENBIT,W
MOVWF FSR
MOVF LASTBITS,W
BTFSC STATUS,Z
GOTO F_ELSE1
DECF N_COUNT,W
MOVWF TEMPA
CLRF LEN
BCF STATUS,C
RLF TEMPA,F
RLF LEN,F
RLF TEMPA,F
RLF LEN,F
RLF TEMPA,F ;(N_COUNT-1)*8 (高位在LEN,低位在TEMPA)
RLF LEN,F
DECF FSR,F
MOVF LASTBITS,W
ADDWF TEMPA,W
MOVWF INDF
INCF FSR,F
MOVF LEN,W
BTFSS STATUS,C
GOTO NOTCY
ADDLW 0X01
NOTCY MOVWF INDF
GOTO NEXTE
;
F_ELSE1 MOVF N_COUNT,W
MOVWF TEMPA
CLRF LEN
BCF STATUS,C
RLF TEMPA,F
RLF LEN,F
RLF TEMPA,F
RLF LEN,F
RLF TEMPA,F ;(N_COUNT)*8 (高位在LEN,低位在TEMPA)
RLF LEN,F
MOVF LEN,W
MOVWF INDF
DECF FSR,F
MOVF TEMPA,W
MOVWF INDF
NEXTE
MOVF N_COUNT,W
BTFSS STATUS,Z
GOTO NEXTF
INCF N_COUNT,F
NEXTF
MOVF N_COUNT,W
SUBLW MAXRLEN
BTFSC STATUS,C
GOTO NEXTG
MOVLW MAXRLEN
MOVWF N_COUNT
;
NEXTG MOVLW 0
MOVWF JSQI
MOVF POUTDATA,W
MOVWF FSR
LOOPRD MOVLW FIFODATAREG ;0X09
MOVWF REGADR
CALL READRAWRC
MOVWF INDF
INCF FSR,F
INCF JSQI,F
MOVF N_COUNT,W
SUBWF JSQI,W
BTFSS STATUS,C
GOTO LOOPRD
GOTO NEXTC
;
F_ELSE2
MOVWF KA_STS ;MI_ERR
;
NEXTC
MOVLW COTROLREG ;0X0C
MOVWF REGADR
MOVLW 0X80
MOVWF MASK
CALL SETBITMASK
;
MOVLW COMMANDREG ;0X01
MOVWF REGADR
MOVLW PCD_IDLE ;0X00
MOVWF VALUE
CALL WRITERAWRC
MOVF KA_STS,W
; ;出口BANK0
RETURN
;##################################################
;-----------------------------------------------
;复位RC522, 无参数; 成功 返回MI_OK
;M_RST==RC6;MI_OK==0;
;-----------------------------------------------
PCDRESET ;3
BANKSEL TRISC
BCF TRISC,6
BANKSEL PORTC
;
BSF M_RST
BCF M_RST
BSF M_RST
;
MOVLW COMMANDREG ;0X01
MOVWF REGADR
MOVLW PCD_RESETPHASE;0X0F
MOVWF VALUE
CALL WRITERAWRC ;WRITERAWRC(COMMANDREG,PCD_RESETPHASE)
;
MOVLW MODEREG ;0X11
MOVWF REGADR
MOVLW 0X3D
MOVWF VALUE
CALL WRITERAWRC ;WRITERAWRC(MODEREG,0X3D)
;
MOVLW TRELOADREGL ;0X2D
MOVWF REGADR
MOVLW 0X1E
MOVWF VALUE
CALL WRITERAWRC ;WRITERAWRC(TRELOADREGL ,0X1E)
;
MOVLW TRELOADREGH ;0X2C
MOVWF REGADR
MOVLW 0
MOVWF VALUE
CALL WRITERAWRC ;WRITERAWRC(TRELOADREGH ,0)
;
MOVLW TMODEREG ;0X2A
MOVWF REGADR
MOVLW 0X8D
MOVWF VALUE
CALL WRITERAWRC ;WRITERAWRC(TMODEREG,0X8D)
;
MOVLW TPRESCALERREG ;0X2B
MOVWF REGADR
MOVLW 0X3E
MOVWF VALUE
CALL WRITERAWRC ;WRITERAWRC(TPRESCALERREG,0X3E)
;
MOVLW TXASKREG ;0X15
MOVWF REGADR
MOVLW 0X40
MOVWF VALUE
CALL WRITERAWRC ;WRITERAWRC(TXASKREG,0X40)
;
RETLW MI_OK ;0
;-------------------------------------------------------
;寻卡
;参数:REQ_CODE:寻卡方式 0X52:寻所有附合14443标准的卡;0X26:寻未进入休眠的卡
PCDREQUEST ;12
PCD_REQUEST PICC_REQALL,G_UCTBUF
MOVLW STATUS2REG ;0X08
MOVWF REGADR
MOVLW 0X08
MOVWF MASK
CALL CLEARBITMASK
;
MOVLW BITFRAMINGREG ;0X0D
MOVWF REGADR
MOVLW 0X07
MOVWF VALUE
CALL WRITERAWRC
;
MOVLW TXCONTROLREG ;0X14
MOVWF REGADR
MOVLW 0X03
MOVWF MASK
CALL SETBITMASK
;
MOVF REQ_CODE,W ;REQ_CODE=0X52
BSF STATUS,RP0
MOVWF MF522BUF0
BCF STATUS,RP0
;
PCD_COMF522 0X01 ;长度=1
CALL PCDCOMF522
MOVF KA_STS,W
;
BTFSS STATUS,Z
GOTO PR_ELSE
MOVF UNLENH,W
BTFSS STATUS,Z
GOTO PR_ELSE
MOVF UNLENL,W
XORLW 0X10
BTFSS STATUS,Z
GOTO PR_ELSE
;
MOVF PTAGTYPE,W ;状态OK且长度=0X10
MOVWF FSR
BSF STATUS,RP0
MOVF MF522BUF0,W ;MF522BUF0
MOVWF INDF
INCF FSR,F
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -