📄 icrdwr.lst
字号:
120 void Delay(uint t)
121 {
122 1 uint i,j;
123 1 for(j=0;j<t;j--)
124 1 {
125 2 for (i=0;i<125;i++) //空循环
126 2 {
127 3 }
128 2 }
129 1 }
130
131
132
133 void SPIWrite(uchar dat)
134 {
135 1 SPDR = dat; //写数据寄存器SPDR
136 1 while (!(SPSR & 0x80)) //读SPSR,等待传输完成
137 1 {
138 2 }
139 1 }
140
141
142
143 uchar ICStatus(void)
144 {
145 1 P1_1 = 0; //使能IC卡芯片
146 1
147 1 SPIWrite(StatusRead); //向IC卡芯片写入读IC卡芯片状态指令
148 1 SPIWrite(0x00); //写无关位
149 1
150 1 P1_1 = 1; //禁用IC卡芯片
151 1 return SPDR; //返回IC卡芯片状态
152 1 }
153
154
155 void WriteICFun(uchar dat)
156 {
157 1 uchar status;
158 1
159 1 status= ICStatus(); //检查IC卡芯片的状态
160 1 while ((status&0x80)==0x00) //如果IC卡芯片忙,则等待
161 1 {
162 2 }
163 1
164 1 P1_1 = 0; //使能IC卡芯片
165 1 SPIWrite(BUFFER1Write); //IC卡芯片的写BUFFER1指令代码
166 1 SPIWrite(0x00); //写入8位无关位
167 1 SPIWrite((uchar)(BufStartAddr>>8)); //写入7位无关位以及9位buffer起始字节地址的第1位
168 1 SPIWrite((uchar)BufStartAddr); //写入9位BUFFER起始字节地址的后8位
169 1 SPIWrite(dat); //写入数据
170 1 P1_1 = 1; //禁用IC卡芯片
171 1
172 1 BufStartAddr++; //指向下一BUFFER起始字节地址
173 1
174 1 if (BufStartAddr > 263) //如果BUFFER已满
175 1 {
176 2 BufStartAddr = 0; // buffer起始字节地址重置0
177 2 if (PageAddr < 2047) //如果IC卡芯片的主内存页不满
178 2 {
179 3 /* buffer数据写入主内存页 */
C51 COMPILER V8.08 ICRDWR 09/21/2008 11:28:48 PAGE 4
180 3 P1_1 = 0; //使能IC卡芯片
181 3 SPIWrite(BUFFER1ToMain); //由缓冲区写主内存指令代码
182 3 SPIWrite((uchar)(PageAddr>>7)); //写入4位保留位加上11位页地址的高4位
183 3 SPIWrite((uchar)(PageAddr<<1)); //写入11位页地址的低7位和1位无关位
184 3 SPIWrite(0x00); //写入8位无关位
185 3 P1_1 = 1; //禁用IC卡芯片
186 3
187 3 PageAddr++; //指向下一页地址
188 3 }
189 2 }
190 1 }
191
192
193 uchar ReadICFun()
194 {
195 1 uchar status;
196 1 uchar tmp;
197 1
198 1 status= ICStatus(); //检查IC卡芯片的状态
199 1 while ((status&0x80)==0x00) //如果IC卡芯片忙,则等待
200 1 {
201 2 }
202 1
203 1 P1_1 = 0; //使能IC卡芯片
204 1 SPIWrite(MainPageRead) ; //写入主内存页读指令代码
205 1 tmp = (uchar)(PageAddr>>7); //11位页地址的高4位
206 1 SPIWrite(tmp); //写入4位保留位以及11位页地址的高4位
207 1 tmp = (uchar)(PageAddr<<1)|((uchar)(PageStartAddr>>8)&0x01);
208 1 SPIWrite(tmp); //写入页地址的低7位以及9位页起始字节地址的最高位
209 1 tmp = (uchar)(PageStartAddr);
210 1 SPIWrite(tmp); //写入9位页起始字节地址的低8位
211 1 SPIWrite(0x00) ; //写入8位无关位
212 1 SPIWrite(0x00) ; //写入8位无关位
213 1 SPIWrite(0x00) ; //写入8位无关位
214 1 SPIWrite(0x00) ; //再写入8位无关位,共写入32位无关位
215 1 SPIWrite(0xff) ; //写入任意值,用来读IC卡芯片返回的数据
216 1 P1_1 = 1; //禁用IC卡芯片
217 1
218 1 PageStartAddr++; //指向下一页中起始字节地址
219 1
220 1 if (PageStartAddr > 263) //如果读完一页
221 1 {
222 2 PageStartAddr = 0; //页起始字节地址重置0
223 2 if (PageAddr < 2047) //如果主内存页没有读完
224 2 PageAddr++; //指向下一页地址
225 2 }
226 1
227 1 return SPDR; //返回数据
228 1 }
229
230
231
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 628 ----
CONSTANT SIZE = 536 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
C51 COMPILER V8.08 ICRDWR 09/21/2008 11:28:48 PAGE 5
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -