www.pudn.com > rfid.rar > rfid.asm, change:2007-07-04,size:4347b


;;;;;;;;;;;读卡号;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
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 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;