📄 rficrdwr.lst
字号:
199 2 while(!RI);
200 2 *(hbuf+i) = SBUF;
201 2 /* 如果接收到错误信息则返回错误代码 */
202 2 if((*(hbuf+i)>0x39)&&(*(hbuf+i)<'a'))
203 2 return *(hbuf+i);
204 2 }
205 1
206 1 return 0; // 成功
207 1 }
208
209 /* 登录扇区函数,参数sect为扇区号,keytype为密码类型,keyvalue为密码内容。
210 keyvalue为NULL时,表示使用默认密码;keytype为0x10~0x2f和0x30~0x4f
211 之间或者0xff时,程序忽略keyvalue的内容。 */
212 uchar loginsect(uchar sect,uchar keytype,uchar *keyvalue)
213 {
214 1 uchar tmp;
215 1
216 1 if(sect>16) // 扇区号超过16报错
217 1 return ERR_E;
218 1
219 1 strcpy(hbuf,"l");
220 1 Byte2Hex(§,1,hbuf); // 将sect转换为16进制字符串
221 1
222 1 if(((keytype>0x10)&&(keytype<0x2f))||((keytype>0x30)&&(keytype<0x4f)))
223 1 Byte2Hex(&keytype,1,hbuf); // "l<sect><reg>
224 1 else if((keytype==KEY_A)||(keytype==KEY_B)) // 使用密码A或B登录
225 1 {
226 2 Byte2Hex(&keytype,1,hbuf);
227 2 if (keyvalue==NULL)
228 2 strcat(hbuf,"\r"); // "l<sect>aa<CR>或"l<sect>bb<CR>"
229 2 else
230 2 Byte2Hex(keyvalue,6,hbuf); // "l<sect>aa<value>或"l<sect>bb<value>"
231 2 }
232 1 else if(keytype==KEY_DEFAULT) // 使用默认密码登录
233 1 strcat(hbuf,"\r"); // "l<sect><CR>
234 1 else
235 1 return ERR_U; // 未知错误
236 1
237 1 sendcmd(hbuf); // 发送命令
238 1
239 1 RI = 0;
240 1 while(!RI);
241 1 tmp = SBUF;
C51 COMPILER V7.02b RFICRDWR 12/10/2005 20:06:41 PAGE 5
242 1 if(tmp=='L') // 登录成功
243 1 return 0;
244 1 else
245 1 return tmp; // 返回错误
246 1 }
247
248 /* 读块函数,将块中内容读至缓冲区,缓冲区长度应为16字节 */
249 uchar readblock(uchar block,uchar *buf)
250 {
251 1 uchar i;
252 1
253 1 if (block>64) // 块号超过64报错
254 1 return ERR_E;
255 1 strcpy(hbuf,"r");
256 1 Byte2Hex(&block,1,hbuf); // block转换为16进制字符串
257 1 sendcmd(hbuf); // "r<block>"
258 1
259 1 for (i=0;i<32;i++) // 接收块数据
260 1 {
261 2 RI = 0;
262 2 while(!RI);
263 2 *(hbuf+i) = SBUF;
264 2 /* 如果接收到错误信息则返回错误代码 */
265 2 if((*(hbuf+i)>0x39)&&(*(hbuf+i)<'a'))
266 2 return *(hbuf+i);
267 2 }
268 1 *(hbuf+32) = 0;
269 1 Hex2Byte(hbuf,buf); // 将块内容由16进制字符串转换为字节数组
270 1
271 1 return 0; // 成功
272 1 }
273
274 /* 写块函数,将缓冲区中内容写入块,缓冲区长度16字节 */
275 uchar writeblock(uchar block,uchar *buf)
276 {
277 1 uchar i;
278 1
279 1 if (block>64) // 块号超过64报错
280 1 return ERR_E;
281 1 strcpy(hbuf,"w");
282 1 Byte2Hex(&block,1,hbuf); // block转换为16进制字符串
283 1 Byte2Hex(buf,16,hbuf); // 将要写入块的内容转换为16进制字符串
284 1 sendcmd(hbuf); // "w<block><data>"
285 1
286 1 for (i=0;i<32;i++) // 接收返回数据,为写入的内容
287 1 {
288 2 RI = 0;
289 2 while(!RI);
290 2 *(hbuf+i) = SBUF;
291 2 /* 如果接收到错误信息则返回错误代码 */
292 2 if((*(hbuf+i)>0x39)&&(*(hbuf+i)<'a'))
293 2 return *(hbuf+i);
294 2 }
295 1
296 1 return 0; // 成功
297 1 }
298
299 /* 主程序,选取一张卡,将0~15共16个数写入扇区1的块0中,然后再从该扇区的
300 块0中读出这16个数,存入缓冲区block0buf,接着再将block0buf中的内容写入
301 该扇区的块1中,最后再从块1中读出16个数,存入缓冲区block1buf中。本程序
302 的主要功能是验证H6152模块对非接触式IC卡的读写 */
303 void main()
C51 COMPILER V7.02b RFICRDWR 12/10/2005 20:06:41 PAGE 6
304 {
305 1 char sn[4];
306 1 uchar sectno,blockno; // 扇区号、块号
307 1 uchar blockbuf[16]; // 要写入块的内容缓冲区
308 1 uchar i;
309 1
310 1 sectno = 1; // 扇区1
311 1 blockno = 0; // 块0
312 1 flagok = 0;
313 1 flagfirst = 1;
314 1 flagselok = 0;
315 1 flaglogok = 0;
316 1 count = 0;
317 1
318 1 for (i=0;i<16;i++) // 写入0~15共16字节
319 1 blockbuf[i]=i;
320 1
321 1 CTRL = 0; // H6152正常工作
322 1 BP = 1; // 蜂鸣器不发声
323 1
324 1 EA = 1;
325 1 TMOD = 0x01; // 模式1,T0为16位定时/计数器
326 1 TH0 = -5000/256; // 设置计数初值
327 1 TL0 = -5000%256;
328 1 ET0 = 1; // 打开T0中断
329 1
330 1 serial_init(); // 串口初始化
331 1
332 1 H6152Rst(); // H6152复位
333 1
334 1 while(!flagok)
335 1 {
336 2 cardcheck(); // 卡片检测
337 2 endcheck(); // 停止检测
338 2 if (flagfirst) // 如果是第一次选卡
339 2 {
340 3 flagfirst = 0;
341 3 if (autoselect(sn)==0) // 第一张卡片选择成功,并保存序列号sn
342 3 {
343 4 flagselok = 1;
344 4 TR0 = 1; // T0开始计时
345 4 }
346 3 }
347 2 else
348 2 {
349 3 if(snselect(sn)==0) // 指定序列号sn的卡片选择成功
350 3 flagselok = 1;
351 3 }
352 2 if (flagselok)
353 2 {
354 3 if(loginsect(sectno,KEY_DEFAULT,NULL)=='L') // 登录成功
355 3 flaglogok = 1;
356 3 else
357 3 {
358 4 flagselok = 0; // 登录不成工,重新去选卡
359 4 flaglogok = 0;
360 4 }
361 3 if (flaglogok)
362 3 {
363 4 flagwr = writeblock(blockno,blockbuf);
364 4 if(flagwr!=0)
365 4 flagselok = 0; // 写块错误,重新去选卡
C51 COMPILER V7.02b RFICRDWR 12/10/2005 20:06:41 PAGE 7
366 4 else
367 4 {
368 5 flagrd = readblock(blockno,block0buf);
369 5 if (flagrd!=0)
370 5 flagselok = 0; // 读块错误,重新去选卡
371 5 else
372 5 {
373 6 flagwr = writeblock(blockno+1,block0buf);
374 6 if (flagwr!=0)
375 6 flagselok = 0; // 写块错误,重新去选卡
376 6 else
377 6 {
378 7 flagrd = readblock(blockno+1,block1buf);
379 7 if (flagrd!=0)
380 7 flagselok = 0; // 读块错误,重新去选卡
381 7 else
382 7 flagok = 1; // 读写成功
383 7 }
384 6 }
385 5 }
386 4 }
387 3 }
388 2 }
389 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1396 ----
CONSTANT SIZE = 19 ----
XDATA SIZE = 69 ----
PDATA SIZE = ---- ----
DATA SIZE = 3 54
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -