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

📄 main.c

📁 读ISO14443 CPU卡源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "reg52.h"
#include <string.h>
#include <intrins.h>
#include "main.h"
#include "slrc632.h"
#include "iso14443a.h"


#include <absacc.h>
//硬件版本号         
unsigned char code hardmodel[12]  = {"SL601F-0512"};  

bit g_bReceOk;                                              //正确接收到上位机指令标志
bit g_bReceAA;                                              //接收到上位机发送的AA字节标志
bit g_bRc632Ok;                                             //RC632复位正常标志
bit g_bIblock;

unsigned int  g_cReceNum;                                   //接收到上位机的字节数
unsigned int  data g_cCommand;                              //接收到的命令码
unsigned char data g_cSNR[4];                               //M1卡序列号
unsigned char g_cIcdevH;                                    //设备标记
unsigned char g_cIcdevL;                                    //设备标记
unsigned char g_cFWI;                                       //
unsigned char g_cCidNad;                                    //
unsigned char idata g_cReceBuf[64];                         //和上位机通讯时的缓冲区

struct TranSciveBuffer{unsigned char MfCommand;
                       unsigned int  MfLength;
                       unsigned char MfData[64];
                      };
void main( )
{    
     
     InitializeSystem( );
     Rc632Ready( );
     PcdConfigISOType( 'A' );    
     while ( 1 )
     {   
         if (g_bReceOk)
         {

                 g_bReceOk = 0;     
                 switch(g_cCommand)
                 {
                     case 0x0101:
                        ComSetBound();               break;
                     case 0x0104:
                        ComGetHardModel();           break;
                     case 0x0108:
                        ComM632PcdConfigISOType();   break;  
                     case 0x010C:
                        ComPcdAntenna();             break; 
                                  
                     case 0x0201:
                        ComRequestA();               break;  
                     case 0x0202:
                        ComAnticoll();               break;        
                     case 0x0203:
                        ComSelect();                 break;
                     case 0x0204:
                        ComHlta();                   break;
                     case 0x0207:
                        ComAuthentication();         break; 
                     case 0x0208:
                        ComM1Read();                 break;
                     case 0x0209:
                        ComM1Write();                break;
                     case 0x020A:
                        ComM1Initval();              break; 
                     case 0x020B:
                        ComM1Readval();              break;
                     case 0x020C:
                        ComM1Decrement();            break;
                     case 0x020D:
                        ComM1Increment();            break;  
                     case 0x020E:
                        ComM1Restore();              break;
                     case 0x020F:
                        ComM1Transfer();             break; 
                     case 0x0210:
                        ComTypeARst();               break; 
                     case 0x0211:
                        ComTypeACOS();               break; 

                     case 0x0303:
                        ComCL_Deselect();            break;

                     default:
                        AnswerErr( FAULT11 );         break;
                 }
             ES = 1;
          }
     }
}



/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
    TMOD &= 0x0F;
    TMOD |= 0x21;
    PCON |= 0x80;
    SCON  = 0x50;
    TH1 = TL1 = BOUND19200; 
    TR1=1;
    P0 = P1 = P2 = P3 = 0xFF;
    IE |= 0x90;
}

/////////////////////////////////////////////////////////////////////
//初始化RC632
/////////////////////////////////////////////////////////////////////
void Rc632Ready()
{
    char status;
    DelayMs(100);
    DelayMs(100);
	DelayMs(100);



    status = PcdReset();
    if(status != MI_OK)
    {
        DelayMs(10);
        status = PcdReset();
    } 
    if(status != MI_OK)
    {
        DelayMs(10);
        status = PcdReset();
    } 
    if(status == MI_OK)
    {
        g_bRc632Ok = 1;
        sond       = 1;                //蜂鸣器响一声,表示RC632复位成功
		DelayMs(250);
		sond       = 0;
    }       
}
	
/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置波特率命令
/////////////////////////////////////////////////////////////////////
void ComSetBound()
{
    unsigned char bound = g_cReceBuf[6];
    if (bound > 7)
    {   AnswerErr(FAULT12);    }
    else
    {
    	AnswerCommandOk();
    	TR1 = 0;
    	switch(bound)
        {
                 case 0:
                      TH1=TL1=BOUND4800;
                      break;
                 case 1:
                      TH1=TL1=BOUND9600;
                      break;
                 case 2:
                      TH1=TL1=BOUND14400;
                      break;
                 case 3:
                      TH1=TL1=BOUND19200;
                      break;
                 case 4:
                      TH1=TL1=BOUND28800;
                      break;
                 case 5:
                      TH1=TL1=BOUND38400;
                      break;
                 case 6:
                      TH1=TL1=BOUND57600;
                      break;
                 case 7:
                      TH1=TL1=BOUND115200;
                      break;
                 default:
                      break;
        }
    	TR1 = 1;
     }   	
}


/////////////////////////////////////////////////////////////////////
//响应上位机发送的读取硬件版本号命令
/////////////////////////////////////////////////////////////////////
void ComGetHardModel()
{
    memcpy(&g_cReceBuf[0], &hardmodel[0], sizeof(hardmodel));
    AnswerOk(&g_cReceBuf[0], sizeof(hardmodel));
}    

    
/////////////////////////////////////////////////////////////////////
//响应上位机发送的设置RC632协议命令,ISO14443A/B或ISO15693
/////////////////////////////////////////////////////////////////////
void ComM632PcdConfigISOType()
{
     if (MI_OK == PcdConfigISOType(g_cReceBuf[6]))
     {    AnswerCommandOk();    }
     else
     {    AnswerErr(-1);   }  
} 
   
/////////////////////////////////////////////////////////////////////
//响应上位机发送的天线命令
/////////////////////////////////////////////////////////////////////
void ComPcdAntenna()
{
    char status;
    if (!g_cReceBuf[6])
    {   status = PcdAntennaOff();   }
    else
    {  
        DelayMs(10); 
        status = PcdAntennaOn();
        DelayMs(10);
    }
    if (status == MI_OK)
    {   AnswerCommandOk();    }
    else 
    {   AnswerErr(FAULT10);   }
}    

/////////////////////////////////////////////////////////////////////
//响应上位机发送的寻A卡命令
/////////////////////////////////////////////////////////////////////
void ComRequestA()
{
    unsigned char atq[2];
	char status;
	status = PcdRequest(g_cReceBuf[6], atq);
	if (status != MI_OK)
	{    status = PcdRequest(g_cReceBuf[6], atq);   }
    if (status == MI_OK)
    {    AnswerOk(atq,2);     }
    else
    {    AnswerErr(FAULT20);   }    	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡防冲撞命令
/////////////////////////////////////////////////////////////////////
void ComAnticoll()
{ 
    if (MI_OK == PcdAnticoll(&g_cSNR))
    {    AnswerOk(&g_cSNR,4);  }
    else
    {    AnswerErr(FAULT10);   }    	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡锁定命令
/////////////////////////////////////////////////////////////////////
void ComSelect()
{
    if (MI_OK == PcdSelect(&g_cReceBuf[6], &g_cReceBuf[0]))
    {    AnswerOk(&g_cReceBuf[0], 1);      }
    else
    {    AnswerErr(FAULT10);   }    	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡休眠命令
/////////////////////////////////////////////////////////////////////
void ComHlta()
{
    if (MI_OK == PcdHalt())
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(FAULT10);   }    	
}

/////////////////////////////////////////////////////////////////////
//响应上位机发送的A卡验证密钥命令
/////////////////////////////////////////////////////////////////////
void ComAuthentication()
{	
    char status = MI_COM_ERR;
    unsigned char *pkeys,*pSNR;
    pkeys = &g_cReceBuf[20];
    pSNR  = &g_cSNR;
    if (MI_OK == ChangeCodeKey(&g_cReceBuf[8],pkeys))                       //转换密钥格式
    {    
    	if (MI_OK == PcdAuthKey(pkeys))                                     //传送密钥到RC500FIFO
        {
             status = PcdAuthState(g_cReceBuf[6], g_cReceBuf[7], pSNR);     //验证密钥
        }
    }
    if (status == MI_OK)
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(FAULT22);   }
}    

/////////////////////////////////////////////////////////////////////
//响应上位机读M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Read()
{
    if (MI_OK == PcdRead(g_cReceBuf[6], &g_cReceBuf[0]))
    {	 AnswerOk(&g_cReceBuf[0], 16);  }
    else
    {    AnswerErr(FAULT23);            }
}

/////////////////////////////////////////////////////////////////////
//响应上位机写M1卡命令
/////////////////////////////////////////////////////////////////////
void ComM1Write()
{
    if (MI_OK == PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(FAULT24);   }
}

/////////////////////////////////////////////////////////////////////
//响应上位机初始化钱包命令
/////////////////////////////////////////////////////////////////////
void ComM1Initval()
{
    g_cReceBuf[11]=~g_cReceBuf[7];g_cReceBuf[12]=~g_cReceBuf[8];
    g_cReceBuf[13]=~g_cReceBuf[9];g_cReceBuf[14]=~g_cReceBuf[10];
    g_cReceBuf[15]=g_cReceBuf[7];g_cReceBuf[16]=g_cReceBuf[8];
    g_cReceBuf[17]=g_cReceBuf[9];g_cReceBuf[18]=g_cReceBuf[10];
    g_cReceBuf[19]=g_cReceBuf[6];g_cReceBuf[20]=~g_cReceBuf[6];
    g_cReceBuf[21]=g_cReceBuf[6];g_cReceBuf[22]=~g_cReceBuf[6];
    if (MI_OK == PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(FAULT24);   }
}

/////////////////////////////////////////////////////////////////////
//响应上位机读钱包命令
/////////////////////////////////////////////////////////////////////
void ComM1Readval()
{
    if (MI_OK == PcdRead(g_cReceBuf[6], &g_cReceBuf[0]))
    {	 AnswerOk(&g_cReceBuf[0], 4);   }
    else
    {    AnswerErr(FAULT23);         }
}

/////////////////////////////////////////////////////////////////////
//响应上位机扣款命令
/////////////////////////////////////////////////////////////////////
void ComM1Decrement()
{
    if (MI_OK == PcdValue(PICC_DECREMENT, g_cReceBuf[6], &g_cReceBuf[7]))
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(FAULT24);   }
}
    
/////////////////////////////////////////////////////////////////////
//响应上位机充值命令
/////////////////////////////////////////////////////////////////////
void ComM1Increment()
{
    if (MI_OK == PcdValue(PICC_INCREMENT, g_cReceBuf[6], &g_cReceBuf[7]))
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(FAULT24);   }
}

/////////////////////////////////////////////////////////////////////
//响应上位机M1卡回传命令
/////////////////////////////////////////////////////////////////////
void ComM1Restore()
{
    if (MI_OK == PcdRestore(g_cReceBuf[6]))
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(FAULT23);   }
}

/////////////////////////////////////////////////////////////////////
//响应上位机M1卡值传送命令
/////////////////////////////////////////////////////////////////////
void ComM1Transfer()
{

⌨️ 快捷键说明

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