www.pudn.com > demold.rar > demold.c


#include  
#include  
#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*/ 
	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   接受数据校验错                             */ 
	/*                                                    */ 
	/*  其他错误代码是模块返回的错误代码                  */ 
	/*  具体意义参见《各模块》错误代码返回表              */ 
}