📄 id file.asm
字号:
;ID卡读卡器读程序
RED_LED EQU P1.0
GREEN_LED EQU P1.1
BEEP EQU P1.2 ;蜂鸣器
org 0000h
ljmp main
org 0003h
reti
org 000bh
ljmp ok1
org 0013h
reti
org 001bh
reti
org 0023h
reti
org 0100h
main: clr p1.0
setb p1.1
clr p1.2
mov sp,#60h
mov tmod,#01h
;数据存储区30H~3AH清0。
MOV A,#00H
MOV R1,#30H
MOV R3,#11
ZERO: MOV @R1,A
INC R1
DJNZ R3,ZERO
acall ptop
ptop:
mov tl0,#55h ;512us定时
mov th0,#1dh
setb tr0
setb et0
setb ea
ret
ok1:
mov r2,#01h
mov r7,#09h ;起始信息流计数器,9个'1'
dd: mov tl0,#55h ;512us定时
mov th0,#1dh
lcall loop
djnz r7,dd
setb beep
lcall yanshi
nop
lcall yanshi
clr beep
SJMP REAL_DA
loop: jb p1.6,ok1 ;等待一个稳定的低电平
reti
wrong: ljmp ok1 ;如果时间小于半个周期。重新开始
REAL_DA:MOV R2,#00H
MOV R7,#11 ;还有11行数据。
MOV R0,#30H ;数据起址。
ONEBYT :MOV R3,#05 ;每5为数据存在一个字节,
MOV R4,#00H ;便于检查校验位。
YIWEI: MOV TH0,#00H
MOV TL0,#00H
SETB TR0
BUBIAN: MOV A,R2
JZ HIGH1 ;R2为0表示当前是低电平,应等待高电平
LOW1: JB P1.6,LOW1 ;R2=1,等待稳定的低电平(下跳沿)
BIAN: MOV R2,#00H ;当前电平为低电平。
;等到翻转,计算时间。
READ: MOV A,TH0
CLR C
SUBB A,#01H
JNZ BUBIAN
;A=01H表示是全周期翻转,为数据翻转。
;A=00H表示是空翻转。
;将数据存入当前数据字节最低位。
;R2=00H,数据为”1”,R2=01H,数据为”0”
CLR TR0
MOV A,@R0
RL A
INC A
CLR C
SUBB A,R2
MOV @R0,A
DJNZ R3,YIWEI
INC R0 ;满5位,地址加1。
DJNZ R7,ONEBYT
;开始检查校验位。并将校验位从数据中去除。
MOV R2,#10
MOV R0,#30H
MOV R1,#60H ;卡号的存储起址。
FIX: MOV A,@R0
RRC A ;校验位移入C。
MOV @R1,A
MOV 10H,C
ANL C,/P
MOV 11H,C
MOV C,P
ANL C,/10H
ORL C,11H
JC WRONG ;校验出错。
INC R0
INC R1
DJNZ R2,FIX
;行校验完成,进行列校验。
MOV R2,#09
MOV R1,#60H
CLR A
MOV A,3AH ;列校验字节送入A。
RR A
MOV 3AH,A
MOV A,@R1
CHECK: INC R1
XRL A,@R1
DJNZ R2,CHECK
CLR C
SUBB A,3AH
JNZ WRONG
;将每个字节中的4位有效数据取出,
;每两个字节压缩成一个字节。
MOV R0,#60H
MOV R1,#60H
MOV R2,#05H
COLLAT: MOV A,@R0
SWAP A
INC R0
ORL A,@R0
MOV @R1,A
INC R1
INC R0
DJNZ R2,COLLAT
clr p1.1
RET
HIGH1: JNB P1.6,HIGH1
MOV R2,#01H ;当前电平为高电平。
SJMP READ
yanshi: mov r3,#255
d1: mov r4,#255
d2: djnz r4,d2
djnz r3,d1
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -