#include "iccard.h"
#include <REG52.H>
#ifndef uchar
#define uchar unsigned char
#endif
//sbit CCRST=P0^1;
//sbit CCCLK=P0^2;
//sbit CCIO=P0^3;
//void sendtoPC(uchar*);
//void sendBuffer(char* buf,char len) ;
void Delay(int x)
{
int i;
for(i=(x<<1);i>0;i--);
}
void OnePlus()
{
CCCLK=1;
Delay(20);
CCCLK=0;
Delay(20);
}
unsigned char ReadByte()
{
uchar TempByte;
uchar Value;
uchar i;
Value=0;
for(i=0;i<8;i++)
{
CCCLK=1;
TempByte=(unsigned char)CCIO;
Delay(10);
CCCLK=0;
Delay(10);
Value |= (TempByte<<i);
}
return Value;
}
void ICSendByte(uchar byte)
{
uchar TempByte;
uchar i;
for(i=0;i<8;i++)
{
TempByte= ((byte>>i) & 0x01);
CCIO=(bit)TempByte;
Delay(8);
CCCLK=1;
Delay(10);
CCCLK=0;
Delay(8);
}
}
void IC_Reset(uchar *buffer)
{
uchar len;
CCCLK=0;
CCRST=0;
CCIO=1;
Delay(800);
CCRST=1;
Delay(10);
CCCLK=1;
Delay(10);
CCCLK=0;
Delay(50);
CCRST=0;
Delay(10);
for(len = 0;len <4;len++)
buffer[len]=ReadByte();
}
void SendCommand(uchar Cmd[3])
{
uchar i;
//start condition
//当时钟线为高的时候,IO线从1到0
CCCLK=0;
CCIO=1;
Delay(4);
CCCLK=1;
Delay(8);
CCIO=0;
Delay(8);
CCCLK=0;
Delay(5); //start condition
//data
//IC卡在时钟的上升沿读取数据
for(i=0;i<3;i++)
ICSendByte(Cmd[i]);
//stop condition
//当时钟线为高的时候, IO从0到1
CCIO=0;
Delay(10);
CCCLK=1;
Delay(10);
CCIO=1;
//命令发送结束
Delay(10);
}
//读取主存储器
void ReadMainMemory(uchar addrFrom,uchar* buffer,uchar ulen)
{
unsigned int len;
uchar buf[3];
buf[0]=RdMainMem;
buf[1]=addrFrom;
buf[2]=0;
SendCommand(buf);
// sendtoPC(" send ok");
//开始读取数据
CCCLK=0;
Delay(10);
for(len=0;len<256-addrFrom;len++)
{
if(len < ulen)
{
buffer[len]=ReadByte();
// sendBuffer(&buffer[len],1);
}
else
{
buf[0]=ReadByte();
// sendBuffer(buf,1); //要给脉冲,但丢弃数据
}
}
// sendtoPC("Read OK");
// 给个结束标志
OnePlus();
}
//读取保护内容,一共32位,4个字节
void ReadProtectedMem(uchar rdBuf[4])
{
uchar len;
uchar buf[3];
buf[0]=RdPrtMem;
buf[1]=buf[2]=0;//addrFrom;
SendCommand(buf);
//开始读取数据
CCCLK=0;
Delay(10);
for(len=0;len<4;len++)
{
rdBuf[len]=ReadByte();
}
// 给个结束标志
OnePlus();
}
//更新主存储器的内容
void UpdateMainMemory(uchar addr,uchar value)
{
uchar len;
uchar buf[3];
buf[0]=UpdMainMem;
buf[1]=addr;
buf[2]=value;
SendCommand(buf);
//给脉冲
CCCLK=0;
Delay(10);
CCIO=0;
Delay(10);
for(len=0;len<254;len++)
{
OnePlus();
}
CCIO=1;
Delay(10);
OnePlus();
// OnePlus();
}
//更新保护存储器中的内容
void WriteProtectedMem(uchar addr, uchar value)
{
uchar len;
uchar buf[3];
buf[0]=WrPrtMem;
buf[1]=addr;
buf[2]=value;
SendCommand(buf);
//给脉冲
CCCLK=0;
Delay(3);
CCIO=0;
Delay(10);
for(len=0;len<254;len++)
{
OnePlus();
}
CCIO=1;
Delay(10);
OnePlus();
}
//读取安全区的内容
void ReadSecMemory(uchar buffer[4])
{
uchar len;
uchar buf[3];
buf[0]=RdSecMem;
buf[1]=buf[2]=0xff;//addrFrom;
SendCommand(buf);
//开始读取数据
CCCLK=0;
Delay(10);
for(len=0;len<4;len++)
{
buffer[len]=ReadByte();
}
// 给个结束标志
CCIO=1;
Delay(10);
OnePlus();
}
//更新安全区的内容
void UpdateSecMem(uchar addr, uchar value)
{
uchar len;
uchar buf[3];
buf[0]=UpdSecMem;
buf[1]=addr;
buf[2]=value;
SendCommand(buf);
//给脉冲
CCCLK=0;
Delay(10);
CCIO=0;
Delay(10);
for(len=0;len<254;len++)
{
OnePlus();
}
CCIO=1;
Delay(10);
OnePlus();
}
//比较密码
bit CompareVerifData(uchar value[3])
{
uchar len;
uchar buf[4];
ReadSecMemory(buf);
if(buf[0]== 0)
return 0;
//正确,计数一次
// if(buf[0]
for(len =0;len <3;len++)
if(buf[0] & (1 << len) )
{
buf[0] &= ~(1<<len);
break;
}
UpdateSecMem(0,buf[0]);
// sendtoPC("Update OK");
for(len = 0;len < 3;len++)
{
buf[0]=CmpVerDat;
buf[1]=len+1;
buf[2]=value[len];
SendCommand(buf);
//给脉冲
CCCLK=0;
// Delay(5);
CCIO=0;
Delay(10);
OnePlus();
OnePlus();
CCIO=1;
Delay(10);
OnePlus();
}
UpdateSecMem(0,0xff);
ReadSecMemory(buf);
if(buf[0] & 0x07 == 0x07)
return 1;
else
return 0;
}
main()
{//uchar idata *p;
uchar data tem[3];
//uchar t[1];
//t[0]=0x25;
tem[0]=0xff;tem[1]=0xff;tem[2]=0xff;
Read_Buffer[0]=0x00;
init();
if(IC_IN==0)
{IC_VCCC=1;
IC_LED_VER=0;
Delay10us();
if(IC_Read_Flag==1)
{ResetCard();
ReadMainMem(0x52,&Read_Buffer[0],1);
BreakOperate();
Delay10us();
//p=Read_Buffer;
DPL=Read_Buffer[0];}
/* ResetCard();
IC_Verify_Flag=Verify(tem);
BreakOperate();
Delay10us();
if(IC_Verify_Flag==1)
{IC_LED_VER=1;
WriteMainMem(0x52,0x25);
//BreakOperate();
Delay10us();}
if(IC_Read_Flag==1)
{ResetCard();
ReadMainMem(0x52,&Read_Buffer[0],1);
BreakOperate();
Delay10us();
//p=Read_Buffer;
DPL=Read_Buffer[0];}*/
Delay10us();
//p=Read_Buffer;
//DPH=*p;
IC_VCCC=0;}
}
- 1
- 2
前往页