📄 untitled document.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0065)http://www.flyring.com.cn/chinese/UploadFiles/200442161059449.htm -->
<HTML><HEAD><TITLE>Untitled Document</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY background="" bgColor=#ffffff text=#000000>
<DIV align=center>
<P><BR><FONT color=#0000ff><B>关于非接触式IC智能(射频)卡及其读写设备内核技术的研究与应用开发(连载9) <BR><BR>作者:
上海华东磁记录电子公司 张敏 <BR></B><BR><B><BR></B></FONT></P>
<TABLE border=1 borderColor=#ff9900 width="80%">
<TBODY>
<TR>
<TD align=left height=3601 vAlign=top>
<P><BR><BR></P>
<P>3. 对MCM200(SB201)“Select”(选卡片) 指令的汇编语言应用程序的设计<BR>功能:调用该汇编语言子程序,将执行MCM
“Select”(选卡片) 指令操作。如果卡片读写器的天线之有效工作距离内有多张重叠的Mifare 1
非接触式IC射频卡,则该指令在程序员成功完成“AntiCollision”操作之后,将帮助程序员正式选择其中指定的一张卡片进行操作(包括密码存取,密码认证,卡片上指定扇区的读写,等等。)“Select”(选卡片)
指令操作将读取卡片的SIZE字节。<BR>程序说明:<BR>1.)在以下的汇编语言程序中,用到了一些其他的子程序(和上述的“Request
std和Request all”指令操作中的相同),分别为:<BR>D500US:
(与上述功能相同);<BR>H_SEND_TO_BUF01:(与上述功能相同);<BR>H_SEND_TO_BUF23:(与上述功能相同);<BR>SEND_TO_BUF01:(与上述功能相同);<BR>SEND_TO_BUF23:(与上述功能相同);<BR>DISPLAY:(与上述功能相同);<BR>H_DISPLAY:(与上述功能相同);<BR>等等。<BR>2.)在以下的汇编语言程序中,读者可能会碰到一些寄存器变量,或其他应用子程序,这些可能是用于主控程序或是调试而用。特加以说明。
</P>
<P>程序清单如下:<BR>;====================MCM SELECT
OPERATION=====================<BR>select:<BR> ;SETB PSW.3<BR> ;SETB
PSW.4<BR> MOV A,#0CH<BR> MOV R0,#01H<BR> MOVX @R0,A
;STACON() = 0CH<BR> MOV A,#0F0H<BR> MOV R0,#02H<BR> MOVX
@R0,A ;ENABLE() = F0H<BR> MOV A,#38H<BR> MOV
R0,#03H<BR> MOVX @R0,A ;BCNTS() = 38H =56 D<BR> MOV
A,#08H<BR> MOV R0,#04H<BR> MOVX @R0,A ;BCNTR() = 08H
<--RECEIVE ONE BYTE:SIZEBYTE<BR> MOV A,#93H<BR> MOV
R0,#00H<BR> MOVX @R0,A ;DATA() = 93H -->SELECT INSTRACTION
CODE<BR> MOV A,#70H<BR> MOV R0,#00H<BR> MOVX @R0,A
;IMPORTANT:
DATA()=70H--BITCOUNT=70Hbits<BR>;-----------------------------------------------------------------------<BR> MOV
R7,#04H ;R7 IS A COUNTER,FOR WRITING 04H BYTES TO DATA<BR> MOV
B,#00H<BR> MOV R0,#00H<BR> MOV R1,#40H ;THE FIRST ADDRESS OF
SNR. 40H---43H<BR>SELECT_WRT_LOOP:<BR> MOV A,@R1<BR> MOVX
@R0,A<BR> XRL B,A<BR> INC R1<BR> DJNZ R7,
SELECT_WRT_LOOP<BR> MOV A,B<BR> MOVX @R0,A ;SEND THE 5th
CHK_SUM_VALUE<BR> MOV A,#0AH<BR> MOV R0,#06H<BR> MOVX @R0,A
;TOC() = 0AH<BR>SEL_RD_STACON_AGAIN:<BR> MOV R0,#01H<BR> MOVX
A,@R0 ;READ STACON() ==> A<BR> MOV B,A<BR> JNB ACC.7,
SEL_RD_STACON_AGAIN ;IF DV=1? IF NOT,REPEAT READ <BR> MOV
B,A<BR>;------------- NOW DV=1, DATA VALID
----------------------<BR> MOV A,#00H<BR> MOV R0,#06H<BR> MOVX
@R0,A ;TOC() = 00H<BR>;------------- NOW JUDGE ANY DATA ERRORS
--------------------<BR> MOV A,B<BR> JB ACC.6, SEL_TE_ERR ;TE
ERR<BR> JB ACC.5, SEL_PE_ERR ;PE ERR<BR> JB ACC.3, SEL_BE_ERR ;BE
ERR<BR> JB ACC.4, SEL_CE_ERR ;CE ERR<BR>;------------- NOW NO
ERRORS,READING CARD SIZE -----------------<BR> MOV R0,#00H<BR> MOVX
A, @R0 ;READ SIZE: DATA() ==> A<BR> MOV 44H,A ;STORE SIZE
IN 44H<BR> ACALL SEND_TO_BUF01 ;SEND SIZE TO DISP_BUF_LOW<BR> SETB
P2.6 ;OK LAMP NOW WORKING P2.3<BR> ACALL SPK_ON ;if ok then
spk on</P>
<P> MOV B,#00H ;SELECT OPERATION'S OK RETURN_VALUE=00H<BR> MOV
A,B ;READY FOR DISSPLAY IN DISP_BUF_HIGH(23)<BR> LJMP
SEL_OK_EXIT ;IF OK, EXIT SELECT OPERATION<BR>;-------------------ERRORS
PROCESS------------------------------- <BR>SEL_TE_ERR:<BR> MOV
B,#01H <BR> LJMP SEL_ERR_EXIT<BR>SEL_PE_ERR:<BR> MOV
B,#05H <BR> LJMP SEL_ERR_EXIT<BR>SEL_CE_ERR:<BR> MOV
B,#02H <BR> LJMP SEL_ERR_EXIT<BR>SEL_BE_ERR:<BR> MOV
R7,#0AH<BR> ACALL D500US<BR> MOV B,#0BH<BR> LJMP
SEL_ERR_EXIT<BR>;----------------------EXIT------------------------<BR>SEL_ERR_EXIT:<BR> MOV
A,B<BR>SEL_OK_EXIT:<BR> ACALL SEND_TO_BUF23 ;SEND ERR_RETURN_VALE TO
DISP_BUF_HIGH<BR> RET<BR>;------------------------ End of MCM
AntiCollision Operation -----------------</P>
<P><BR>通过以上对MCM的几个指令的软件设计,读者应该能有较大的信心,将MCM其他的一些指令也能设计成功。以供主控程序随时调用。</P>
<P>(二). 对MCM200(SB201)组成的DEMO电路的主控应用程序设计和开发</P>
<P>1. 硬件电路请参照所附的DEMO电路图纸</P>
<P>2. 软件清单如下</P>
<P>程序清单如下:<BR>;====================================================================<BR>; WRITTEN
BY ROCKY,
OCT'1999<BR>;====================================================================<BR> ORG
0000H<BR>start:<BR> LJMP MAIN<BR> NOP<BR>
NOP<BR>;--------------------------<BR> ;ORG 001BH<BR> ;LJMP
0500H<BR>;--------------------------<BR> ORG 0080H<BR>MAIN:<BR> MOV
SP,#0E1H<BR> NOP<BR> CLR EA ;CLOSE CPU
INT<BR> CLR P2.5 ;RESET MCM (-RST=0)<BR> SETB P2.4
;RESET MCM (-CS =1)<BR> NOP<BR> ACALL INIT_DISP_BUF <BR> ACALL
DISPLAY<BR> ACALL H_DISPLAY<BR> NOP<BR> CLR P2.6 ;CLOSE OK
LAMP <BR> setb p2.0 ;disenable KB function<BR> mov
p1,#11110000b ;init P1 port:P1.0~~P1.3-->out
(line)<BR> ; P1.4~~P1.7-->in (colum)<BR> SETB
P2.5 ;RESET MCM (-RST=1)<BR> CLR P2.4 ;SELECT MCM
(-CS=0)<BR> ACALL D500MS<BR> MOV A,#80H ;SOFTWARE_RESET
MCM<BR> MOV R0,#01H<BR> MOVX @R0,A<BR> ACALL D500MS<BR> ACALL
SPK_ON ;SPEAK ON<BR> ;MOV 21H,#01H ;THE
kb_TEST_CHAR<BR>KB_LOOKING:<BR> LCALL KB_SCAN<BR> ACALL
DISPLAY<BR> ACALL H_DISPLAY<BR> CLR P2.6 ;CLOSE OK
LAMP P2.3<BR> AJMP KB_LOOKING<BR>KB_ALL_EXIT:<BR> MOV R2,#00H
;SET RQT_STD<BR> SETB P2.5 ;RESET: MCM ON (-RST=1) P1.4<BR>
CLR P2.4 ;SELECT MCM ON
(-CS=0) P1.5<BR>;------------------------------------<BR>REPEAT:<BR> SETB
P2.5 ;RESET: MCM ON (-RST=1)P1.4<BR> CLR P2.4 ;SELECT MCM ON
(-CS=0)
P1.5<BR>;==================================================<BR> ACALL
REQUEST ;MCM REQUEST
OPERATION<BR>;==================================================<BR> ACALL
DISPLAY<BR> ACALL H_DISPLAY<BR> ACALL D500MS<BR> CLR
P2.6 ;CLEAR OKLAMP P2.3<BR> ACALL INIT_DISP_BUF<BR> ACALL
DISPLAY<BR> ACALL
H_DISPLAY<BR>;=========================================================<BR> ACALL
ANTICOLLISION ;MCM ANTICOLLISION
OPERATION<BR>;=========================================================<BR> ACALL
DISPLAY<BR> ACALL H_DISPLAY<BR> ACALL D500MS<BR> CLR
P2.6 ;CLEAR OKLAMP P2.3<BR> ACALL INIT_DISP_BUF<BR> ACALL
DISPLAY<BR> ACALL
H_DISPLAY<BR>;=========================================================<BR> ACALL
SELECT ;MCM SELECT
OPERATION<BR>;=========================================================<BR> ACALL
DISPLAY<BR> ACALL H_DISPLAY<BR> ACALL D500MS<BR> CLR
P2.6 ;CLEAR OKLAMP P2.3<BR> ACALL INIT_DISP_BUF<BR> ACALL
DISPLAY<BR> ACALL H_DISPLAY<BR> <BR>;+++++++++++++++++++++ set
up register/ram for load_key()++++++++++++++++++<BR> mov 7FH,#0ABH
<BR> MOV 7EH, #00H ;(7EH) = 00H-->SELECT
KEYSET0 (KS1=0;KS0=0)<BR> MOV 7DH,#02H ;(7DH): 1)SELECT KEYA or
KEYB<BR> ; 2)SELECT sector_ADDRESS :0-15<BR> MOV
7CH,#60H ;(7CH) = 47H-->TKey(1) FIRST
ADDRESS<BR>;=========================================================<BR> ACALL
LOAD_KEY ;MCM LOAD_KEY
OPERATION<BR>;=========================================================<BR>(待续)<BR><BR><BR>来源:
《金卡工程》2000.10 <BR><BR></P>
<P></P>
<P> <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 + -