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