📄 demold.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 + -