📄 sle4442.lst
字号:
C51 COMPILER V7.07 SLE4442 03/21/2004 15:22:08 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE SLE4442
OBJECT MODULE PLACED IN SLE4442.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE SLE4442.c LARGE BROWSE INTVECTOR(0X8000) DEBUG OBJECTEXTEND
stmt level source
1
2 #include <reg52.h>
3 #include "SLE4442.h"
4 #include <intrins.h>
5
6 /* 延时5个us宏定义 */
7 #define Delay5Us() _nop_();_nop_();_nop_();_nop_();_nop_()
8
9 /* 延时10个us宏定义 */
10 #define Delay10Us() _nop_();_nop_();_nop_();_nop_();_nop_();\
11 _nop_();_nop_();_nop_();_nop_();_nop_()
12
13 unsigned char bdata ibase; //定义位寻址单元,用于发送与接收
14 //一个字节
15 sbit mybit0 = ibase^0;
16 sbit mybit1 = ibase^1;
17 sbit mybit2 = ibase^2;
18 sbit mybit3 = ibase^3;
19 sbit mybit4 = ibase^4;
20 sbit mybit5 = ibase^5;
21 sbit mybit6 = ibase^6;
22 sbit mybit7 = ibase^7;
23
24 /***************************************************************
25 函数名称:Readchar
26 功 能:读一个字节
27 输 入: 无
28 输 出:所得的字节的值
29 ****************************************************************/
30 unsigned char Readchar(void)
31 {
32 1 CLK = 0; Delay5Us(); mybit0 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
33 1 CLK = 0; Delay5Us(); mybit1 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
34 1 CLK = 0; Delay5Us(); mybit2 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
35 1 CLK = 0; Delay5Us(); mybit3 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
36 1 CLK = 0; Delay5Us(); mybit4 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
37 1 CLK = 0; Delay5Us(); mybit5 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
38 1 CLK = 0; Delay5Us(); mybit6 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
39 1 CLK = 0; Delay5Us(); mybit7 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
40 1
41 1 return(ibase); //返回读得的一个字节
42 1 }
43
44 /************************************************************
45 函数名称:SendByte
46 功 能:把一个字节的数据由低到高位依次发送出去
47 输 入:unsigned char sendchar --- 要发送的字节
48 输 出;无
49 *************************************************************/
50 void SendByte(unsigned char sendchar)
51 {
52 1 unsigned char i = 8;
53 1 ibase = sendchar;
54 1
55 1 for(; i > 0; i--) //8个比特发送8次
C51 COMPILER V7.07 SLE4442 03/21/2004 15:22:08 PAGE 2
56 1 {
57 2 CLK = 0;
58 2 Delay5Us();
59 2 IO = mybit0; //一个脉冲发送一个比特mybit0
60 2 CLK = 1;
61 2 Delay5Us();
62 2 ibase = ibase>>1; //将下次要发送的比特位移到mybit0
63 2 }
64 1 }
65
66
67 /***********************************************************
68 函数名称:RstCard
69 功 能:使IC卡SLE4442复位
70 输 入:无
71 输 出:0 --- 复位成功
72 1 --- 复位失败,卡为无效卡或卡已损坏
73 ************************************************************/
74 unsigned char RstCard(void)
75 {
76 1 unsigned char i;
77 1 unsigned char ReadBuf[4];
78 1
79 1 IO = 1; //IO 引脚置高电平
80 1 RST = 0; //RST 引脚置低电平
81 1 CLK = 0; //CLK 引脚置低电平
82 1
83 1 Delay10Us(); //下面在一个RST脉冲期间产生一个CLK脉冲
84 1 RST = 1;
85 1 Delay5Us();
86 1 CLK = 1;
87 1 Delay5Us();
88 1 CLK = 0;
89 1 Delay5Us();
90 1 RST = 0;
91 1 //接收复位响应值
92 1 for(i = 0; i < 4; i++)
93 1 {
94 2 ReadBuf[i] = Readchar();
95 2 }
96 1
97 1 CLK = 1;
98 1 Delay5Us();
99 1 CLK = 0;
100 1 IO = 1; //置CLK和IO为复位时序图复位完成时的状态
101 1
102 1 if ((ReadBuf[0] == IDENTIFY1) && (ReadBuf[1] == IDENTIFY2) &&
103 1 (ReadBuf[2] == IDENTIFY3) && (ReadBuf[3] == IDENTIFY4))
104 1 {
105 2 return 0; //复位值正确,返回复位成功
106 2 }
107 1 else
108 1 {
109 2 return 1; //复位值错误,返回复位失败
110 2 }
111 1 }
112
113
114
115 /************************************************************
116 函数名:SendCommand
117 功 能:根据不同的参数把命令字发给IC卡
C51 COMPILER V7.07 SLE4442 03/21/2004 15:22:08 PAGE 3
118 参 数:unsigned char command --- 命令字;
119 unsigned char Address --- 地址;
120 unsigned char senddata --- 数据
121 返回值:无
122 *************************************************************/
123 void SendCommand(unsigned char command,unsigned char Address,unsigned char senddata)
124 {
125 1 IO = 1; /*产生开始状态*/
126 1 CLK = 0;
127 1 Delay5Us();
128 1 CLK = 1;
129 1 Delay10Us();
130 1 IO = 0;
131 1 Delay10Us();
132 1 CLK = 0;
133 1 /*发送命令*/
134 1 SendByte(command);
135 1 SendByte(Address);
136 1 SendByte(senddata);
137 1 /*产生停止状态*/
138 1 CLK = 0;
139 1 IO = 0;
140 1 Delay5Us();
141 1 CLK = 1;
142 1 Delay5Us();
143 1 IO = 1;
144 1 Delay5Us();
145 1 }
146
147 /****************************************************************
148 函数名称:SendClock
149 功 能:发送处理脉冲
150 输 入:无
151 输 出:无
152 *****************************************************************/
153 void SendClock(void)
154 {
155 1 CLK=0; //产生一个脉冲,做为处理的工始
156 1 Delay10Us();
157 1 CLK=1;
158 1 Delay10Us();
159 1
160 1 do
161 1 {
162 2 CLK=0;
163 2 Delay10Us();
164 2 CLK=1;
165 2 Delay10Us();
166 2 }while(IO == 0); //不断产生处理脉冲,驱动IC卡内部处理,直到IC卡将
167 1 } //IO口拉为高电平
168
169 /***************************************************************
170 函数名称:ReadCm
171 功 能:从主存储器中读出数据块并存入ReadBuf中
172 输 入:unsigned char StarAddr --- 开始地址(0 - 255)
173 unsigned char ByteNum --- 要读出的字节数(1 - 256)
174 unsigned char *RecBuf --- 接收数据缓冲区
175 输 出: 0 --- 读成功
176 1 --- 表示无效卡或者卡损坏
177 ****************************************************************/
178 unsigned char ReadCm(unsigned char StarAddr,unsigned char ByteNum,unsigned char *RecBuf)
179 {
C51 COMPILER V7.07 SLE4442 03/21/2004 15:22:08 PAGE 4
180 1 unsigned char i = 0;
181 1
182 1 if (RstCard() == 1) /* 使卡复位*/
183 1 return 1; /* 如果复位失败返回1 */
184 1
185 1 SendCommand(0x30,StarAddr,0x00); /* 发送读主存命令 */
186 1
187 1 for(i = 0; i < ByteNum; i++)
188 1 {
189 2 *RecBuf = Readchar(); /* 从主存中读出ByteNum个字节并存入RecBuf中 */
190 2 RecBuf++;
191 2 }
192 1 return 0;
193 1 }
194
195 /****************************************************************
196 函数名称: WriteCm
197 功 能: 把存在WriteBuf中的ByteNum个字节的数据存入主存储器中
198 输 入: unsigned char StarAdr --- 开始地址(0 - 255)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -