⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 学校水POS读卡程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************
*                                                                           *
* File:         MAIN.C                                                      *
*                                                                           *
* Version:      v1.1                                        		        *
*                                                                           *
* Created:      2003/10/11                                                  *
* Last Change:  2005/01/12                                                  *
*                                                                           *
* Author:       DavidQi                                                     *
*                                                                           *
* Compiler:     KEIL C51 V6.23A                                             *
*                                                                           *
* Description:  该程序用于复旦电子 FM1702                                   *
*                                                                           *
****************************************************************************/
#pragma large
#define __SRC

#include <main.h>
#undef  __SRC


#include <string.h>
#include <intrins.h>


#include <stdio.h>
#include <m500a.h>
#include <w77e58.h>
#include <rdio.h>

#define MIS_CHK_OK              (0)
#define MIS_CHK_FAILED          (-1)
#define MIS_CHK_COMPERR         (-2)

// Function: mifs_request
#define IDLE                    0x00
#define ALL                     0x01


// PC Debug Data: 02 30 31 32 03 33     checksum =33 (30^31^32)
// Release Number of the Firmware
uchar code SW_Rel[] = "\n\r MFRC500 V1.0 8.03.2003 \n\r";
uchar code ms[4][2] = {{0x0,0x0},{0x0,0x0},{0x0,0x0},{0x0,0x0}};

// Serial Number of the MFRC500
//uchar Snr_RC500[4];
uchar xdata Snr_RC500[4];
//static uint Crc;

// Local Prototypes
void init(void);
void cmd_execution(void);

// Interrupt Service Routines
void isr_timer0(void);
void isr_UART(void);

//uchar card_snr[4];
uchar  xdata card_snr[4];
char   xdata ErrNum;

unsigned char code CmdData_1[]={0x7f,0x40,0x05,0x0,0x0,0x0,0x0};

unsigned char code CmdData_2[]={0x7f,0x42,0x08,0x0,0x0,0x0,0x0,0x0};

uchar xdata SectorNum, BlockNum,CommandNum,Key[6],CardData[16],KeyData[6];

uchar data ComeCard = 0,GoCard = 0;ChkSum1 = 0;
void main (void)
{ 
  init();

  test(); 
  
  WDTC  =  WDTC|0x01;   // start WDT      

  M500PcdConfig();  	// Initialise the RC500
	                    // must be call in the initialization

//  RC500 E2PROM  0x00--0x0f Product Information Field
//                0x08--0x0b  Product Serical Number
 
  PcdReadE2(8,4,Snr_RC500); // Read out the MFRC500 serial number and store it
    
  RingOn();

  while(1)
  {
    LED  = OFF; 

// 检测是否有MIFARE卡在读头感应区,等待POS 终端发送命令  

    M500PcdConfig();

    ChkSum = 0; 

    while(!FrameOk)     
    {
       
       // memcpy(SerBuffer,CmdData_1,7);
        
        SerBuffer[1] = 0x40;
        cmd_execution();
	  
     if(AccOk )
     {  
        ComeCard++;
        if(ComeCard == 3)
        {
          P1_6 = 1; 
          ComeCard = 0;       
        }
        
        AccOk = FALSE ;
        GoCard = 0;
     }  
     else
     {        
         GoCard++;
         if(GoCard == 3)
         {
           P1_6 = 0; 
           GoCard = 0;           
         }
         ComeCard = 0;      

     }
    
     SerBuffer[1] = 0x45;
     cmd_execution();
     delay_10ms(5);   
    
     WDTC  =  WDTC|0x02;  // refresh watchdog timer 
     WDTD  =  0x0a0;       // 3s Reload timer 
       
    }     
    
    WDTC  =  WDTC|0x02;  // refresh watchdog timer 
    WDTD  =  0x0a0;       //  3s Reload timer 
   // SerBuffer[1] = 0x45;
   // cmd_execution();
   // RingOn();

    TransData(PcData,SerBuffer,DataLen);//SerBuffer: PC 与MCU交互数据缓冲区
    
    
    M500PcdConfig();
   
    /*
     cmd_execution() 命令执行程序
     命令码:               命令功能:
     0x40:                  // PICC_REQALL
     0x41:                  // Request
     0x42:                  // Anticoll
     0x43:                  // Select
     0x44:                  // Authentication
     0x45:                  // Halt
	 0x46:                  // Read
     0x47:                  // Write
	 0x48:                  // Increment
     0x49:					// Decrement
     0x4A:					// Restore
	 0x4B:					// Transfer
	 0x4C:					// Load Key
     0x4D:					// comm check char
     0x4E:					// Reset
     0x4F:                 	// Get Info
     0x50:					// Set Control Bit
     0x51:					// Clr Control Bit
     0x52:                 	// Config
     0x53:					// Check Write
     0x54:					// Set Port
     0x55:					// Get Port
     0x56:                	// Authentication2
     0x57:                  // Decrement+Transfer
    */
    CommandNum =  SerBuffer[0]; //命令码
    SectorNum =  SerBuffer[1];  //mifare1卡:扇区号
    BlockNum =  SerBuffer[2];   //mifare1卡:块号 
    memcpy(KeyData,&SerBuffer[3],6);//mifare1卡:块密码6字节
    memcpy(CardData,&SerBuffer[3],16);//mifare1卡:待写的16字节数据
    if(CommandNum == 0x47)
    {
       //RingOn();
       ;
          
    } 
    FrameOk = 0;
    if(CommandNum == 0x4c)
    {      
     
       SerBuffer[1] = 0x4c;
       SerBuffer[MODE] = PICC_AUTHENT1A;  //MODE = 3
       SerBuffer[SECNR] = SectorNum;      //SECNR = 4
       memcpy(&SerBuffer[13],KeyData,6);
       cmd_execution();
       if(!ErrNum)
       {
             SerBuffer[3] = 0x0;
             TransHexAsi(&SerBuffer[3],SendBuffer,1);
             SendDataToPc(SendBuffer,2);
             RingOn();
       }
       
    }  

    else 
    {     
      //memcpy(SerBuffer,CmdData_1,7);  //命令码:0x40  执行PICC_REQALL 返回卡型2字节 
      
      SerBuffer[1] = 0x40;
      cmd_execution();

     if(!ErrNum)               
     {
      
       // memcpy(SerBuffer,CmdData_2,8);
        SerBuffer[1] = 0x42;
        SerBuffer[3] = 0;

        cmd_execution();//命令码:0x42: 执行 Anticoll 返回序列号

        AccOk = FALSE ;

        if(!ErrNum)
        {
           SerBuffer[1] = 0x43;

           cmd_execution();// 命令码: 0x43:  选择卡片 返回卡片的 SIZE 字节 0x88h 

           AccOk = FALSE ;

           SerBuffer[1] = 0x44;
           SerBuffer[2] = BlockNum;

           SerBuffer[3] = 0 ;
        
           SerBuffer[4] = SectorNum; //卡扇区号(0-15):= 2(含块8,9,10)

           cmd_execution();//命令码:0x44: 密码认证操作

           if(!ErrNum)
           {
               if(AuthOk == 0)
               {
                   switch (CommandNum)
                   {
                     case 0x46:
                       SerBuffer[1] = 0x46;          //读卡命令
                       SerBuffer[3] = BlockNum ;     //卡块号(0-63): =8(8,9,10)
                       cmd_execution();
                       TransHexAsi(&SerBuffer[3],SendBuffer,16);
                       SendDataToPc(SendBuffer,32);
                       break;

                     case 0x47:
                       SerBuffer[1] = 0x47;   //写卡命令
                       SerBuffer[3] = BlockNum ;      //卡块号
                
                       memcpy(&SerBuffer[4],CardData,16);// 16字节 写卡数据

                       cmd_execution();
                       if(!ErrNum)
                       {
                         SerBuffer[3] = 0x0;
                         TransHexAsi(&SerBuffer[3],SendBuffer,1);
                         SendDataToPc(SendBuffer,2);
                         RingOn();
                       }
                        break;   

                     default:
                        break;

                   }

               }

           }

        }
      
      }  

    }
    if(ErrNum)
    {
      SerBuffer[3] = ErrNum   ;
      TransHexAsi(&SerBuffer[3],SendBuffer,1);
      SendDataToPc(SendBuffer,2);
    }  
  }

}

/****************************************************************************
*                                                                           *
* Function:     init                                                        *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
*                                                                           *
*                                                                           *
****************************************************************************/

void 	init (void)
{
  
  AuthOk      = 0xff;

  AccOk       = FALSE;
  //EnOnChipSram();       // Enable w77e58 on chip 1k sram
 

  #ifdef w77e58
  DME0        = TRUE;
  PMR         = 0x41;
  #endif
  
  #ifdef sst89e554
  AUXR        = 0;
  WDTD        = 0x0a0;    // 3s 
  WDTC        = 0x1a;//00011010b;
  #endif

  LED         = ON;
  BEEP        = BeepOn;
  BEEP        = BeepOff;
  RC500RST    = FALSE;
  RC500_CS    = TRUE;	// Enable the CS for RC500

  CmdReceived = FALSE;
  CmdValid    = FALSE;
  Quit        = FALSE;
  LLfReady    = TRUE;
  SendReady   = TRUE;
  Idle        = TRUE;

  RepCnt      = 0;

  P1_6 = 0;
 
  RecvState   = RECV_STX;

  EnableTransferCmd = FALSE;

  CheckByteCnt = BCC_CHECKBYTECNT;

#ifdef AUTODELAY
  DelayRate = 0;
  DelayRateLocked = TRUE;
#endif

  FrameEnd    = 0;
  FrameHead   = 0;
  FrameOk     = 0;
  DataNum     = 0;
  ChkSum      = 0;

  PCON = 0x00;              	// SMOD = 1;
  SCON = 0x50;              	// Mode 1, 8-bit UART, enable receiption

//  EIE  = 0x0 ;
//  AutoBaud = TRUE;
  TMOD     = 0x20;      	// Timer 1, mode 2, 8-bit auto reload,
  		  		// Timer 0, mode 0, 13-bit counter
  Capt_L   = 0;
  Capt_H   = 0;
  
  //PCON = 0X80;
  TH1 = 0xfd ;
  TL1 = 0xfd ;
  
  //TH1 = 0xf4 ;
  //TL1 = 0xf4 ;
  PS = 1;
  ES = 1 ;

  TR1 = 1;

 
 // LED = OFF;  

  //PX1 = 1;
  
  IT1 = 1;    			// Config ext1 as edge trigger for RC500
  EX1 = 1; 			// Enable ext1 interrupt for RC500
  RC500RST = TRUE;
  EIE      = 0x0;
  EA = TRUE;			// Enable all interrupts
  OpenIO();
}


/****************************************************************************
*                                                                           *
* Function:     cmd_execution                                               *
*                                                                           *
* Input:        SerBuffer[]                                                 *
* Output:       SerBuffer[]                                                 *
*                                                                           *
* Description:                                                              *
*                                                                           *
*                                                                           *
****************************************************************************/

void 	cmd_execution ( void )
{
  uchar xdata Status;
  uchar xdata len;
  uchar xdata cmd;
  uchar xdata adr;
  uchar xdata tmp[16];
  //uchar xdata snr[4];
  uchar xdata size;
  uchar xdata tt[2];
  static uchar xdata mode,value[4],addr;
  Temp = SerBuffer;  

  cmd = SerBuffer[COMMAND];  //COMMAND == 1

  switch (cmd)
  {
	case 0x40:					//PICC_REQALL 

	  Status = M500PiccRequest(PICC_REQALL, tt);    //Get Picc tt[]: Tagtype 2 Byte
	  ErrNum = Status;
      if (Status != MI_OK)
	  {
        AccOk = 0;       
	
	  }
      else
      {
         // RingOn();
        AccOk = 1;
      }
      ErrNum = Status; 
      break;

	

	case 0x41:					// Request

	  if(SerBuffer[MODE]&0X01) SerBuffer[MODE]=PICC_REQALL; // ALL
	  else SerBuffer[MODE]=PICC_REQSTD; // IDLE

  	  Status = M500PiccRequest(SerBuffer[MODE], &SerBuffer[TAGTYPE]);
      
	  if (Status == MI_OK)
	  {
		SerBuffer[LENGTH] = 2;
	  }
      ErrNum = Status;
	  break;


	case 0x42:					// Anticoll 

	  Status = M500PiccAnticoll(SerBuffer[BCNT], &SerBuffer[SERNR]);
     
	  if (Status == MI_OK)
	  {
	  	SerBuffer[LENGTH] = 4;
       // RingOn();
	    AccOk = 1;
	  }
      ErrNum = Status;
	  break;


	case 0x43:					// Select

	  memcpy(card_snr,&SerBuffer[SERNR],4); // store serial number in globle var

//输入: 卡片序列号 输出:卡片容量 SIZE = 0X88H      
	  Status = M500PiccSelect(&SerBuffer[SERNR], &SerBuffer[SIZE]);
	  if (Status == MI_OK)
	  {
	  	SerBuffer[LENGTH] = 1;
	  }

     //     RingOn();

      AccOk = 1;
      ErrNum = Status;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -