📄 bl7442_card.h
字号:
/*...................................................................................*/
/*有关BL7442ic卡的函数,包括:
Delay(uchar j)延时函数、ic_start()开始条件函数、ic_stop()停止条件函数、clock()时针函数
out_byte(uchar byte) sends 8 bit 'byte' to the BL7442
read_data() reads 8 bits from the sle4442 & stores value in 'rd_data'
ic_break() 复位停止函数
ISO_no_read() reads 32 bit ISO stasndard response to reset
rd_main_ram(uchar read_start_addr)读主存储区函数
proc_mode_chek() ic_card 在处理模式时进行监测是否处理完毕,最大延时255个时钟
*/
/*...................................................................................*/
#define uchar unsigned char
#define uint unsigned int
#define rst P3_2 /*sle4442复位*/
#define sdio P3_1 /*sle4442输出*/
#define sclk P3_0 /*sle4442时钟*/
//定义对各存储器的操作命令
#define RD_MAIN_RAM 0X30 //读主存储器 ic卡模式:outgoing data
#define WR_MAIN_RAM 0X38 //写主存储器 ic卡模式:processing
#define RD_P_RAM 0X34 //读保护存储器 ic卡模式:outgoing data
#define WR_P_RAM 0X3C //写保护存储器 ic卡模式:processing
#define RD_PSC_RAM 0X31 //读安全存储器 ic卡模式:outgoing data
#define WR_PSC_RAM 0X39 //写安全存储器 ic卡模式:processing
#define COMP_PSC_RAM 0X33 //比较安全存储器 ic卡模式:processing
unsigned char psc,protect[4],sm[4];
unsigned char ISO[4]; //存放复位响应数据
//短延时
void Delay(uchar j)
{
uchar data i;
i=j;
for(i;i>0;i--);
}
void ic_start()
{
sclk=0;
sdio=1;
Delay(3);
sclk=1;
Delay(3);
sdio=0;
Delay(3);
sclk=0;
}
void ic_stop()
{
sdio=0;
sclk=1;
Delay(5);
sdio=1;
sclk=0;
}
void clock()
{
sclk=1;
Delay(5);
sclk=0;
Delay(5);
}
/*****************************************************************************/
/*6. sends 8 bit 'byte' to the BL7442 */
/*****************************************************************************/
void out_byte(uchar byte)
{
uchar count,byte_temp;
for (count=0;count<8;count++)
{
byte_temp=byte;
sdio=(bit)(0x01&(byte_temp>>count));
clock();
}
}
/*****************************************************************************/
/*7. reads 8 bits from the sle4442 & stores value in 'rd_data' */
/*****************************************************************************/
static char read_data()
{
uchar rd_data=0;
uchar count;
sdio=1;
for(count=0;count<8;count++)
{
rd_data>>=1;
sclk=1;
Delay(1);
if(sdio)rd_data|=0x80;;
sclk=0;
Delay(1);
}
return(rd_data);
}
/*******************************************************/
/*9. reads 32 bit ISO stasndard response to reset */
/*******************************************************/
void ISO_no_read()
{
uchar count1;
sdio=1;
rst=1;
Delay(1);
clock();
Delay(1);
rst=0;
for(count1=0;count1<4;count1++)
{ISO[count1]=read_data();}
rst=1;
_nop_();
_nop_();
_nop_();
rst=0;
}
void ic_break()
{
sclk=0;
Delay(1);
rst=1;
_nop_();
_nop_();
_nop_();
rst=0;
}
//读命令
//uchar comm_type; 30h,34h,31h;
//uchar read_start_addr; comm_type=30h:00-0xff;comm_type=34h:00-0xff;
uchar rd_main_ram(uchar read_start_addr)
{
uint i;
ic_start();
out_byte(RD_MAIN_RAM);
out_byte(read_start_addr);
out_byte(read_start_addr);
ic_stop();
i=read_data();
ic_break();
return (i);
}
/*.................................................................................*/
//ic_card 在处理模式时进行监测是否处理完毕,最大延时255个时钟
/*.................................................................................*/
void proc_mode_chek()
{
uint i;
for(i=0;i<512;i++)
{
if (sdio!=0) i=511;
else clock();
}
}
/*................................................................................*/
//写命令子程序
//uchar comm_type; 38h,3ch,39h,33h;
//uchar read_start_addr; comm_type=30h:00-0xff;comm_type=34h:00-0xff;
/*.................................................................................*/
void write_eepram(uchar comm_type,uchar write_start_addr,uchar write_data)
{
ic_start();
out_byte(comm_type);
out_byte(write_start_addr);
out_byte(write_data);
ic_stop();
if(comm_type==0x38||comm_type==0x39||comm_type==0x3c||comm_type==0x33)
{
proc_mode_chek();
}
}
/*..................................................................................*/
//写主存储器的数据,
//start_addr:从主存储器写数据的首地址
//*data_addr:要写的数据的首地址
//uint wr_bytes:要写的字节数
/*...................................................................................*/
void wr_main_ram(uchar start_addr,uchar dat)
{
write_eepram(WR_MAIN_RAM,start_addr,dat);
}
/*...................................................................................*/
//读取保护\安全存储器4个字节的数据,数据一地址指针rd_data_ptr中
//uchar ram_type:保护寄存器=RD_P_RAM;安全寄存器=RD_PSC_RAM
/*...................................................................................*/
void rd_p_psc_ram(uchar ram_type)
{
uchar i;
ic_start();
out_byte(ram_type);
out_byte(ram_type);
out_byte(ram_type);
ic_stop();
if(ram_type==RD_PSC_RAM)
{
for(i=0;i<4;i++){sm[i]=read_data();}
}
if(ram_type==RD_P_RAM)
{
for(i=0;i<4;i++){protect[i]=read_data();}
}
}
///*..........................................................................................*/
//写保护、安全存储器的数据,
//start_addr:从保护存储器写数据的首地址 00-03h
//*data_addr:要写的数据的首地址
//uint wr_bytes:要写的字节数 03h-start_addr=0~3
//uchar ram_type:保护寄存器=WR_P_RAM;安全寄存器=WR_PSC_RAM
///*..........................................................................................*/
/*void wr_p_psc_ram(uchar ram_type,uchar start_addr,uchar * data_addr,uchar wr_bytes)
{
uchar i;
for(i=0;i<wr_bytes;i++)
{
write_eepram(ram_type,(start_addr+i),*(data_addr+i));
}
} */
/*..........................................................................................*/
/*密码校验函数*/
/*..........................................................................................*/
void password_comp(uchar pws1,uchar pws2,uchar pws3)
{
rd_p_psc_ram(RD_PSC_RAM);
if(sm[0]&0x07==0) psc=1;
else{switch (sm[0]&0x07)
{case 1: write_eepram(WR_PSC_RAM,0,0xf8);
break;
case 2: write_eepram(WR_PSC_RAM,0,0xf8);
break;
case 3: write_eepram(WR_PSC_RAM,0,0xf9);
break;
case 4: write_eepram(WR_PSC_RAM,0,0xf8);
break;
case 5: write_eepram(WR_PSC_RAM,0,0xf9);
break;
case 6: write_eepram(WR_PSC_RAM,0,0xfa);
break;
case 7: write_eepram(WR_PSC_RAM,0,0xfb);
break;
}
}
write_eepram(COMP_PSC_RAM,1,pws1);
write_eepram(COMP_PSC_RAM,2,pws2);
write_eepram(COMP_PSC_RAM,3,pws3);
write_eepram(WR_PSC_RAM,0,0xff);
rd_p_psc_ram(RD_PSC_RAM);
if(sm[0]&0x07==7) psc=2;
else psc=3;
}
/*..................................................................................*/
//检测是否有符合标准的ic卡插入的函数
/*..................................................................................*/
bit check_card()
{
ISO_no_read();
if(ISO[0]==162&&ISO[1]==19)return 1;
else return 0;
}
//由16位数得到低8位数的函数
/*unsigned char get_8_L(unsigned int dat)
{
unsigned char n;
dat<<=8;
dat>>=8;
n=dat;
return n;
}*/
//由16位数得到高8位数的函数
/*unsigned char get_8_H(unsigned int dat)
{
unsigned char n=0;
dat>>=8;
n=dat;
return n;
}*/
/*由高8位数和低8位数得到16位数的函数*/
/*unsigned int get_16(unsigned char dat_H,unsigned char dat_L)
{
unsigned int n=0;
n|=dat_H;
n<<=8;
n|=dat_L;
return n;
}*/
void ICControl()
{
unsigned char n;
unsigned char sn1,sn2,sn3;
bit jwbz;
if(IC_SW)
{
if(IC_Status!=IC_OK)
{
if(IC_Status==0)
{
sound_time_count=200;
while(sound_time_count>0){;}
if(check_card())
{
//rd_p_psc_ram(RD_P_RAM);
//if(protect[0]==0xff)
{
n=rd_main_ram(IC_TIMES_ADDR);
if(n!=0&&n!=0xff)
{
sn1=rd_main_ram(IC_PSC_PARAMETER);
if(((sn1>>1)+6)!=rd_main_ram(IC_PSC_COMP)){psc=1;goto loop2;};
if(sn1&0x80==0x80)jwbz=1;else jwbz=0;
sn1=sn1<<1;if(jwbz)sn1+=1;
sn2=rd_main_ram(IC_PSC_PARAMETER+1);
if(((sn2>>1)+2)!=rd_main_ram(IC_PSC_COMP+1)){psc=1;goto loop2;};
if(sn2&0x80==0x80)jwbz=1;else jwbz=0;
sn2=sn2<<1;if(jwbz)sn2+=1;
sn3=rd_main_ram(IC_PSC_PARAMETER+2);
if(((sn3>>1)+9)!=rd_main_ram(IC_PSC_COMP+2)){psc=1;goto loop2;};
if(sn3&0x80==0x80)jwbz=1;else jwbz=0;
sn3=sn3<<1;if(jwbz)sn3+=1;
password_comp(sn1,sn2,sn3);
loop2 :
if(psc==1){IC_Status=IC_LOCKED;sound_num=2;}
if(psc==3){IC_Status=IC_PSC_ERROR;sound_num=2;}
if(psc==2)
{
IC_Status=IC_OK;
wr_main_ram(IC_PSC_PARAMETER,sn1);
wr_main_ram(IC_PSC_PARAMETER+1,sn2);
wr_main_ram(IC_PSC_PARAMETER+2,sn3);
wr_main_ram(IC_PSC_COMP, (sn1>>1)+6);
wr_main_ram(IC_PSC_COMP+1,(sn2>>1)+2);
wr_main_ram(IC_PSC_COMP+2,(sn3>>1)+9);
if(sn1&0x80==0x80)jwbz=1;else jwbz=0;
sn1=sn1<<1;if(jwbz)sn1+=1;write_eepram(WR_PSC_RAM,1,sn1);
if(sn2&0x80==0x80)jwbz=1;else jwbz=0;
sn2=sn2<<1;if(jwbz)sn2+=1;write_eepram(WR_PSC_RAM,2,sn2);
if(sn3&0x80==0x80)jwbz=1;else jwbz=0;
sn3=sn3<<1;if(jwbz)sn3+=1;write_eepram(WR_PSC_RAM,3,sn3);
max_time=rd_main_ram(IC_TIME_PER_TIMES);
may_use_times=rd_main_ram(IC_TIMES_ADDR);
IC_kind=rd_main_ram(IC_KIND_ADDR);
if(IC_kind==1)
{
wr_main_ram(IC_TIMES_ADDR,may_use_times-1);
spare_time=max_time;
}
if(IC_kind==2)
{
spare_time=rd_main_ram(IC_TIME_CURRENT);
}
set_time=30;
if(set_time>spare_time)set_time=spare_time;
set_temp=rd_main_ram(IC_SET_TEMP);
set_energy=rd_main_ram(IC_ENERGY_ADDR);
work_mode=rd_main_ram(IC_MT_WORK_MODE);
sound_num=4;
}
}
else if(n==0xff) {IC_Status=IC_ERROR;sound_num=2;
password_comp(0,0,0);password_comp(0,0,0);password_comp(0,0,0);}
else {IC_Status=IC_NOTIME;sound_num=3;
password_comp(0,0,0);password_comp(0,0,0);password_comp(0,0,0);}
}
//else {IC_Status=IC_ERROR;sound_num=2;}
}
else {IC_Status=IC_ERROR;sound_num=2;}
}
}
}
else
{
IC_Status=IC_NO;
max_time=0;
may_use_times=0;
spare_time=0;
IC_kind=0;
set_time=0;
set_temp=0;
set_energy=0;
work_mode=0;
for(n=0;n<12;n++){NumberShow(n+1,0);} //全部数字为0
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -