?? bl7442_card.h
字號(hào):
/*...................................................................................*/
/*有關(guān)BL7442ic卡的函數(shù),包括:
Delay(uchar j)延時(shí)函數(shù)、ic_start()開(kāi)始條件函數(shù)、ic_stop()停止條件函數(shù)、clock()時(shí)針函數(shù)
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() 復(fù)位停止函數(shù)
ISO_no_read() reads 32 bit ISO stasndard response to reset
rd_main_ram(uchar read_start_addr)讀主存儲(chǔ)區(qū)函數(shù)
proc_mode_chek() ic_card 在處理模式時(shí)進(jìn)行監(jiān)測(cè)是否處理完畢,最大延時(shí)255個(gè)時(shí)鐘
*/
/*...................................................................................*/
#define uchar unsigned char
#define uint unsigned int
#define rst P3_2 /*sle4442復(fù)位*/
#define sdio P3_1 /*sle4442輸出*/
#define sclk P3_0 /*sle4442時(shí)鐘*/
//定義對(duì)各存儲(chǔ)器的操作命令
#define RD_MAIN_RAM 0X30 //讀主存儲(chǔ)器 ic卡模式:outgoing data
#define WR_MAIN_RAM 0X38 //寫(xiě)主存儲(chǔ)器 ic卡模式:processing
#define RD_P_RAM 0X34 //讀保護(hù)存儲(chǔ)器 ic卡模式:outgoing data
#define WR_P_RAM 0X3C //寫(xiě)保護(hù)存儲(chǔ)器 ic卡模式:processing
#define RD_PSC_RAM 0X31 //讀安全存儲(chǔ)器 ic卡模式:outgoing data
#define WR_PSC_RAM 0X39 //寫(xiě)安全存儲(chǔ)器 ic卡模式:processing
#define COMP_PSC_RAM 0X33 //比較安全存儲(chǔ)器 ic卡模式:processing
unsigned char psc,protect[4],sm[4];
unsigned char ISO[4]; //存放復(fù)位響應(yīng)數(shù)據(jù)
//短延時(shí)
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 在處理模式時(shí)進(jìn)行監(jiān)測(cè)是否處理完畢,最大延時(shí)255個(gè)時(shí)鐘
/*.................................................................................*/
void proc_mode_chek()
{
uint i;
for(i=0;i<512;i++)
{
if (sdio!=0) i=511;
else clock();
}
}
/*................................................................................*/
//寫(xiě)命令子程序
//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();
}
}
/*..................................................................................*/
//寫(xiě)主存儲(chǔ)器的數(shù)據(jù),
//start_addr:從主存儲(chǔ)器寫(xiě)數(shù)據(jù)的首地址
//*data_addr:要寫(xiě)的數(shù)據(jù)的首地址
//uint wr_bytes:要寫(xiě)的字節(jié)數(shù)
/*...................................................................................*/
void wr_main_ram(uchar start_addr,uchar dat)
{
write_eepram(WR_MAIN_RAM,start_addr,dat);
}
/*...................................................................................*/
//讀取保護(hù)\安全存儲(chǔ)器4個(gè)字節(jié)的數(shù)據(jù),數(shù)據(jù)一地址指針rd_data_ptr中
//uchar ram_type:保護(hù)寄存器=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();}
}
}
///*..........................................................................................*/
//寫(xiě)保護(hù)、安全存儲(chǔ)器的數(shù)據(jù),
//start_addr:從保護(hù)存儲(chǔ)器寫(xiě)數(shù)據(jù)的首地址 00-03h
//*data_addr:要寫(xiě)的數(shù)據(jù)的首地址
//uint wr_bytes:要寫(xiě)的字節(jié)數(shù) 03h-start_addr=0~3
//uchar ram_type:保護(hù)寄存器=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));
}
} */
/*..........................................................................................*/
/*密碼校驗(yàn)函數(shù)*/
/*..........................................................................................*/
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;
}
/*..................................................................................*/
//檢測(cè)是否有符合標(biāo)準(zhǔn)的ic卡插入的函數(shù)
/*..................................................................................*/
bit check_card()
{
ISO_no_read();
if(ISO[0]==162&&ISO[1]==19)return 1;
else return 0;
}
//由16位數(shù)得到低8位數(shù)的函數(shù)
/*unsigned char get_8_L(unsigned int dat)
{
unsigned char n;
dat<<=8;
dat>>=8;
n=dat;
return n;
}*/
//由16位數(shù)得到高8位數(shù)的函數(shù)
/*unsigned char get_8_H(unsigned int dat)
{
unsigned char n=0;
dat>>=8;
n=dat;
return n;
}*/
/*由高8位數(shù)和低8位數(shù)得到16位數(shù)的函數(shù)*/
/*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);} //全部數(shù)字為0
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -