⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bl7442_card.h

📁 4442逻辑加密IC卡读写底层C51程序
💻 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 + -