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

📄 icd1.c

📁 SLE4442IC卡存储程序 单片机是P89LPC9
💻 C
字号:
#include   <reg922.h>
#include   <intrins.h>


#define  RdMainMem   0x30        // outgoing data 
#define  UpdMainMem  0x38        // processing  
#define  RdPrtMem     0x34        // outgoing data 
#define  WrPrtMem    0x3C        // processing 
#define  RdSecMem     0x31        // outgoint data 
#define  UpdSecMem   0x39        // processing 
#define  CmpVerDat   0x33        // processing 
unsigned  char a=0;

sbit   led=P3^1; 
sbit   ic=P1^4; 
sbit   power=P0^0; 
sbit   rst = P1^7; 
sbit   clk = P1^6; 
sbit   io  = P3^0;


  void delay(unsigned  int x)  
{ 
   unsigned  int  i; 
 	for(i=0;i<x;i++)  
 	_nop_();
}
void oneplus() //所有操作结束后,IFD再发一个脉冲,使IO进入高阻状态
{ 
    clk=1; 
    delay(20); 
    clk=0; 
    delay(20); 
}
unsigned char rcvbyte() 
{ 
    unsigned char i,temp,value; 
       
    value=0; 
    io=1;

    for(i=0;i<8;i++) 
    { 
        clk=1; 
        temp=(unsigned char)io; 
        clk=0; 
        value |= (temp<<i); 
		//delay(3);
    } 
     return value; 
} 

void sendbyte(unsigned char byte) 
{
    unsigned char i,temp; 

    for(i=0;i<8;i++) 
    { 
        temp= ((byte>>i) & 0x01); 
        io=(bit)temp; 
        clk=1; 
		delay(3);
        clk=0; 
    } 

} 
void reset(unsigned char *buf) 
//void reset() 
{ 
	unsigned char i,a; 
    
	rst=1; 
	delay(1);
    clk=1; 
	delay(1);
  	clk=0;
	delay(1); 
   	rst=0; 
    delay(3);
	
    for(i=0;i<4;i++) 
	{ 
	    a=rcvbyte(); 
		buf[i]=a;	
	}
} 


void sendcommand(unsigned char cmd[3]) 
{ 
    unsigned char i; 

    clk=0; 
	delay(1);
    io=1; 
	delay(1);
    clk=1;
	delay(1); 
    io=0; 
	delay(1);
    clk=0;
	delay(1); 
   
    //IC卡在时钟的上升沿读取数据 
    for(i=0;i<3;i++) 
        sendbyte(cmd[i]); 
    
    io=0; 
	delay(1);
	clk=1;
	delay(1); 
    io=1; 
    //结束信号后,scl=1,sda=1
} 

//读取主存储器 
//addFrom:0~255,一旦addFrom确定,有效读取的字节数也就确定了,为256-addFrom
//ulen:0~255,缓冲空间长度,256-addFrom<=ulen
void readmm(unsigned char addr,unsigned char *buffer,unsigned char n) 
{ 
    unsigned int i; 
    unsigned char cmd[3]; 
    
    cmd[0]=RdMainMem; 
    cmd[1]=addr; 
    cmd[2]=0; 
    sendcommand(cmd); 
    
    //开始读取数据 
    clk=0; 
    for(i=0;i<256-addr;i++) 
    {     
        if(i<n)      	
        { 
            buffer[i]=rcvbyte(); 
        } 
        else		
        {     
            cmd[0]=rcvbyte(); 	
        } 
    } 
} 

//读取保护内容,一共32位,4个字节 
void readpm(unsigned char buf[4]) 
{ 
    unsigned char i,cmd[3]; 
    
    cmd[0]=RdPrtMem; 
    cmd[1]=cmd[2]=0; 
    sendcommand(cmd); 
    
    //开始读取数据 
    clk=0; 
    for(i=0;i<4;i++) 
    {     
        buf[i]=rcvbyte(); 
    } 

} 
//更新主存储器的内容 
void updatemm(unsigned char addr,unsigned char value) 
{ 
    unsigned char i,cmd[3]; 
 
    cmd[0]=UpdMainMem; 
    cmd[1]=addr; 
    cmd[2]=value; 
    sendcommand(cmd); 

    clk=0; 
    io=0; 
    for(i=0;i<254;i++) 
    {     
        oneplus(); 
    } 
    io=1; 
    oneplus(); 

} 
void writemm(unsigned char addr,unsigned char *buffer,unsigned char n)
{
	unsigned char i;
	for(i=0;i<n;i++)
		updatemm(addr+i,buffer[i]);
		
	
}

//更新保护存储器中的内容 
void writepm(unsigned char addr, unsigned char value) 
{ 
    unsigned char len; 
    unsigned char buf[3]; 

    buf[0]=WrPrtMem; 
    buf[1]=addr; 
    buf[2]=value; 
    sendcommand(buf); 

    //给脉冲 
    clk=0; 
    io=0; 
    for(len=0;len<254;len++) 
    {     
        oneplus(); 
    } 
    io=1; 
} 

//读取安全区的内容 
void readsm(unsigned char buf[4]) 
{ 
    unsigned char i,cmd[3],a; 
    
    cmd[0]=RdSecMem; 
    cmd[1]=cmd[2]=0xff; 
    sendcommand(cmd); 

    //开始读取数据 
    clk=0; 
    for(i=0;i<4;i++) 
    {     
        a=rcvbyte(); 
		buf[i]=a;
    } 

} 
//更新安全区的内容 
void updatesm(unsigned char addr, unsigned char value) 
{ 
    unsigned char i,cmd[3]; 

    cmd[0]=UpdSecMem; 
    cmd[1]=addr; 
    cmd[2]=value; 
    sendcommand(cmd); 
	      
    clk=0; 
    io=0; 
    for(i=0;i<254;i++) 
    {     
        oneplus(); 
    } 
    io=1; 
    oneplus(); 
		
} 

//比较密码 
int verifypwd(unsigned char value[3]) 
{ 
    unsigned char len; 
    unsigned char buf[4]; 

    readsm(buf); 
    if(buf[0]== 0) 
        return 0; 

    //计数一次,依次将D0,D1,D2置0 

    for(len =0;len <3;len++) 
        if(buf[0] & (1 << len) ) 
        { 
            buf[0] &= ~(1<<len); 
            break; 
        } 

    updatesm(0,buf[0]);  


    for(len = 0;len < 3;len++) 
    { 
        buf[0]=CmpVerDat; 
        buf[1]=len+1; 
        buf[2]=value[len]; 
        sendcommand(buf); 
         
        clk=0; 
        io=0; 
        delay(10); 
        oneplus(); 
        oneplus(); 

        io=1; 
        delay(10); 
        oneplus(); 
    } 
    updatesm(0,0xff); 
    readsm(buf); 
    if(buf[0] & 0x07 == 0x07) 
        return 0; 			//正确返回0
    else  
        return -1;			//错误返回-1

}
/*bit verifypwd(unsigned char value[3]) 
{ 
    unsigned char len; 
    unsigned char buf[4]; 

    readsm(buf); 
    if(buf[0]== 0) 
        return 0; 

    //计数一次,依次将D0,D1,D2置0 

    for(len =0;len <3;len++) 
        if(buf[0] & (1 << len) ) 
        { 
            buf[0] &= ~(1<<len); 
            break; 
        } 

    updatesm(0,buf[0]);  


    for(len = 0;len < 3;len++) 
    { 
        buf[0]=CmpVerDat; 
        buf[1]=len+1; 
        buf[2]=value[len]; 
        sendcommand(buf); 
         
        clk=0; 
        io=0; 
        delay(10); 
        oneplus(); 
        oneplus(); 

        io=1; 
        delay(10); 
        oneplus(); 
    } 
    updatesm(0,0xff); 
    readsm(buf); 
    if(buf[0] & 0x07 == 0x07) 
        return 1; 
    else  
        return 0; 

} */

 void   main()
{  
	int Err=2;
   	unsigned char arrwr[5]={5,7,5,3,4,};
	unsigned char arrwr1[5]={0,2,2,4,4,};
	unsigned char arr[10];
	unsigned char arr1[6];
//	unsigned char arr2[1]={0x88};
	unsigned char pwd[3]={0xff,0xff,0xff};
  
    P3M1=0x00;
	P3M2=0x00;
	P0M1=0x00;
	P0M2=0x00;
    P1M1=0x00;
	P1M2=0x00;
	power=0;
	led=1;
	while(ic)
	{	}
    power=0;
 	P3M1&=0x00;
 //   led=0;		
while(1)

{	 power=0;
    reset(arr);
  //  reset(arr);
//	readsm(arr);
	reset(arr);
	readpm(arr);
	reset(arr);
    readmm(0,arr,5);
	pwd[0]=0xff;pwd[1]=0xff;pwd[2]=0xff;
	Err=verifypwd(pwd);
    /*readmm(0X00,arr1,2);
	if( (arr1[0]==0xA2) && (arr1[1]==0x13) )
          led=0;
	  else   led=1;*/
/*	  led=0;
	pwd[0]=0xff;pwd[1]=0xff;pwd[2]=0xff;
	Err=verifypwd(pwd);
    if(Err==0)
      {   readmm(53,arr1,5);
	      writemm(53,arrwr,5);
    	  readmm(53,arr1,5);
		  Err=-1;
		  power=1;
	  }
     else
           led=1;
/*	reset(arr);
	readsm(arr);
	reset(arr);
	readpm(arr);
	reset(arr);
    readmm(0,arr,5);
	pwd[0]=0xff;pwd[1]=0xff;pwd[2]=0xff;
	Err=verifypwd(pwd);
    if(Err=0)
      {   writemm(53,arrwr,5);
    	  readmm(53,arr1,5);
	  }
  /*	readsm(arr);
	readpm(arr);	
	readmm(53,arr,2);
	writemm(53,arrwr1,5);
	readmm(53,arr,5);
//	verifypwd(arr1);
/**********************************************************/
	
	/*writemm(53,arrwr,5);
	*readmm(53,arr1,5);
	
/**********************************************************/

	}
}


⌨️ 快捷键说明

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