?? demo_232.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
/* 對"數(shù)據(jù)塊"2,3可寫 */
#define D1RDEN 0x01
/* 對"數(shù)據(jù)塊"2,3可讀 */
#define D2WREN 0x20
/* 對"數(shù)據(jù)塊"10,11可寫 */
#define D2RDEN 0x10
/* 對"數(shù)據(jù)塊"10,11可讀 */
#define KEYWREN 0x08
/* 對密碼可寫 */
#define VALUEWREN 0x04
/* 對16位"電子錢包"可寫*/
#define RS232 1
#define LDSTD 0
#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;
/********************************************************
*
* 常規(guī)子程序
*
********************************************************/
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);
}
/******************************************/
/* 串口子程序 */
/******************************************/
void com_init()
{
TMOD |= 0x20 ; // set T/C mode 2, Baud set needed
PCON |= 0x80 ; // set SMOD=1, That mean baud K=2
TH1 = 0xff ; // set baudrate=57.6kbps
TL1 = 0x00 ;
SCON = 0x50 ; // set asci mode 1 and Receive Enable
TR1 = 1 ; // permit T1 timer, TCON register
TI=0;
RI=0;
}
unsigned char com_key()
{
unsigned int i=0x100;
do
{
if(RI) return 0x01;
}
while(--i);
return 0x00;
}
unsigned char com_handkey()
{
unsigned int i=0x4000;
do
{
if(RI) return 0x01;
}
while(--i);
return 0x00;
}
void com_send_char(unsigned char s_char)
{
SBUF=s_char; // write a char to SBUF register
while (!TI) ; // check until TI = 1
TI=0; // reset TI
}
char com_get_char()
{
char c;
c=SBUF; // put the received char to buffer
RI=0; // reset RI
return (c) ;
}
char com_first_handed(void)
{
com_send_char(0x23);
if(!com_key()) return 0x01;
if(com_get_char()!=0x45) return 0x20;
return 0x00;
}
char com_second_handed(void)
{
if(!com_handkey()) return 0x01;
if(com_get_char()!=0x67) return 0x10;
com_send_char(0x89);
return 0x00;
}
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;
if(com_first_handed()) return 0xa1;
pc_jy=0;
com_send_char(cmd);
pc_jy^=cmd;
com_send_char(length);
pc_jy^=length;
for(i=0;i<length;i++)
{
temp_char=write_buff[i];
com_send_char(temp_char);
pc_jy^=temp_char;
}
com_send_char(pc_jy);
if(com_second_handed()) return 0xa2;
pc_jy=0;
if(!com_key()) return 0xa3;
pc_cmd=com_get_char();
pc_jy^=pc_cmd;
if(!com_key()) return 0xa3;
pc_len=com_get_char();
pc_jy^=pc_len;
for(i=0;i<pc_len;i++)
{
if(!com_key()) return 0xa3;
temp_char=com_get_char();
pc_jy^=temp_char;
write_buff[i]=temp_char;
}
if(!com_key()) return 0xa3;
if(com_get_char()!=pc_jy) return 0xa4;
return pc_cmd;
}
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];
/*通用測試程序<內(nè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);
/*設(shè)置密碼認(rèn)證方式*/
/*用密碼A認(rèn)證*/
write_buff[0]=0x00;
status=Mf_sendcmd(AUTHMODE,1);
/*用密碼B認(rèn)證*/
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];
}
/*讀數(shù)據(jù)塊*/
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];
}
/*寫數(shù)據(jù)塊*/
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];
/*通用測試程序<內(nè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);
/*裝載密碼*/
/*扇區(qū)號==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];
}
/*讀數(shù)據(jù)塊*/
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];
}
/*寫數(shù)據(jù)塊*/
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;
/*****************************/
com_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)
{
/*聯(lián)接*/
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);
/*取模塊標(biāo)示號*/
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 為主控程序通信錯(cuò)誤返回代碼 */
/* 具體意義如下 */
/* 0XA1 第一次握手錯(cuò) */
/* 0XA2 第二次握手錯(cuò) */
/* 0XA3 接受數(shù)據(jù)錯(cuò) */
/* 0XA4 接受數(shù)據(jù)校驗(yàn)錯(cuò) */
/* */
/* 其他錯(cuò)誤代碼是模塊返回的錯(cuò)誤代碼 */
/* 具體意義參見《各模塊》錯(cuò)誤代碼返回表 */
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -