📄 main.lst
字号:
261 2 break;
262 2 case 0x22: // 选择卡 Select Card
263 2 status=M500PiccCascSelect(CardSnr,&RevBuffer[2]);
264 2 if(status!=MI_OK)
265 2 {
266 3 RevBuffer[0]=1;
267 3 RevBuffer[1]=status;
268 3 break;
269 3 }
270 2
271 2 RevBuffer[0]=3;
272 2 RevBuffer[1]=status;
273 2 break;
274 2 case 0x23: // Key loading into the MF RC500's EEPROM
275 2 // 校验卡密码(E2)
276 2 status=M500PiccAuthE2(RevBuffer[1],CardSnr,RevBuffer[2],RevBuffer[3]);
277 2 RevBuffer[0]=1;
278 2 RevBuffer[1]=status;
279 2 break;
280 2 case 0x24: // Key loading into the MF RC500's EEPROM
281 2 // 下载密码(E2)
282 2 status=M500PcdLoadKeyE2(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
283 2 RevBuffer[0]=1;
284 2 RevBuffer[1]=status;
285 2 break;
286 2 case 0x25: // Read the mifare card
287 2 // 读卡
288 2 status=M500PiccRead(RevBuffer[1],&RevBuffer[2]);
289 2 if(status==0)
290 2 {
291 3 if(cardtype==mifare1S50||cardtype==mifare1S70)
292 3 RevBuffer[0]=17;
293 3 else if(cardtype==1)
294 3 RevBuffer[0]=9;
295 3 else
296 3 RevBuffer[0]=16;
297 3 }
298 2 else
299 2 {
300 3 RevBuffer[0]=1;
301 3 }
302 2 RevBuffer[1]=status;
303 2 break;
C51 COMPILER V6.23a MAIN 08/14/2006 14:40:24 PAGE 6
304 2 case 0x26: // Write the mifare card
305 2 // 写卡 下载密码
306 2 status=M500PiccWrite(RevBuffer[1],&RevBuffer[2]);
307 2 RevBuffer[0]=1;
308 2 RevBuffer[1]=status;
309 2 break;
310 2 case 0x27: //钱包块值操作:加.减,
311 2 status = M500PiccValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3],RevBuffer[7]);
312 2 RevBuffer[0]=1;
313 2 RevBuffer[1]=status;
314 2 break;
315 2 case 0x28: //终止卡的操作
316 2 status=M500PiccHalt();
317 2 RevBuffer[0]=1; //返回休眠卡的结果
318 2 RevBuffer[1]=status;
319 2 break;
320 2 case 0x29: //进入软件掉电模式
321 2 SetBitMask(RegControl,0x10); // PowerDown = 1
322 2 cmd_ok(); // 内部电流消耗模块包括晶振在内关闭
323 2 break;
324 2 case 0x30: //退出软件掉电模式
325 2 ClearBitMask(RegControl,0x10); // PowerDown = 0
326 2 cmd_ok();
327 2 break;
328 2 default: // 其余默认操作错误
329 2 RevBuffer[0]=1;
330 2 RevBuffer[1]=1;
331 2 break;
332 2 }
333 1
334 1 }
335
336 ///////////////////////////////////////////////////////////////////////
337 //发送命令成功信号0100给上位机
338 ///////////////////////////////////////////////////////////////////////
339 void cmd_ok(void)
340 {
341 1 RevBuffer[0]=1;
342 1 RevBuffer[1]=0;
343 1 }
344 ///////////////////////////////////////////////////////////////////////
345
346 /**********************RC500操作函数定义******************************/
347 ///////////////////////////////////////////////////////////////////////
348 // 往一个地址写一个数据
349 ///////////////////////////////////////////////////////////////////////
350 void WriteRawIO(uchar Address,uchar value)
351 {
352 1 XBYTE[Address]=value;
353 1 }
354
355 ///////////////////////////////////////////////////////////////////////
356 // 从一个地址读出一个数据
357 ///////////////////////////////////////////////////////////////////////
358 uchar ReadRawIO(uchar Address)
359 {
360 1 return XBYTE[Address];
361 1 }
362
363 ///////////////////////////////////////////////////////////////////////
364 // G E N E R I C W R I T E
365 // 往一个地址写一个数据(EEPROM)
C51 COMPILER V6.23a MAIN 08/14/2006 14:40:24 PAGE 7
366 ///////////////////////////////////////////////////////////////////////
367 void WriteIO(uchar Address, uchar value)
368 {
369 1 WriteRawIO(0x00,GetRegPage(Address));
370 1 WriteRawIO(Address,value);
371 1 }
372
373 ///////////////////////////////////////////////////////////////////////
374 // G E N E R I C R E A D
375 // 从一个地址读出一个数据(EEPROM)
376 ///////////////////////////////////////////////////////////////////////
377 uchar ReadIO(uchar Address)
378 {
379 1 WriteRawIO(0x00,GetRegPage(Address));
380 1 return ReadRawIO(Address);
381 1 }
382
383 ///////////////////////////////////////////////////////////////////////
384 // 设置RC500定时时间
385 ///////////////////////////////////////////////////////////////////////
386 void M500PcdSetTmo(uchar tmoLength)
387 {
388 1 switch(tmoLength)
389 1 {
390 2 case 1:
391 2 WriteIO(RegTimerClock,0x07);
392 2 WriteIO(RegTimerReload,0x6a);
393 2 break;
394 2 case 2:
395 2 WriteIO(RegTimerClock,0x07);
396 2 WriteIO(RegTimerReload,0xa0);
397 2 break;
398 2 case 3:
399 2 WriteIO(RegTimerClock,0x09);
400 2 WriteIO(RegTimerReload,0xa0);
401 2 break;
402 2 case 4:
403 2 WriteIO(RegTimerClock,0x09);
404 2 WriteIO(RegTimerReload,0xff);
405 2 break;
406 2 case 5:
407 2 WriteIO(RegTimerClock,0x0b);
408 2 WriteIO(RegTimerReload,0xff);
409 2 break;
410 2 case 6:
411 2 WriteIO(RegTimerClock,0x0d);
412 2 WriteIO(RegTimerReload,0xff);
413 2 break;
414 2 case 7:
415 2 WriteIO(RegTimerClock,0x0f);
416 2 WriteIO(RegTimerReload,0xff);
417 2 break;
418 2 default:
419 2 WriteIO(RegTimerClock,0x07);
420 2 WriteIO(RegTimerReload,tmoLength);
421 2 break;
422 2 }
423 1 }
424
425 ///////////////////////////////////////////////////////////////////////
426 // Request Command defined in ISO14443(Mifare)
427 ///////////////////////////////////////////////////////////////////////
C51 COMPILER V6.23a MAIN 08/14/2006 14:40:24 PAGE 8
428 char M500PcdCmd(uchar cmd,
429 volatile uchar data *rcv,
430 MfCmdInfo idata *info)
431 {
432 1 char idata status = MI_OK;
433 1 char idata tmpStatus ;
434 1 uchar idata lastBits;
435 1 unsigned int idata timecnt = 0;
436 1 uchar idata irqEn = 0x00;
437 1 uchar idata waitFor = 0x00;
438 1 uchar idata timerCtl = 0x00;
439 1
440 1 WriteIO(RegInterruptEn,0x7F);
441 1 WriteIO(RegInterruptRq,0x7F);
442 1 WriteIO(RegCommand,PCD_IDLE);
443 1
444 1 FlushFIFO();
445 1 MpIsrInfo = info;
446 1 MpIsrOut = rcv;
447 1 info->irqSource = 0x00;
448 1 switch(cmd)
449 1 {
450 2 case PCD_IDLE:
451 2 irqEn = 0x00;
452 2 waitFor = 0x00;
453 2 break;
454 2 case PCD_WRITEE2:
455 2 irqEn = 0x11;
456 2 waitFor = 0x10;
457 2 break;
458 2 case PCD_READE2:
459 2 irqEn = 0x07;
460 2 waitFor = 0x04;
461 2 break;
462 2 case PCD_LOADCONFIG:
463 2 case PCD_LOADKEYE2:
464 2 case PCD_AUTHENT1:
465 2 irqEn = 0x05;
466 2 waitFor = 0x04;
467 2 break;
468 2 case PCD_CALCCRC:
469 2 irqEn = 0x11;
470 2 waitFor = 0x10;
471 2 break;
472 2 case PCD_AUTHENT2:
473 2 irqEn = 0x04;
474 2 waitFor = 0x04;
475 2 break;
476 2 case PCD_RECEIVE:
477 2 info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);
478 2 irqEn = 0x06;
479 2 waitFor = 0x04;
480 2 break;
481 2 case PCD_LOADKEY:
482 2 irqEn = 0x05;
483 2 waitFor = 0x04;
484 2 break;
485 2 case PCD_TRANSMIT:
486 2 irqEn = 0x05;
487 2 waitFor = 0x04;
488 2 break;
489 2 case PCD_TRANSCEIVE:
C51 COMPILER V6.23a MAIN 08/14/2006 14:40:24 PAGE 9
490 2 info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);
491 2 irqEn = 0x3D;
492 2 waitFor = 0x04;
493 2 break;
494 2 default:
495 2 status = MI_UNKNOWN_COMMAND;
496 2 }
497 1 if (status == MI_OK)
498 1 {
499 2 irqEn |= 0x20;
500 2 waitFor |= 0x20;
501 2 timecnt=1000;
502 2 WriteIO(RegInterruptEn,irqEn | 0x80);
503 2 WriteIO(RegCommand,cmd);
504 2 while (!(MpIsrInfo->irqSource & waitFor||!(timecnt--)));
505 2 WriteIO(RegInterruptEn,0x7F);
506 2 WriteIO(RegInterruptRq,0x7F);
507 2 SetBitMask(RegControl,0x04);
508 2 WriteIO(RegCommand,PCD_IDLE);
509 2 if (!(MpIsrInfo->irqSource & waitFor))
510 2 {
511 3 status = MI_ACCESSTIMEOUT;
512 3 }
513 2 else
514 2 {
515 3 status = MpIsrInfo->status;
516 3 }
517 2 if (status == MI_OK)
518 2 {
519 3 if (tmpStatus = (ReadIO(RegErrorFlag) & 0x17))
520 3 {
521 4 if (tmpStatus & 0x01)
522 4 {
523 5 info->collPos = ReadIO(RegCollPos);
524 5 status = MI_COLLERR;
525 5 }
526 4 else
527 4 {
528 5 info->collPos = 0;
529 5 if (tmpStatus & 0x02)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -