📄 rfid.asm
字号:
;;;;;;;;;;;读卡号;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READ: MOV R0,#HEX0
MOV R1,#10H ;预读16个字节
READ1: MOV @R0,#00H
INC R0 ;清除缓冲区@R0
DJNZ R1,READ1
MOV R0,#HEX0
MOV R1,#16H
READ2: JB DATE,$
DJNZ R1,READ2 ;循环等待稳定的低电平
MOV STAT,#00H
LCALL IFJMP ;有跳变
MOV R1,#80H ;连续读取128位,
MOV R2,#00H
MOV TH0,#00H
MOV TL0,#05H
SSS: LCALL JMPOK
JC READ4
SJMP SSS
READ3: LCALL JMPOK
JNC READ5 ;半周期
MOV A,#01H
RET
READ4: LCALL JMPOK ;
JNC READ3
READ5: MOV A,STAT
RRC A
CPL C
MOV A,@R0
RLC A
MOV @R0,A ;保存状态
INC R2
CJNE R2,#08H,READ6
MOV R2,#00H
INC R0
READ6: DJNZ R1,READ4 ;未读完,继续
MOV R0,#HEX0
MOV R2,#08H
MOV A,R0
ADD A,#08H
MOV R1,A ;读完,比较前8字节与后8字节
READ7: MOV A,@R0
CLR C
SUBB A,@R1
JZ READ8
RET ;不等,返回错误
READ8: INC R1
INC R0
DJNZ R2,READ7
RET ;相等,解码
;;;;;;;;;;;;;解码;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;R0,R1,R2,R3,R4,R5,R6
;IN: R0,R1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DEMOD: MOV R0,#HEX0
MOV R1,#HEX0
MOV R2,#09H
MOV R3,#37H ;剩余55位数据
MOV R4,#05H ;每5位为一字节
MOV R5,#08H
MOV R6,#10H
MOV STAT,#00H
PUSH 01H
CLR C
DEMOD1: MOV A,@R0
DEMOD2: RLC A
JNC DEMOD3
DJNZ R2,DEMOD4
SJMP DEMOD5 ;出现9个高电平,数据开始
DEMOD3: MOV R2,#09H
DEMOD4: DJNZ R5,DEMOD2
MOV R5,#08H
INC R0
DJNZ R6,DEMOD1
MOV A,#01H
POP 01H ;未出现9个高电平,读卡错误
RET
;-------------------------------
DEMOD5: DJNZ R5,DEMOD6
SJMP DEMOD9 ;移完8位,取下一字节
DEMOD6: RLC A
XCH A,STAT ;未移完,继续
RLC A
XCH A,STAT
DJNZ R4,DEMOD8
MOV R4,#05H
DJNZ R3,DEMODA
MOV @R1,STAT ;55位全部移完
MOV A,STAT
JNB ACC.0,AAA ;结束位为0
POP 01H
RET
AAA: POP 01H
MOV R2,#00H
MOV R3,#00H
MOV R4,#00H
MOV R5,#00H ;计算列校验和
MOV R6,#0BH
LXRL: MOV A,@R1
CLR C
RRC A
MOV @R1,A
RRC A
JNC LXRL1
INC R2
LXRL1: RRC A
JNC LXRL2
INC R3
LXRL2: RRC A
JNC LXRL3
INC R4
LXRL3: RRC A
JNC LXRL4
INC R5
LXRL4: INC R1
DJNZ R6,LXRL ;计算列校验和
MOV A,R2
JB ACC.0,LXRL5
MOV A,R3
JB ACC.0,LXRL5
MOV A,R4
JB ACC.0,LXRL5
MOV A,R5
JB ACC.0,LXRL5
CLR A
RET
LXRL5: MOV A,#01H
RET
DEMOD8: DEC R3
DJNZ R5,DEMOD6
DEMOD9: MOV R5,#08H
INC R0
MOV A,@R0 ;移完8位,取下一字节
SJMP DEMOD6
DEMODA: MOV @R1,STAT
INC R1
XCH A,STAT
MOV R2,#05H
MOV B,#00H
HXRL1: RRC A ;行校验和计算
JNC HXRL
INC B
HXRL: DJNZ R2,HXRL1
XCH A,STAT
JNB B.0,DEMODB ;校验正确,继续
POP 01H ;校验错误,返回
MOV A,#01H
RET
DEMODB: MOV STAT,#00H
SJMP DEMOD5
;;;;;;;;;;;;;测跳变时长;;;;;;;;;;;;;;;;;;;;;
JMPOK: LCALL IFJMP
CLR C
MOV A,#7AH ;70h
SUBB A,TL0
MOV A,#00H ;01H
SUBB A,TH0
MOV TH0,#00H
MOV TL0,#05H
SETB TR0
RET
;;;;;;;;;;;;;检测跳变;;;;;;;;;;;;;;;;;;;;;;;
IFJMP: MOV A,#00H
MOV C,DATE
RLC A
CJNE A,STAT,IFJMP1
SJMP IFJMP
IFJMP1: MOV B,A
MOV A,#00H
MOV C,DATE
RLC A
CJNE A,B,IFJMP
MOV STAT,A
CLR TR0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -