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

📄 ic.c

📁 接触式IC卡
💻 C
📖 第 1 页 / 共 2 页
字号:
   unsigned char ii=0;
   unsigned char temp0[2]={0,0};
   temp0[1]=(unsigned char)(Information);
   temp0[0]=(unsigned char)(Information>>8);
   aa=&temp0[0];
   for(ii=0;ii<2;ii++,aa++)
   {
   	 WriteMainMemory(Address+ii,aa); 
   }
}

/*************IC数据测试(只校验金额)*****************/
/***************************************************
* 名称: IC_test()
* 说明: 
* 功能: 测试数据与备份数据是否一致  
* 调用: 
* 输入: 
* 返回值:返回正确的数据 
*****************************************************/  
unsigned int IC_test(void)
{
 unsigned int Temp32=0;//(32,33)数据
 unsigned int Temp34=0;//(34,35) 备份数据
 unsigned int Midder=0;//
 Temp32=IC_information(32);
 Temp34=IC_information(34);
 if(Temp32==Temp34)
   return (Temp32);
 else
   {
    WR_IC_information(Temp34,32);//先检测(32,33)数据 //把(34,35)数据写入前者,如果正常,则把两者数据全改成(32,33)
    Midder=IC_information(32);   //再读出(32,33)
   }
   if(Midder==Temp34)
     {
      WR_IC_information(Temp32,32);                                                              
  	  WR_IC_information(Temp32,34);
  	  return(Temp32);
  	 }
   else
     {
       WR_IC_information(Temp32,34);
       Midder=IC_information(34);//再读出(34,35)
       if(Midder==Temp32)
         {
           WR_IC_information(Temp34,32);                                                              
  	       WR_IC_information(Temp34,34);
  	       return(Temp34); 	
         }
       else
         return (0);
     }
}//end



/**************************************************
**************************************************
*******测试该机的区域码,如果该机没有区域码,
*******将写把首次插入的卡做为其区域码
/**************************************************/
/**************************************************/
/**************************************************/
void test_User(void)
{     	 
	unsigned int kk=0;
  unsigned int MM=0;
            kk=read_area();         //读存储的区域码 (eeprom)
            MM=IC_information(241); //读卡内的区域码 (sel4442)
            if(kk>65000)            //如果没有,则记录第一次写入的区域码
             {
             	write_area(MM);       //写入区域码到识别位
             	IC_error=0xaa;
             	kk=MM;
             }
             if(MM==kk)
              {
                 // money=IC_test(); //读出卡内的余额(32,33)
                  IC_error=0xaa;          //允许工作
                  if(money==0)     //判断money==0,是卡错还是金额为0
                    {
                   		kk=IC_information(34); //读出卡内的余额(34,35)
                   		MM=IC_information(32);
                   	 	if(kk==MM)
                   	   	 money=0;            //金额为0
                   	 	else
                   	   	 IC_error=0x55;         //非法卡,卡错
                   	}
               }
              else   IC_error=0x55;           // 区域码不对,非法卡
}//end

/*******************************************/
//ic卡启用的特效,闪烁三次,伴有鸣笛,显示数字
/*******************************************/ 
void IC_START(void)
{
   uchar xxx=0;
   for(;xxx<3;xxx++)
   {
      show_ic_start();
      BELL(1); 
   }	
}


/*******************************************/
//计算天数 
/*******************************************/ 
void count_day(void)
{
	 uchar temp_day[2]={0,0};	
   temp_day[0]=DAY/100;
   temp_day[1]=DAY%100;
   show_data(5,temp_day[0]);//显示高位
  // delayms(500);//达到显示效果 
   show_data(6,temp_day[1]);//显示低位
   
}



/*******************************************/
//操作IC。 
/*******************************************/ 
void ic_modify(void)
{
 unsigned char *ss;
 unsigned char pp=0;
 unsigned char *tt;
 unsigned char *uu;
 uchar  day_NO=0;    //天数
 unsigned char Fresh_psw[3]={0xff,0xff,0xff};//卡初始密码
 unsigned char Psw[3]={0x8F,0x8B,0xA1}; //卡密码

 DDRE|=0X07;
 PORTE|=0X07;
 tt=&pp;
 if(IC_power())                         //测试卡是否上电
  {
  	  power_on();
  	  ResetIC();
  	  ReadMainMemory(248,tt,1);       //读取卡类型码
 //22永解  33一次解  44密码卡  55用户卡
  	  if((pp==22)||(pp==33)||(pp==44)||(pp==55)) //表示上旧卡
  	  {
  	      ss=&Psw[0];
          IC_test_ok=VerifyPassword(ss);  //把IC卡密码正确标志改为全局变量IC_test_ok
  	  }
  	  else                                //否则为新卡,与原始密码较验
  	  {
          ss=&Fresh_psw[0];
          IC_test_ok=VerifyPassword(ss);  //把IC卡密码正确标志改为全局变量IC_test_ok
          IC_error=0x55;                  //非法卡标志 
      }
      switch(pp)                          //测试卡类型
       {
         case 22:                     //永久解码卡,内部使用
          {
  	         if(IC_test_ok==1)        //校验成功
  	         {
  	             if(IC_chok==0xaa)
  	             {
  	               IC_chok=0x55;
  	               write_IC(IC_chok);
                   //start_signal=0x55;   //停止IC标志
                   write_area(65535);   //初始化区域码
                   IC_error=0xaa;
                   BELL(1);  
                   DelayMs(400);
                   //BELL(1);  
                 }  
             }
            else 
                 IC_error=0x55;           //非法卡标志  
          } break; //22
         case 33:                         //一次性解锁卡
         {       
      	  // j=VerifyPassword(ss);
  	         if(IC_test_ok==1)            //校验成功
  	         {
  	             if(IC_chok==0xaa)
  	              {
  	                 IC_chok=0x55;
  	                 WriteMainMemory(248,0);//清第248字节的区位码标志,作废该卡
                     WriteSafeMemory(1,Fresh_psw[0]);
                     WriteSafeMemory(2,Fresh_psw[1]);
                     WriteSafeMemory(3,Fresh_psw[2]);  //修改密码:FFFFFF
                     write_IC(IC_chok);   
                     write_area(65535);   //初始化区域码
                     //start_signal=0x55;//停止IC标志
                     BELL(1);  
                     DelayMs(400);
                     BELL(1);  
                 }  
             }
             else 
                 IC_error=0x55;          //非法卡标志  
        } break;	 //33
        case 44: //发行卡的密钥卡
          {
             if(IC_test_ok==1)        //校验成功
  	          {
  	          	money_mather=IC_information(32);//读密钥卡储值
  	          	//temp_arrea  =IC_information(241); //读密钥卡地址 
  	            //write_area(temp_arrea);//一旦插入密钥卡,便把该卡的地址写入到该机
  	            //IC_chok=0;
  	          	IC_chok=0xff;
                write_IC(IC_chok);
  	           // issue_signal=4;        //进入发卡界面程序
  	          }
             else 
                 IC_error=0x55;           //非法卡标志        
         	    
          } break;
         case 55:                 //用户卡  
          {  
          	  if(IC_test_ok==1)        //校验成功
  	          {
                if(IC_chok==0x55)
                {
                  //start_signal=0xaa;//启动IC标志
                  IC_chok=0xaa;//加锁
      	          write_IC(0xaa);	
      	        }
      	        money=IC_test();
      	        test_User(); 
      	        money22=money;                                          
      	      }
      	      else  //如果密码不对,且该卡为用户卡,则显示时间,但不能使用 
      	      {
      	     	  IC_error=0x55;           //非法卡标志
      	      }
          } break; //55
      }//switch|(pp)
 } //power=1
 else 
  { 
  	IC_test_ok=0;                  //一旦卡下电便清除验校标志
  	if(IC_chok==0x55)                    //解锁状态(0表示加锁,非0解锁)
  	   IC_error=0xaa;                    //允许工作标志
    else
      {
  	    //IC_error=2;                    //为加锁状态 并且卡没有上电  "请插卡标志" 
  	    //xunhuan=1;                     //为了一次消除显示区
  	     money=0;
  	  }
  }
}


/****************************操作IC卡***********************/
void ic_comporation(void)
{
  if(IC_test_ok==0)
    ic_modify();
  else if(IC_power()==0)                //从有卡到无卡,执行下面程序
       {
       	 IC_test_ok=0;                  //一旦卡下电便清除验校标志
  	     if(IC_chok==0xaa)              //加锁状态(0xaa表示加锁,0x55解锁)
  	      {
  	      	  money=0;
  	          show_ic_money();
  	      }
  	     else
  	      {
  	        money=0;
/*************无卡的标致开始******************/
   		      Write_VFD_Specificly(12,0x10);//   
   	        Write_VFD_Specificly(13,0x18);//  
   	        Write_VFD_Specificly(14,0x00);//
   	        Write_VFD_Specificly(15,0x00);//
   	        Write_VFD_Specificly(16,0x18);//
   	        Write_VFD_Specificly(17,0x00);//
/*************无卡的标致结束******************/	
  	      }
  	   }
}//end


/*******************************************/
//显示卡的状态
/*******************************************/
void show_ic_state(void)
{
  if(IC_show_switch==0x55)//IC状态显示打开
  {
   	 if(IC_power())                //测试卡是否上电
   	 {
   	   if((money>0)&&(IC_error=0x55))  //为用户卡,但卡非法
   	    {
   	      show_ic_money();   //显示金额
   	    }
   	   else if((money==0)&&(IC_error=0x55)) //为非法卡
   	        {
   	           show_ic_error();   //显示FFFF	
   	        }
   	        else if((money>0)&&(IC_error=0xaa)) //合法卡
   	              {
   	                show_ic_money();   //显示金额
   	              }
   	 }
   	 else if((IC_chok==0xaa)&&(IC_test_ok==0)) //无卡且加锁
   	      {
   	         /*************显示0******************/
   	         show_data(5,0);
   	         show_data(6,0);
//   		           Write_VFD_Specificly(12,0x10);//   
//   	             Write_VFD_Specificly(13,0x18);//  
//   	             Write_VFD_Specificly(14,0x00);//
//   	             Write_VFD_Specificly(15,0x00);//
//   	             Write_VFD_Specificly(16,0x18);//
//   	             Write_VFD_Specificly(17,0x00);//
             /*************显示0******************/  	
   	      }
   	      else if((IC_chok==0x55)&&(IC_test_ok==0))//无卡且解锁
   	            {
   	               /*************无卡的标致开始******************/
   		             Write_VFD_Specificly(12,0x10);//   
   	               Write_VFD_Specificly(13,0x18);//  
   	               Write_VFD_Specificly(14,0x00);//
   	               Write_VFD_Specificly(15,0x00);//
   	               Write_VFD_Specificly(16,0x18);//
   	               Write_VFD_Specificly(17,0x00);//
                   /*************无卡的标致结束******************/ 	
   	            }
     IC_show_switch=0xaa;   //显示关,只显示一次
   } 
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -