📄 rc500-1.asm
字号:
;=================================================
CHANGE_KEY:
MOV R1,#RF_SBUF
MOV R2,#6
CHANGE_KEY1:
MOV A,@R0
CPL A
ANL A,#0F0H
MOV B,A
MOV A,@R0
ANL A,#0F0H
SWAP A
ORL A,B
MOV @R1,A
INC R1
MOV A,@R0
SWAP A
CPL A
ANL A,#0F0H
MOV B,A
MOV A,@R0
ANL A,#0FH
ORL A,B
MOV @R1,A
INC R0
INC R1
DJNZ R2,CHANGE_KEY1
RET
;=================================================
; 传送密钥
;功能:将准备验证的密钥送到RC500的FIFO中
;入口:@RF_SBUF-@RF_SBUF+11=12字节密钥
;出口:CERR=0/1:成功/失败
;占用资源:ACC,B,R0-R7,PSW
;=================================================
PCD_KEY: CLR RC500_CE
SETB CERR
MOV A,#1
CALL PCD_SET_TIMER
MOV R0,#RF_SBUF+11
MOV R1,#RF_SBUF+13
MOV R2,#12
CALL MEM_COPYB
MOV R0,#RF_SBUF
MOV @R0,#PCD_LOADKEY
INC R0
MOV @R0,#12
CALL PCD_COM_TRANSCEIVE
MOV R0,#RF_SBUF
MOV A,@R0
JNZ PCD_KEY1
CLR CERR
PCD_KEY1:SETB RC500_CE
RET
;=================================================
;
PCD_AUTHENTICATION:
CLR RC500_CE
SETB CERR
MOV R1,#RegChannelRedundancy
MOV R2,#7
CALL WRITERC
MOV A,#1
CALL PCD_SET_TIMER
MOV R0,#RF_SBUF+5
MOV R1,#RF_SBUF+7
MOV R2,#6
CALL MEM_COPYB
MOV R0,#RF_SBUF
MOV @R0,#PCD_AUTHENT1
INC R0
MOV @R0,#6
CALL PCD_COM_TRANSCEIVE
MOV R0,#RF_SBUF
MOV A,@R0
JNZ PCD_AUTHENTICATION1
MOV R1,#REGSECONDARYSTATUS
CALL READRC
ANL A,#7
JNZ PCD_AUTHENTICATION1
MOV A,#1
CALL PCD_SET_TIMER
MOV R0,#RF_SBUF
MOV @R0,#PCD_AUTHENT2
INC R0
MOV @R0,#0
CALL PCD_COM_TRANSCEIVE
MOV R0,#RF_SBUF
MOV A,@R0
JNZ PCD_AUTHENTICATION1
MOV R1,#REGCONTROL
CALL READRC
ANL A,#8
JZ PCD_AUTHENTICATION1
CLR CERR
PCD_AUTHENTICATION1:
SETB RC500_CE
RET
;=================================================
; 读卡上一块数据
;入口:@RF_SBUF=要读的绝对块号
;出口:CERR=0/1:读成功/失败
; @RF_SBUF--@(RF_SBUF+15)=读出的数据
;占用资源:ACC,B,R0-R7,PSW
;=================================================
PCD_READ:CLR RC500_CE
SETB CERR
MOV A,#4
CALL PCD_SET_TIMER
MOV R1,#RegChannelRedundancy
MOV R2,#0FH
CALL WRITERC
MOV R0,#RF_SBUF
MOV A,@R0
MOV R0,#RF_SBUF+3
MOV @R0,A
MOV R0,#RF_SBUF
MOV @R0,#PCD_TRANSCEIVE
INC R0
MOV @R0,#2
INC R0
MOV @R0,#PICC_READ
CALL PCD_COM_TRANSCEIVE
MOV R0,#RF_SBUF
MOV A,@R0
JNZ PCD_READ1
MOV R0,#RF_SBUF+1
MOV A,@R0
CJNE A,#128,PCD_READ1
INC R0
MOV R1,#RF_SBUF
MOV R2,#16
CALL MEM_COPYA
CLR CERR
PCD_READ1:
SETB RC500_CE
RET
;=================================================
; 写数据到卡上的一块
;入口:@RF_SBUF=要写的块绝对地址
; @(RF_SBUF+1)--@(RF_SBUF+16)=写入数据
;出口:CERR=0/1:写成功/失败
;占用资源:ACC,B,R0-R7,PSW
;=================================================
PCD_WRITE:
CLR RC500_CE
SETB CERR
MOV A,#4
CALL PCD_SET_TIMER
MOV R1,#RegChannelRedundancy
MOV R2,#0FH
CALL WRITERC
MOV R0,#RF_SBUF+16
MOV R1,#RF_SBUF+19
MOV R2,#17
CALL MEM_COPYB
MOV R0,#RF_SBUF
MOV @R0,#PCD_TRANSCEIVE
INC R0
MOV @R0,#2
INC R0
MOV @R0,#PICC_WRITE
CALL PCD_COM_TRANSCEIVE
MOV R0,#RF_SBUF
MOV A,@R0
XRL A,#MI_NOTAGERR
JZ PCD_WRITE1
INC R0
MOV A,@R0
CJNE A,#4,PCD_WRITE1
INC R0
MOV A,@R0
ANL A,#0FH
CJNE A,#0AH,PCD_WRITE1
MOV A,#3
CALL PCD_SET_TIMER
MOV R0,#RF_SBUF
MOV @R0,#PCD_TRANSCEIVE
INC R0
MOV @R0,#16
MOV R0,#RF_SBUF+4
MOV R1,#RF_SBUF+2
MOV R2,#16
CALL MEM_COPYA
CALL PCD_COM_TRANSCEIVE
MOV R0,#RF_SBUF
MOV A,@R0
XRL A,#MI_NOTAGERR
JZ PCD_WRITE1
INC R0
INC R0
MOV A,@R0
ANL A,#0FH
CJNE A,#0AH,PCD_WRITE1
CLR CERR
PCD_WRITE1:
SETB RC500_CE
RET
;=================================================
; 命令卡进入休眠状态
;入口:无
;出口:CERR=0/1:成功/失败
;占用资源:ACC,B,R0-R7,PSW
;=================================================
PCD_HALT:CLR RC500_CE
SETB CERR
MOV A,#1
CALL PCD_SET_TIMER
MOV R0,#RF_SBUF
MOV @R0,#PCD_TRANSCEIVE
INC R0
MOV @R0,#2
INC R0
MOV @R0,#PICC_HALT
INC R0
MOV @R0,#0
CALL PCD_COM_TRANSCEIVE
MOV R1,#REGCOMMAND
MOV R2,#0
CALL WRITERC
MOV R0,#RF_SBUF
MOV A,@R0
CJNE A,#MI_OK,PCD_HALT1
CLR CERR
SETB RC500_CE
RET
PCD_HALT1:
CJNE A,#MI_NOTAGERR,PCD_HALT2
CLR CERR
PCD_HALT2:
SETB RC500_CE
RET
;=================================================
; 读RC500-EEPROM的数据
;入口:@RF_SBUF--@(RF_SBUF+1)=读取的起始地址(低位在前)
; @(RF_SBUF+2)=读字节数
;出口:CERR=0/1:读成功/失败
; @RF_SBUF--@RF_SBUF+15=读出的数据
;占用资源:ACC,B,R0-R7,PSW
;=================================================
PCD_READ_EE:
CLR RC500_CE
SETB CERR
MOV R0,#RF_SBUF+2
MOV A,@R0
MOV R5,A
MOV R1,#RF_SBUF+4
MOV R2,#3
CALL MEM_COPYB
MOV R0,#RF_SBUF
MOV @R0,#PCD_READE2
INC R0
MOV @R0,#3
CALL PCD_COM_TRANSCEIVE
MOV R0,#RF_SBUF
MOV A,@R0
JNZ PCD_READ_EE1
MOV R0,#RF_SBUF+2
MOV R1,#RF_SBUF
MOV A,R5
MOV R2,A
CALL MEM_COPYA
CLR CERR
PCD_READ_EE1:
SETB RC500_CE
RET
;=================================================
; 写数据到RC500-EEPROM
;入口:@RF_SBUF--@(RF_SBUF+1)=写起始地址(低位在前)
; @(RF_SBUF+2)=写字节数
; @(RF_SBUF+3).....=要写的数据
;出口:CERR=0/1:写成功/失败
;占用资源:ACC,B,R0-R7,PSW
;=================================================
PCD_WRITE_EE:
CLR RC500_CE
SETB CERR
MOV R0,#RF_SBUF+2
MOV A,@R0
MOV R5,A
MOV R2,A
ADD A,#RF_SBUF+2
MOV R0,A
ADD A,#1
MOV R1,A
CALL MEM_COPYB
MOV R0,#RF_SBUF
MOV R1,#RF_SBUF+2
MOV A,@R0
MOV @R1,A
INC R0
INC R1
MOV A,@R0
MOV @R1,A
MOV R0,#RF_SBUF
MOV @R0,#PCD_WRITEE2
INC R0
MOV A,R5
ADD A,#2
MOV @R0,A
CALL PCD_COM_TRANSCEIVE
MOV R0,#RF_SBUF
MOV A,@R0
JNZ PCD_WRITE_EE1
CLR CERR
PCD_WRITE_EE1:
SETB RC500_CE
RET
;=================================================
; 调RC500-EEPROM的密钥
;功能:将存在RC500的EEPROM中的密钥调入RC500的FIFO
;入口:@RF_SBUF=EEPROM低位地址
; @(RF_SBUF+1)=EEPROM高位地址
;出口:CERR=0/1:成功/失败
;占用资源:ACC,B,R0-R7,PSW
;=================================================
LOADKEYEE:
CLR RC500_CE
SETB CERR
MOV R0,#RF_SBUF
MOV R1,#RF_SBUF+2
MOV A,@R0
MOV @R1,A
MOV @R0,#PCD_LOADKEYE2
INC R0
INC R1
MOV A,@R0
MOV @R1,A
MOV @R0,#2
CALL PCD_COM_TRANSCEIVE
MOV R0,#RF_SBUF
MOV A,@R0
JNZ LOADKEYEE1
CLR CERR
LOADKEYEE1:
SETB RC500_CE
RET
;=================================================
; 启动RC500天线发射
;每次启动或关闭天险发射之间应至少有1ms
;的间隔,执行完初始化RC500后天线已启动
;入口:无
;出口:无
;占用资源:ACC,B,R1,R2
;=================================================
PCD_RFON: CLR RC500_CE
MOV R1,#RegTxControl
MOV R2,#3
CALL SETBIT
SETB RC500_CE
RET
;=================================================
; 关闭RC500天线发射
;每次启动或关闭天险发射之间应至少有1ms
;的间隔
;入口:无
;出口:无
;占用资源:ACC,B,R1,R2
;=================================================
PCD_RFOFF:CLR RC500_CE
MOV R1,#RegTxControl
MOV R2,#3
CALL CLEARBIT
SETB RC500_CE
RET
;=================================================
; 和RC500通讯
;入口:@RF_SBUF=RC500命令字
; @(RF_SBUF+1)=发送的数据长度
; @(RF_SBUF+2)...@(RF_SBUF+N)=发送数据
;出口:@RF_SBUF=错误字
; @(RF_SBUF+1)=接收到的位长度
; @(RF_SBUF+2)...@(RF_SBUF+N)=接收数据
;=================================================
PCD_COM_TRANSCEIVE:
CLR F0
MOV R3,#5
MOV R4,#4
MOV R0,#RF_SBUF
MOV A,@R0
CJNE A,#PCD_IDLE,P_C_T1
MOV R3,#0
MOV R4,#0
SJMP PCD_COM_TRANSCEIVE0
P_C_T1: CJNE A,#PCD_WRITEE2,P_C_T2
MOV R3,#11H
MOV R4,#10H
SJMP PCD_COM_TRANSCEIVE0
P_C_T2: CJNE A,#PCD_READE2,P_C_T3
MOV R3,#7
MOV R4,#4
SETB F0
SJMP PCD_COM_TRANSCEIVE0
P_C_T3: CJNE A,#PCD_CALCCRC,P_C_T4
MOV R3,#11H
MOV R4,#10H
SJMP PCD_COM_TRANSCEIVE0
P_C_T4: CJNE A,#PCD_AUTHENT2,P_C_T5
MOV R3,#4
MOV R4,#4
SJMP PCD_COM_TRANSCEIVE0
P_C_T5: CJNE A,#PCD_RECEIVE,P_C_T6
MOV R3,#6
MOV R4,#4
SETB F0
SJMP PCD_COM_TRANSCEIVE0
P_C_T6: CJNE A,#PCD_TRANSCEIVE,PCD_COM_TRANSCEIVE0
MOV R3,#3DH
MOV R4,#4
MOV R1,#REGBITFRAMING
SETB F0
PCD_COM_TRANSCEIVE0:
MOV R0,#0
MOV A,#0
MOVX @R0,A
MOV R0,#REGINTERRUPTEN
MOV A,#7FH
MOVX @R0,A
MOV R0,#REGINTERRUPTRQ
MOV A,#7FH
MOVX @R0,A
MOV R0,#REGCOMMAND
MOV A,#PCD_IDLE
MOVX @R0,A
MOV R1,#RegControl
MOV R2,#1
CALL SETBIT
MOV R0,#0
CLR A
MOVX @R0,A
MOV R0,#REGINTERRUPTEN
MOV A,R3
ORL A,#80H
MOVX @R0,A
MOV R1,#RF_SBUF+1
MOV A,@R1
JZ PCD_COM_TRANSCEIVEA
MOV R2,A
INC R1
MOV R0,#REGFIFODATA
PCD_COM_TRANSCEIVE1:
MOV A,@R1
MOVX @R0,A
INC R1
DJNZ R2,PCD_COM_TRANSCEIVE1
PCD_COM_TRANSCEIVEA:
MOV R0,#REGCOMMAND
MOV R1,#RF_SBUF
MOV A,@R1
MOVX @R0,A
MOV R0,#REGINTERRUPTRQ
MOV R6,#20H
MOV R7,#0FFH
PCD_COM_TRANSCEIVE2:
CALL WAIT_RC500
MOV A,R6
JZ PCD_COM_TRANSCEIVE3
MOV A,R3
MOV C,ACC.5
MOVX A,@R0
JNC PCD_COM_TRANSCEIVEB
JB ACC.5,PCD_COM_TRANSCEIVE3
PCD_COM_TRANSCEIVEB:
ANL A,R4
JZ PCD_COM_TRANSCEIVE2
MOV R1,#RegErrFlag
CALL READRC
MOV B,A
ANL A,#17H
JNZ PCD_COM_TRANSCEIVE4
MOV R0,#RF_SBUF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -