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

📄 rc500.c

📁 12232液晶单片机驱动程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:

#include "c8051F020.h"
#include "absacc.h" 
#include "string.h"
#include "stdio.h"
#include "intrins.h"
#include <MfRcuC.h>
#include <MfRc500R.h>
#include <MfErrNo.h>

//******************************************************************
#define STX   0x7E      //通讯开始 
#define ETX   0x7F      //通讯结束

#define BUFF_LEN 30     //接收缓冲区长度 

//串口中断接收缓存区定义
unsigned char xdata RECEIVEBUFFER[BUFF_LEN],*RECEIVEBUFFERPOINT;	 // UART0 RECEIVE buffer
unsigned char xdata Receive_Num=0;
bit START_FLAG=0,END_FLAG=0;
//********************************************************************
#define unchar unsigned char
//********************************************************************
unsigned char xdata MLastSelectedSnr[5];
unsigned char xdata Returnval,status=0; 
unsigned char xdata MRcvBuffer[64] ,MSndBuffer[16]; //
static MfCmdInfo  MInfo;

//********************************************
bit haveset=0;
sbit PReset=P1^7;
/********************************************
void Delay(unsigned int );
********************************************/
void Delay(unsigned int j)
{
  unsigned int i;
  for(i=0;i<j;i++)	
  {
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
   }
}

/****************************************************************************
*                                                                           *
* Function:     main                                                        *
*                                                                           *
* Input:        -                                                           *
* Output:       -                                                           *
*                                                                           *
* Description:                                                              *
****************************************************************************/
void main(void)
{
  unsigned char idata i;
  unsigned char xdata catq[2],csn[5];
  unsigned char xdata rbuf[16]={0};
  unsigned char xdata keybuf[6],keycodebuf[12],temp_buf[17];
  unsigned char idata sector_num;  //扇区绝对号
  unsigned char idata selec_abkey;  //key a b selector
  unsigned char idata block_num;    //块绝对号
  unsigned char idata e2key_secotor;
  unsigned short idata rc500_e2addr;
  unsigned short delay;
  

	OSCXCN = 0x67;					// Enable external crystal	
	WDTCN = 0xDE;					// disable watchdog timer
	WDTCN = 0xAD;

    EMI0CF = 0x07;	      			// Set External Memory Configuration Register,
	                                //使用片内 4K 和片外存储器低端口,地址数据复用
									//因为地址与数据复用,所以应将XBR2.1设为高电平,以使交叉开关
									//跳过ALE,RD,WR 
                            	
    XBR0 = 0X04;                    //SET  UART0    
    XBR1 = 0x10;     	      		// Set INT1
    XBR2 = 0x46;              		// Set UART1,Enable XBAR,Enable EMFILE
  
    P0MDOUT = 0xe1; 				//Output configuration for P0 
	                                //ALE,RD,WR,TXD配置为推挽输出,RXD,INT1配置为漏级开路  
	P1MDOUT = 0xff; 				// Output configuration for P1 
	                                //复位脚配置为推挽输出
    P2MDOUT = 0xff; 				// Output configuration for P2 
    P3MDOUT = 0xff; 				// Output configuration for P3
  
    P0|=0x12;                       //set RX0,INT1为输入 
	

	delay=256;						// Delay >1 ms  before polling XTLVLD.
	while(delay--);

	while (!(OSCXCN & 0x80));		// Wait until external crystal has									// started.
	OSCICN = 0x0C;					// Switch to external oscillator
	OSCICN = 0x88;					// Disable internal oscillator; enable 
                        			// missing clock detector.
	while (!(OSCXCN & 0x80));		// Wait until external crystal has									// started.
	OSCICN = 0x08;					// Switch to external oscillator

///////////////////////////////////////////////////
     
	// 初始化UART0、TIMER2
  	Baudrate_Init();                // 初始化串口0的波特率

    IT1=1;                          // 外部中断1设为沿触发 
   
	ES0=1;							//允许串口0中断 
    EX1=1;                          //外部中断1开放
    EA=1;                           //  
///////////////////////////////////////////////////////////////////////////////////////
  SendEnter();
  SendData("通讯成功");           
  status=Mf500PcdConfig();  //配置RC500内部寄存器函数
  SendData("售卡机终端工作"); //显示上电成功
  memset(RECEIVEBUFFER,0,BUFF_LEN);
  status=Mf500PiccHalt();  
 while(1)  //while(1)
  {         
              if(END_FLAG==1){//接收成功
                      END_FLAG=0; 
                            SendData("Send:");                                          						
                        	for(i=0;i<Receive_Num;i++)                                            
                      		SendHex(RECEIVEBUFFER[i]);	//接收的内容发回去
                            SendEnter();
                            SendData("Rece:");	                                                           		
                    switch(RECEIVEBUFFER[1]){  //run command
                       case 0x4f:   //择卡并发挥卡信息                        
                             do{
                            	status=Mf500PiccRequest(PICC_REQALL,catq);                                   	                                      
		                          status=Mf500PiccAnticoll(0,csn);       //csn 为返回的卡序列号SN 
                                          
		                          status=Mf500PiccSelect(csn,catq);      //选择这张卡                                 
                                                                           		                                                                
                                }while(status);
                                                                   
                             if(catq[0]==0x08)    // MIFARE I 卡
	                              SendData("Mifare 1"); 
                             else
                                  SendData("非法卡片");
                             SendData("卡号:");                        
                             for(i=0;i<5;i++)   //seril
                               SendHex(csn[i]);                             
                             SendEnter();                                                   
                             SendData("select ok");  //显示选择卡成功                             
                            break; 

                       case 0x4c:   //直接验证
                          
                            sector_num=RECEIVEBUFFER[3]*4+3;//算出密钥所在的扇区
                            memmove(keybuf,RECEIVEBUFFER+6,6);                            
							status=Mf500HostCodeKey(keybuf,keycodebuf);//将密钥转换成RC500格式 
                            if(RECEIVEBUFFER[5]==0x0A)
                                  selec_abkey=PICC_AUTHENT1A;
                            if(RECEIVEBUFFER[5]==0x0B) 
                                  selec_abkey=PICC_AUTHENT1B;                                                    
 		                    status=Mf500PiccAuthKey(selec_abkey,csn,keycodebuf,sector_num);                             
                            if(status==0)                                  
									SendData("auth ok");                                                            
                                    
							else    
                                    SendData("auth lose");   
                            break;
                       case 0x0B:  //间接验证
                            sector_num=RECEIVEBUFFER[3]*4+3;//算出密钥所在的扇区
                            if(RECEIVEBUFFER[5]==0x0A)
                                  selec_abkey=PICC_AUTHENT1A;
                            if(RECEIVEBUFFER[5]==0x0B) 
                                  selec_abkey=PICC_AUTHENT1B;  
                            e2key_secotor=RECEIVEBUFFER[6];
                                                               			           
           				    status= Mf500PiccAuthE2(selec_abkey,csn,e2key_secotor,sector_num);
                                  // 参数e2key_secotor 0 <= e2key_sector <= 15此为e2rom的扇区号                     
                                 //  参数sector_num为卡的扇区0  block  0 <= block <= 15 即为认证的卡的扇区

                            if(status==0)                 		
                 		        SendData("Auth ok");//显示写成功                             
                            else  
                                SendData("Auth lose");                              
                            break;
                       
                       case 0x01:  //loadkeye2  将密钥装入RC500的密钥存贮区                          

                            if(RECEIVEBUFFER[5]==0x0A)
                                  selec_abkey=PICC_AUTHENT1A;
                            if(RECEIVEBUFFER[5]==0x0B) 
                                  selec_abkey=PICC_AUTHENT1B; 

                            e2key_secotor=RECEIVEBUFFER[6];
                    
                            keybuf[0]=RECEIVEBUFFER[7];  
                            keybuf[1]=RECEIVEBUFFER[8];
                            keybuf[2]=RECEIVEBUFFER[9];
                            keybuf[3]=RECEIVEBUFFER[10];
             			    keybuf[4]=RECEIVEBUFFER[11];
             				keybuf[5]=RECEIVEBUFFER[12];

                            status=Mf500PcdLoadKeyE2(selec_abkey,e2key_secotor,keybuf);  //first save key to e2rom
             				if(status==00)             
             				     SendData("Load key e2 ok ");            
            				else
                                 SendData("Load key e2 lose ");  
                            break;
                       case 0x55:  //rc500 的地址0x30---0x7f存贮测试
                            e2key_secotor=RECEIVEBUFFER[5];
                            rc500_e2addr = 0x30 + e2key_secotor * 0x18;
                            keybuf[0]=RECEIVEBUFFER[6];  
                            keybuf[1]=RECEIVEBUFFER[7];
                            keybuf[2]=RECEIVEBUFFER[8];
                            keybuf[3]=RECEIVEBUFFER[9];             			                 				                            
                            status = PcdWriteE2(rc500_e2addr,4,keybuf);
                            if(status==0)             
             				     SendData("Save Info ok ");            
            				else
                                 SendData("Save Info lose ");  
                            break;
                       case 0x56:  //读出rc500 的地址0x30---0x7f存贮测试   
                            e2key_secotor=RECEIVEBUFFER[5];
                            status= PcdReadE2(e2key_secotor,4,rbuf);
                            if(status==0)
		                    {                        
                              SendData("Read Info ok ");                          	         
                              for(i=0;i<4;i++)
		                        {
                                  SendHex(rbuf[i]);   //显示到屏幕
		                        }
                              SendEnter();
                            }else                                                     
                              SendData("Read Info lose");                                                                                                      
                            break;
                       case 0x99:
                            memset(temp_buf,0,sizeof(temp_buf));
                            sector_num=RECEIVEBUFFER[3]*4+3;//算出密钥所在的块
                                                            
                                  temp_buf[0]=RECEIVEBUFFER[5];     
                                  temp_buf[1]=RECEIVEBUFFER[6];
                                  temp_buf[2]=RECEIVEBUFFER[7];
                                  temp_buf[3]=RECEIVEBUFFER[8];
             			          temp_buf[4]=RECEIVEBUFFER[9];
             				      temp_buf[5]=RECEIVEBUFFER[10];

                                  temp_buf[6]=RECEIVEBUFFER[11];    
                                  temp_buf[7]=RECEIVEBUFFER[12];
                                  temp_buf[8]=RECEIVEBUFFER[13];
                                  temp_buf[9]=RECEIVEBUFFER[14];
                           
                                  temp_buf[10]=RECEIVEBUFFER[15];        
                                  temp_buf[11]=RECEIVEBUFFER[16];
                                  temp_buf[12]=RECEIVEBUFFER[17];
                                  temp_buf[13]=RECEIVEBUFFER[18];
             			          temp_buf[14]=RECEIVEBUFFER[19];
             				      temp_buf[15]=RECEIVEBUFFER[20];
                                                       
                         	status=Mf500PiccWrite(sector_num,temp_buf);                              
 			  				if(status==0)                 		
                 			   SendData("Change ok");//显示写成功                             
                            else  
                               SendData("Change lose");     
                            break;                           

                       case 0x30:  //read rf card
                           
                            block_num=RECEIVEBUFFER[3]*4+RECEIVEBUFFER[4];
                            status=Mf500PiccRead(block_num,rbuf);             
                            if(status==0)
		                    {                        
                              SendData("read sector ok ");                          	         
                              for(i=0;i<16;i++)
		                        {
                                  SendHex(rbuf[i]);   //显示到屏幕
		                        }
                              SendEnter();                            
			                }else{
                                  SendData("Read sector lose");                           
                                  }
                                          
                            break;
                       case 0xA0:  //write rf card
                                                      
                            block_num=RECEIVEBUFFER[3]*4+RECEIVEBUFFER[4];

                            memmove(temp_buf,RECEIVEBUFFER+5,16);   //搬移16个16进制数      
			                                                                      
               				status=Mf500PiccWrite(block_num,temp_buf);                              
 			  				if(status==0)                 		
                 			   SendData("write ok");//显示写成功                             
                            else  
                               SendData("write lose");     
                            break;
                       case 0x34:  //initval
                            block_num=RECEIVEBUFFER[3]*4+RECEIVEBUFFER[4];

                            memmove(temp_buf,RECEIVEBUFFER+5,16);   //搬移16个16进制数      
			                                                                      
               				status=Mf500PiccWrite(block_num,temp_buf);                              
 			  				if(status==0)                 		
                 			   SendData("value init ok");//显示写成功                             
                            else  
                               SendData("value write lose");                                 

                            break;
                       case 0xC0:   //decrement
                            block_num=RECEIVEBUFFER[3]*4+RECEIVEBUFFER[4];
                            //memmove(temp_buf,RECEIVEBUFFER+5,1);   //搬移1个16进制数  
                            temp_buf[0]=RECEIVEBUFFER[5];
                            temp_buf[1]=0;
                            temp_buf[2]=0;
                            temp_buf[3]=0;
                            status=Mf500PiccValue(0xc0,block_num,temp_buf,block_num);   //减值
                            if(status==0)
                               SendData("Dec value ok");                                                                             
                            else SendData("Dec value not ok");      
                            break;
                       case 0xC1:   //increment              
                            block_num=RECEIVEBUFFER[3]*4+RECEIVEBUFFER[4];

⌨️ 快捷键说明

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