📄 untitled document.htm
字号:
<P align=left> LJMP
RQT_EXIT<BR>;---------------------------------------------------------------- <BR>BE_ERR:
MOV R7,#0AH ;READY TO DELAY 500us<BR> ACALL D500US
;延时500us<BR> MOV B,#0BH ;BE error flag is 0BH </P>
<P align=left> ; MOV A,#88H<BR> ; ACALL SEND_TO_BUF01<BR> ; ACALL
SEND_TO_BUF23<BR>;---------------------------------------------------------------- <BR>RQT_EXIT:<BR> LJMP REPEAT_RQT<BR>;---------------------------------------------------------------- <BR>request_exit:<BR> RET<BR>;==================End
of MCM Request Operation =======================</P>
<P align=left></P>
<P align=left>2. 对MCM200(SB201)“AntiCollision”(防卡片重叠)
指令的汇编语言应用程序的设计<BR>功能:调用该汇编语言子程序,将执行MCM “AntiCollision”(防卡片重叠)
指令操作。如果卡片读写器的天线之有效工作距离内有多张重叠的Mifare 1
非接触式IC射频卡,则该指令将帮助程序员选择其中指定的一张卡片进行操作。“AntiCollision”(防卡片重叠)
指令操作将读取卡片的系列号(SERIAL
NUMBER)字节。<BR>程序说明:<BR>1.)在以下的汇编语言程序中,用到了一些其他的子程序(和上述的“Request std和Request
all”指令操作中的相同),分别为:<BR>D500US:
为500us的延时子程序;<BR>H_SEND_TO_BUF01:(同上)<BR>H_SEND_TO_BUF23:(同上)<BR>SEND_TO_BUF01:(同上)<BR>SEND_TO_BUF23:(同上)<BR>DISPLAY:(同上)<BR>H_DISPLAY:(同上)<BR>2.)在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,这些可能是用于主控程序或是调试而用。特加以说明。等等。<BR>3.)在本汇编语言子程序中,校验,计算卡片序列号的方法采用了相邻两个字节相互异或,得出的结果与下一个字节再异或这样一种方法。前四个字节异或的结果与第5个字节应该相同,即与第5个字节异或的结果应为“00H”,否则MCU读到的卡片的序列号有错。因此对于我们来说,卡片的序列号前四个字节是有意义的,第5个字节仅仅用于校验之用。并无实际意义。我们通常所说的序列号指的是前4个字节。并不包括第5个字节。这五个字节被存储在卡片的第0扇区的第0块中,由卡片的生产商制定,固化,不得更改,且在世面上流通的Mifare
1
S50系列的非接触式IC射频卡中,每一张卡片的序列号都不相同,都是唯一的。<BR>例如,某一张卡片的序列号为:007e0a42H,则计算异或方法如下:<BR>00h异或7eh:(第一和第二字节异或)<BR>0000
0000<BR>0111 1110<BR> ---------------------------<BR>第一次异或结果为: 0111
1110 为7eh;<BR>将7eh与0ah相异或: 0111 1110<BR>0000
1010<BR> -------------------------------<BR>第二次异或结果为: 0111
0100 为74h;<BR>将74h与42h相异或: 0111 0100<BR> 0100
0010<BR> -------------------------------<BR>第三次异或结果为: 0011
0110
为36h;<BR>这样前四个字节得到的异或结果为36H,如果读到的卡片上的序列号的第5个字节为36H,则证明此次得到的卡片的序列号是有效的。如果读到的卡片上的序列号的第5个字节不为36H,则证明此次得到的卡片的序列号是无效的。<BR>第四次异或为:
将第三次异或结果36h与第5个字节相异或,如果第5个字节读到的值为36H,则:<BR>将36h与36h相异或: 0011 0110
<BR> 0011 0110<BR>
-------------------------------<BR>第四次异或结果为: 0000 0000
为00h<BR>这样四次异或结果为00H,表明MCU读取的卡片序列号是有效的。具体的程序如下,请读者仔细分析,定能理解上述关于卡片序列号的校验方法。</P>
<P align=left>程序清单如下:<BR>;======================== MCM ANTICOLLISION
OPERTION ====================<BR>anticollision:</P>
<P align=left>ANTI_REPEAT:<BR> MOV A, #10H<BR> MOV
R0,#03H<BR> MOVX @R0,A ;BCNTS = 10H<BR> MOV A, #0CH<BR> SETB
ACC.0 ;AC = 1<BR> MOV R0,#01H<BR> MOVX @R0,A <BR> MOV
R7,#02H ;DELAY 1000US<BR> ACALL D500US<BR> MOV A, #93H<BR> MOV
R0,#00H<BR> MOVX @R0,A ;DATA = 93H (ANTICOLLISION OPERATION
CODE)<BR> MOV A, #20H<BR> MOV R0,#00H<BR> MOVX @R0,A ;DATA =
20H<BR> MOV A, #28H<BR> MOV R0,#04H<BR> MOVX @R0,A ;BCNTR =
28H <BR> MOV A, #0AH<BR> MOV R0,#06H<BR> MOVX @R0,A ;TOC =
0AH<BR>ANTI_RD_STACON:<BR> MOV R0,#01H<BR> MOVX A,@R0 ;READ:
STACON ==> A<BR> JNB ACC.7,ANTI_RD_STACON ;IF DV = 1? NO,IT WILL
READ AGAIN<BR>;--------------------- NOW DV=1, JUDG OTHER
FLAGS---------------------<BR> MOV A, #00H<BR> MOV
R0,#06H<BR> MOVX @R0,A ;TOC = 00H<BR> JB ACC.6, ANTI_TE_ERR
;TE ERR<BR> JB ACC.3, ANTI_BE_ERR ;BE ERR<BR>;----------------NOW
NO ERRORS OCCUR,CAN READ SNR ----------------<BR> MOV R7,#04H ;R7 IS
A COUNTER,FOR READING 4-BYTE SERIAL NUMBER<BR> MOV B,#00H<BR> MOV
R1,#40H<BR> MOV R0,#00H<BR>ANTI_LOOP:<BR> MOVX A,@R0 <BR> MOV
@R1,A ;STORE SNR(1)--(4) IN 40H,41H,42H,43H<BR> XRL B,A
;CACULATE<BR> INC R1<BR> DJNZ R7,ANTI_LOOP<BR> MOVX A,@R0 ;READ
5th CHK_SUM_VALUE<BR> XRL A,B ;CACULATE<BR> JNZ
ANTI_CHK_ERR_EXIT ;If Z=0? If Not,CHK_SUM_VALUE
ERROR<BR>;------------------------- NOW THE SNR IS VALID
----------------------------<BR>_OK:<BR>;MOV B,#00H ;IF SNR OK,THEN
(B) = 00H <----RETURN_VALUE</P>
<P align=left> MOV R1,#40H ;(40H) ==> SNR(1)<BR> MOV
A,@R1<BR> ACALL SEND_TO_BUF01 ;SEND SNR(1) TO DISP_BUF_LOW<BR> INC
R1 ;(41H) ==> SNR(2)<BR> MOV A,@R1<BR> ACALL
SEND_TO_BUF23 ;SEND SNR(2) TO DISP_BUF_HIGH<BR> INC R1 ;(42H)
==> SNR(3)<BR> MOV A,@R1<BR> ACALL H_SEND_TO_BUF01 ;SEND SNR(3)
TO H_DISP_BUF_LOW<BR> INC R1 ;(43H) ==> SNR(4)<BR> MOV
A,@R1<BR> ACALL H_SEND_TO_BUF23 ;SEND SNR(4) TO H_DISP_BUF_HIGH</P>
<P align=left> SETB P2.6 ;OK LAMP NOW WORKING P2.3<BR> ACALL
SPK_ON ;if ok then spk on<BR> MOV B,#00H ;IF SNR OK,THEN (B)
= 00H <----RETURN_VALUE<BR> AJMP
ANTI_OK_EXIT<BR>;----------------------ERROR
PROCESS-------------------------------<BR>ANTI_TE_ERR:<BR> MOV
B,#01H ;IF TE_ERR, THEN (B) = 01H<BR> AJMP
ANTI_ERR_EXIT<BR>ANTI_BE_ERR:<BR> MOV B,#0AH ;IF BE_ERR, THEN (B)
= 01H<BR> AJMP ANTI_ERR_EXIT<BR>;------------------------------ exit
process -----------------------------<BR>ANTI_CHK_ERR_EXIT:<BR> MOV
B,#08H<BR> MOV A,B<BR> ;ACALL H_SEND_TO_BUF23 ;SEND
RETURN_ERR_VALUE TO
DISP_BUF_HIGH<BR>ANTI_ERR_EXIT:<BR>ANTI_OK_EXIT:<BR> RET<BR>;--------------------
End of MCM AntiCollision Operation -----------------</P>
<P align=left>(待续)<BR><BR><BR>来源: 《金卡工程》2000.9 <BR><BR><BR></P>
<P align=right></P>
<P align=right></P>
<P align=right></P>
<P align=right><A href="file:///E|/index/index.htm">返回首页</A>
</P></TD></TR></TBODY></TABLE><B></B></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -