?? 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 + -