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

📄 rc500-1.asm

📁 这是一个真正的RC500读卡程序,稍加修改就可以应用在你的程序之中。
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;=================================================
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 + -