📄 icd1.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 + -