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

📄 demold.c

📁 非接触式IC卡编程样例C1
💻 C
字号:
#include <reg52.h>
#include <absacc.h>
#include "170cmd.h"

#define ALL            0x01
#define IDLE           0x00
#define KEYB           0x04
#define KEYA           0x00
#define KEYSET0        0x00
#define KEYSET1        0x01
#define KEYSET2        0x02
#define HF             0x40

#define D1WREN     0x02        
                               /*   对"数据块"2,3可写   */
#define D1RDEN     0x01        
                               /*   对"数据块"2,3可读   */
#define D2WREN     0x20        
                               /*   对"数据块"10,11可写 */
#define D2RDEN     0x10        
                               /*   对"数据块"10,11可读 */
#define KEYWREN    0x08        
                               /*   对密码可写            */
#define VALUEWREN  0x04        
                               /*    对16位"电子钱包"可写*/
#define REDLED    1              
#define GREENLED  2              
#define BELL      4              

#define LDCLK     P31
#define LDSDA     P30
#define MAXTIME   10    


unsigned char bdata ldchar;
sbit ldbit=ldchar^7;
unsigned char ld_flags;
unsigned char idata write_buff[32];
unsigned char iscom;


/********************************************************
*
*  常规子程序
*
********************************************************/

void delay_10us()
{
   unsigned char i;
   i=0;
   i=0;
   i=i+i;
}

void delay_50us(unsigned int us)
{
   unsigned char i;
   if(!us) return;
   do
   {
      i++;
	  i--;
	  delay_10us();
	  delay_10us();
	  delay_10us();
	  delay_10us();
   }
   while(--us);
}

void delayms(unsigned int ms)
{
   unsigned char i;
   if(!ms) return;
   do
   {
      i=70;
	  i+=1;
	  i+=1;
	  i+=1;
	  i+=1;
	  i+=1;
	  i-=1;
	  i-=1;
	  i-=1;
	  i-=1;
	  i-=1;
      do
	  {
         delay_10us();
	  }
      while(--i);
   }
   while(--ms);
}


/******************************************/
     /*       LD子程序          */
/******************************************/

void Ld_Clk()
{
	delay_10us();
	delay_10us();
	delay_10us();
	LDCLK=0;
	delay_10us();
    delay_10us();
	LDCLK=1;
}

void Ld_SendChar()
{
    unsigned char i=8;
    LDCLK=1;
    LDSDA=0;
    delay_10us();
    LDCLK=0;
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    LDCLK=1;
    do
    {
        LDSDA=ldchar&0x01;
        ldchar>>=1;
        Ld_Clk();
    }
    while(--i);
   
    LDSDA=1;
    Ld_Clk();
}

void Ld_Hand_SendChar()
{
    unsigned char i=8;
    LDCLK=1;
    LDSDA=0;
    delay_10us();
    LDCLK=0;
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    LDCLK=1;
    do
    {
        LDSDA=ldchar&0x01;
        ldchar>>=1;
        Ld_Clk();
    }
    while(--i);
   
    LDSDA=1;
    Ld_Clk();
}

unsigned char Ld_ReceiveChar()
{
    unsigned char i;
	unsigned char Maxwait;
	unsigned char ld_flags;
	
	LDCLK=1;
	LDSDA=1;
    Maxwait=MAXTIME;
	do
	{
		if(LDCLK)  continue;
		if(LDSDA)  goto Ldr_err;
		goto Ldr_do0;
	}
	while(--Maxwait);
	goto Ldr_err;
    
Ldr_do0:
    i=8;
	do
	{
         ldchar>>=1;
	     Maxwait=MAXTIME;
         do
		 {
		     if(LDCLK)  goto Ldr_do1;
		 }
	     while(--Maxwait);
		 goto Ldr_err;

Ldr_do1: Maxwait=MAXTIME;
         do
		 {
		    if(!LDCLK)  goto Ldr_do2;
		 }
	     while(--Maxwait);
	     goto Ldr_err;

Ldr_do2: ldbit=LDSDA;
	}
	while(--i);

    Maxwait=MAXTIME;
    do
	{
	   if(LDCLK)  goto Ldr_do3;
	}
	while(--Maxwait);
    goto Ldr_err;

Ldr_do3:
    Maxwait=MAXTIME;
    do
	{
	   if(!LDCLK)  goto Ldr_do4;
	}
	while(--Maxwait);
    goto Ldr_err;

Ldr_do4:    
    if(!LDSDA)              goto Ldr_err;

Ldr_ok:
	return 0x00;
Ldr_err:
	return 0x01;
}

char Ld_GetChar()
{
    unsigned char i=100;
    do
    {
	    if(!Ld_ReceiveChar()) return 0x00;
    }
    while(--i);
	return 0x01;
}

char Ld_GetHandChar()
{
    unsigned char i=20;
    do
    {
	    if(!Ld_GetChar()) return 0x00;
    }
    while(--i);
	return 0x01;
}


char Ld_first_handed(void)
{
	ldchar=0x23;
    Ld_Hand_SendChar();                // this char is the

	if(Ld_GetChar())          return 1;
    if(ldchar!=0x45)          return 1;
    return 0;
}

char Ld_second_handed(void)
{
    if(Ld_GetHandChar())     return 1;
	if(ldchar!=0x67)         return 1;
    ldchar=0x89;
	Ld_SendChar();
    return 0;
}

unsigned char MF_sendcmd(unsigned char cmd,unsigned char length)
{
   unsigned char i;
   unsigned char pc_cmd,pc_len,pc_jy;
   unsigned char temp_char;

/* 添加 */
   DPTR=write_buff;
/*      */

   if(Ld_first_handed())       return 0xa1;

   pc_jy=0;
   ldchar=cmd;
   Ld_SendChar();
   pc_jy^=cmd;

   ldchar=length;
   Ld_SendChar();
   pc_jy^=length;

   for(i=0;i<length;i++)
   {
	   ldchar=write_buff[i];
	   pc_jy^=ldchar;
       Ld_SendChar();
   }

   ldchar=pc_jy;
   Ld_SendChar();

   if(Ld_second_handed())      return 0xa2;

   pc_jy=0;
   if(Ld_GetChar())        return 0xa3; 
   pc_cmd=ldchar;
   pc_jy^=ldchar;

   if(Ld_GetChar())            return 0xa3;
   pc_len=ldchar;
   pc_jy^=ldchar;


/* 删除
   for(i=0;i<pc_len;i++)
   {
       if(Ld_GetChar())        return 0xa3;
       pc_jy^=ldchar;
       write_buff[i]=ldchar;
   }
*/

/* 添加 */
   if(pc_len)
   {
       while(1)
	   {
          if(Ld_GetChar())        return 0xa3;
          pc_jy^=ldchar;
          XBYTE[DPTR]=ldchar;
          DPTR+=1;
		  pc_len--;
		  if(!pc_len) break;
	   } 
   }
/*      */

   if(Ld_GetChar())            return 0xa3;
   if(ldchar!=pc_jy)           return 0xa4;
   return pc_cmd;
}

void sys_init()
{
   LDCLK=1;
   LDSDA=1;
}

/*  所有的初始化工作  */
void debug_ml10()
{
	unsigned char status;
	unsigned char snr[4];
	unsigned char idata dat[4];
	unsigned char value[2];

    unsigned int i;
	unsigned int count;
	unsigned char bcmd,blen;
	unsigned char idata buff[22];

    /*通用测试程序<内部用>*/
	count=0;
    i=100;
    bcmd=0x00;
	blen=0x00;
	do
	{
	    for(status=0;status<21;status++)
		{
		    write_buff[status]=buff[status];
		}
		status=Mf_sendcmd(bcmd,blen);
		    
		if(status) count++;
		i--;
	}
	while(i);

    /*装载密码A*/
	write_buff[0]=KEYSET0|KEYA;
	write_buff[1]=0x00;
	write_buff[2]=0xff;
	write_buff[3]=0xff;
	write_buff[4]=0xff;
	write_buff[5]=0xff;
	write_buff[6]=0xff;
	write_buff[7]=0xff;
    status=Mf_sendcmd(LOADKEY,8);

    /*装载密码B*/
	write_buff[0]=KEYSET0|KEYB;
	write_buff[1]=0x00;
	write_buff[2]=0xff;
	write_buff[3]=0xff;
	write_buff[4]=0xff;
	write_buff[5]=0xff;
	write_buff[6]=0xff;
	write_buff[7]=0xff;
    status=Mf_sendcmd(LOADKEY,8);

	/*设置密码认证方式*/
    
	    /*用密码A认证*/
	    write_buff[0]=0x00;
        status=Mf_sendcmd(AUTHMODE,1);
  
	    /*用密码B认证*/
	    write_buff[0]=0x01;
        status=Mf_sendcmd(AUTHMODE,1);

    
    /*取卡序列号*/
	status=Mf_sendcmd(GETSNR,0);
    if(status) return;
    for(i=0;i<4;i++)
	{
	    snr[i]=write_buff[i];
	}

	/*读数据块*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
	status=Mf_sendcmd(READBLOCK,5);
    if(status) return;
    for(i=0;i<4;i++)
	{
	    dat[i]=write_buff[i];
	}

    /*写数据块*/
    for(i=0;i<4;i++)
	{
	    dat[i]=status+i;
	}

	write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	   write_buff[1+i]=snr[i];
	}
    for(i=0;i<4;i++)
	{
	   write_buff[5+i]=dat[i];
	}
	status=Mf_sendcmd(WRITEBLOCK,9);
	if(status) return;

	/*写"电子钱包"*/ 
	value[0]=0x00;
	value[1]=0x01; 

    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
    for(i=0;i<2;i++)
	{
	    write_buff[5+i]=value[i];
	}
	status=Mf_sendcmd(WRITEVALUE,7);
    if(status) return;
		
	/*读"电子钱包"*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
	status=Mf_sendcmd(READVALUE,5);
    if(status) return;
    for(i=0;i<2;i++)
	{
	    value[i]=write_buff[i];
	}

	/*减电子钱包*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
    for(i=0;i<2;i++)
	{
	    write_buff[5+i]=value[i];
	}
	status=Mf_sendcmd(DECREMENTVALUE,7);
    if(status) return;

	write_buff[0]=REDLED|GREENLED|BELL;
	write_buff[1]=10;
	write_buff[2]=2;
	write_buff[3]=2;
	status=Mf_sendcmd(ALARM,4);
    return;
}

void debug_m1()
{
	unsigned char status;
	unsigned char snr[4];
	unsigned char idata dat[16];
	unsigned char value[4];

    unsigned int i;
	unsigned int count;
	unsigned char bcmd,blen;
	unsigned char idata buff[22];

    /*通用测试程序<内部用>*/
	count=0;
    i=100;
    bcmd=0x00;
	blen=0x00;
	do
	{
	    for(status=0;status<21;status++)
		{
		    write_buff[status]=buff[status];
		}
		status=Mf_sendcmd(bcmd,blen);
		    
		if(status) count++;
		i--;
	}
	while(i);

	/*装载密码*/
       /*扇区号==0x01*/
	   write_buff[0]=0x01;

	write_buff[1]=0xa0;
	write_buff[2]=0xa1;
	write_buff[3]=0xa2;
	write_buff[4]=0xa3;
	write_buff[5]=0xa4;
	write_buff[6]=0xa5;
    status=Mf_sendcmd(TRANSKEY,7);

    /*取卡序列号*/
	status=Mf_sendcmd(GETSNR,0);
    if(status) return;
    for(i=0;i<4;i++)
	{
	    snr[i]=write_buff[i];
	}

	/*读数据块*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
	status=Mf_sendcmd(READBLOCK,5);
    if(status) return;
    for(i=0;i<16;i++)
	{
	    dat[i]=write_buff[i];
	}

    /*写数据块*/
    for(i=0;i<16;i++)
	{
	    dat[i]=status+i;
	}

	write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
    for(i=0;i<16;i++)
	{
	    write_buff[5+i]=dat[i];
	}
	status=Mf_sendcmd(WRITEBLOCK,21);
	if(status) return;

    /*写电子钱包*/ 
    value[0]=0x00;
    value[1]=0x01; 
    value[2]=0x00; 
    value[3]=0x00; 

    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
        write_buff[1+i]=snr[i];
	}
    for(i=0;i<4;i++)
	{
        write_buff[5+i]=value[i];
	}
    status=Mf_sendcmd(WRITEVALUE,9);
    if(status) return;
		
    /*读"电子钱包"*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
       write_buff[1+i]=snr[i];
	}
    status=Mf_sendcmd(READVALUE,5);
    if(status) return;
    for(i=0;i<4;i++)
	{
        value[i]=write_buff[i];
	}

    /*加"电子钱包"*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
        write_buff[1+i]=snr[i];
	}
    for(i=0;i<4;i++)
	{
        write_buff[5+i]=value[i];
	}
    status=Mf_sendcmd(INCREMENTVALUE,9);
    if(status) return;

    /*减"电子钱包"*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
        write_buff[1+i]=snr[i];
	}
    for(i=0;i<4;i++)
	{
        write_buff[5+i]=value[i];
	}
    status=Mf_sendcmd(DECREMENTVALUE,9);
    if(status) return;

    write_buff[0]=REDLED|GREENLED|BELL;
    write_buff[1]=10;
    write_buff[2]=2;
    write_buff[3]=2;
    status=Mf_sendcmd(ALARM,4);
    return;
}

void main()
{
	unsigned char cardtype;
	unsigned char status;
	unsigned char snr[4];
	unsigned char value1[4];
	unsigned char value2[4];

	unsigned int i;
	unsigned int count;

	unsigned char idata dat[16];

	/*****************************/
	unsigned char idata buff[0x20];
    unsigned char bcmd;
	unsigned char blen;
	/*****************************/
	
	/*     选择通讯方式     */

	sys_init();

	while(1)
	{
		delayms(1000);
        if(Mf_sendcmd(GETSNR,0))
		{
		    write_buff[0]=REDLED|GREENLED|BELL;
		    write_buff[1]=40;
		    write_buff[2]=8;
		    write_buff[3]=1;
		    status=Mf_sendcmd(ALARM,4);
		}
		else
		{
		    write_buff[0]=REDLED|GREENLED|BELL;
		    write_buff[1]=20;
		    write_buff[2]=4;
		    write_buff[3]=2;
		    status=Mf_sendcmd(ALARM,4);
		}
	}
	
	while(1)
	{
		/*联接*/
		status=Mf_sendcmd(STATUS,0);
		
		/*灯控*/
		write_buff[0]=REDLED|GREENLED|BELL;
		write_buff[1]=20;
		write_buff[2]=20;
		write_buff[3]=2;
		status=Mf_sendcmd(ALARM,4);
	    
		/*取模块标示号*/
		status=Mf_sendcmd(MCMNO,0);
	    
		/*取模块版本号*/
		status=Mf_sendcmd(MCMVER,0);
        
		/*取卡类型*/
		status=Mf_sendcmd(GETTYPE,0);
        if(status) continue;       /*没有卡,返回*/
        cardtype=write_buff[0];
		
		if(cardtype==0x04)
		{
            while(1)
			{
			    debug_m1();
			}
		}
		else
		{
            while(1)
			{
			    debug_ml10();
			}
		}
	}

	/***************************************/
	/*      LD_sendcmd()返回代码表                        */
	/*  0XA1,0XA2,0XA3,0XA4  为主控程序通信错误返回代码   */
	/*  具体意义如下                                      */
	/*  0XA1   第一次握手错                               */
	/*  0XA2   第二次握手错                               */
	/*  0XA3   接受数据错                                 */
	/*  0XA4   接受数据校验错                             */
	/*                                                    */
	/*  其他错误代码是模块返回的错误代码                  */
	/*  具体意义参见《各模块》错误代码返回表              */
}

⌨️ 快捷键说明

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