單片機實(shí)現通用存貯器IC卡讀寫(xiě)
3、讀寫(xiě)操作軟件
當系統采用6MHz晶體振蕩器時(shí)所定義的I/O口線(xiàn)及器件地址如下:
SCL BIT P1.7
SDA BIT P1.6
DEVICEAD_W DATA 10100000B ;寫(xiě)卡器件地址
DEVICEAD_R DATA 10100001B ;讀卡器件地址
3.1 開(kāi)始條件(START_IC)
在開(kāi)始條件下,當SCL為高電平時(shí),SDA由高轉為低。程序如下:
START_IC:CLR SCL;SCL低電平時(shí)才允許SDA更改
NOP ;加入空指令延時(shí)以確保信號可靠
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
NOP
RET
3.2 停止條件(STOP_C)
在停止條件下,當SCL為高電平時(shí),SDA由低轉為高。程序如下:
STOP_IC:CLR SCL
NOP
NOP
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SCL
NOP
NOP
CLR SDA
RET
3.3 確認信號(ACK_IC)
在接收方應答下,每收到一字節后便將SDA電平拉低,程序如下:
ACK_IC:CLR SCL
NOP
NOP
CLR SDA
NOP
NOP
SEIB SCL
NOP
NOP
CLR SCL
NOP
SETB SDA
NOP
RET
3.4 寫(xiě)一字節數據到IC卡(WR_BYTE)
在下列程序中,參數A表示源數據,R5表示字節位數。
WR_BYTE:MOV R5,#08 ;一字節8位數據
CLR SCL
NOP
NOP
WR_BYTE1:RLC A ;帶進(jìn)位位左移,A.8->C
MOV SDA,C ;SCL低電平時(shí)改變SDA上的數據
NOP
SETB SCL ;拉高SCL把數據發(fā)送出去
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R5,WR_BYTE1;依次發(fā)送A中的8位數據
SETB SDA
SETB SCL
JB SDA,$ ;等待IC卡確認信號
CLR SCL
NOP
RET
此子程序的主要作用是按照定義的時(shí)序,順序左移A中一字節8位數據,并通過(guò)引腳傳送出去。當一字節發(fā)完后,等待IC卡發(fā)回的確認信號。
3.5 從IC卡讀一字節(RD+BYTE)
從IC卡中讀一字節的源程序如下:
RD_BYTE:MOV R5,#08
SETB SDA ;設備SDA為讀狀態(tài)
CLR A ;清空A寄存器
RD_BTYE1:MOV C,SDA ;讀一位數據到進(jìn)位位
RLC A ;左移數據到A.0
SETB SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R5,RD_BYTE1;依次讀出8位數據到A中
RET ;無(wú)應答信號
利用該程序可將讀出的數據存放在A(yíng)中。需要注意的是:讀數據的器件不是通過(guò)確認狀態(tài)來(lái)應答的,而是隨后產(chǎn)生一個(gè)停止狀態(tài)。
評論