📄 sle4442.h
字号:
uchar idata rstdata[4];
sbit IO = P0^3;
sbit RST = P0^1;
sbit CLK = P0^2;
uchar idata temp[33];
void Delay(uchar j)
{uchar data i;
i=j;
for(i;i>0;i--);
}
/*******************************************************/
/* ic_start函数 作用:启动发送命令起始条件 */
/*******************************************************/
void ic_start(void)
{
CLK=0;IO=1;Delay(1);CLK=1;Delay(1);IO=0;Delay(1);CLK=0;
}
/*******************************************************/
/* ic_stop 函数 作用:命令发送结束信号 */
/*******************************************************/
void ic_stop(void)
{
IO=0;CLK=1;Delay(2);IO=1;CLK=0;
}
/*******************************************************/
/* ic_Plus 函数 作用:时钟低跳变,输入比特数据 */
/*******************************************************/
void ic_plus(void)
{
CLK=1;Delay(2);CLK=0;Delay(2);
}
/*******************************************************/
/* ic_sendbyte 函数 作用:字节数据传送 */
/* 将byte发送到sle4442,可以是命令、数据 */
/*******************************************************/
void ic_sendbyte(uchar byte)
{
uchar data count;
for(count=0;count<8;count++) /*要传送的数据长度为8 位*/
{
if((byte>>count)&0x01)IO=1; /*判断发送位*/
else IO=0;
ic_plus(); /*发送数据位 */
}
}
/*******************************************************/
/* ic_readbyte 函数 作用:字节数据接收 */
/* 用来接收从卡传来的数据 */
/*******************************************************/
uchar ic_readbyte(void)
{ uchar data rd_data=0;
uchar data count;
for(count=0;count<8;count++)
{
CLK=0; /*置时钟线为低准备接收数据位*/
IO=1; /*置数据线为输入方式*/
Delay(1); /*时钟低电平周期大于4.7 us*/
CLK=1; /*置时钟线为高使数据线上数据有效*/
rd_data=rd_data>>1;
if(IO==1)rd_data=rd_data+0x80; /*读数据位,接收的数据位放入retc 中 */
}
CLK=0;
return(rd_data);
}
/*******************************************************/
/* ic_reset 函数 作用:复位和复位响应 */
/* 复位IC 卡并接收响应字存入rstdata[4] */
/*******************************************************/
void ic_reset(void)
{ uchar data count;
RST=0;
CLK=0;
Delay(1);
RST=1; /*产生复位时序*/
Delay(1);
CLK=1;
Delay(3);
CLK=0;
Delay(1);
RST=0;
for(count=0;count<4;count++)
rstdata[count]=ic_readbyte();
}
/*******************************************************/
/* ic_break 函数 作用:中止当前操作 */
/*******************************************************/
void ic_break(void)
{CLK=0;
Delay(1);
RST=1;
Delay(1);
RST=0;
}
/*******************************************************/
/* ic_write 函数 作用:ic卡处理数据 */
/*******************************************************/
void ic_write(void)
{
do
{
ic_plus();
}
while(IO==0);
}
/*******************************************************/
/* ic_sendcmd 函数 作用:ic卡发送命令 */
/*******************************************************/
void ic_sendcmd(uchar ic_cmd,uchar ic_add,uchar ic_data)
{
ic_start();
ic_sendbyte(ic_cmd); /*连续发送3 字节指令*/
ic_sendbyte(ic_add);
ic_sendbyte(ic_data);
ic_stop();
/*部分命令需调用处理函数 */
if(ic_cmd==0x38||ic_cmd==0x3c||ic_cmd==0x39||ic_cmd==0x33)
{ic_write();}
}
/*******************************************************************/
/* ic_compare 函数 作用:卡校验密码 */
/* 进行SLE4442 卡进行密码核对核对后方能进行写操作 */
/* 操作成功返回 0x00 */
/* 卡无效或卡损坏返回 0x01 */
/* 密码错误返回 0x02 */
/* 卡只剩1 次机会返回 0x03. */
/*******************************************************************/
uchar ic_compare(uchar pwd1,uchar pwd2,uchar pwd3)
{uchar ec;
ic_sendcmd(0x31,0x00,0x00);
ec=ic_readbyte();
switch(ec&0x07)
{
case 1:
case 2:
case 4: return 0x03;
case 3:
case 5: ec=0xf9; break;
case 6: ec=0xfa; break;
case 7: ec=0xfb; break;
default: return 0x01;
}
ic_sendcmd(0x39,0,ec);
ic_sendcmd(0x33,0x01,pwd1);
ic_sendcmd(0x33,0x02,pwd2);
ic_sendcmd(0x33,0x03,pwd3);
ic_sendcmd(0x39,1,0xff);
ic_sendcmd(0x31,0x00,0x00);
ec=ic_readbyte();
if((ec&0x07)!=0x07) return(0x02);
return(0x00);
}
/*******************************************************************/
/* ic_read_pram 函数 作用:读取保护存储器,并传到上位机 **/
/*******************************************************************/
void ic_read_pram(void)
{
uchar i;
ic_sendcmd(0x34,0x00,0x00);
for(i=0;i<32;i++)
{temp[i]=ic_readbyte();
}
temp[32]='\0';
com_send(temp);
}
/*******************************************************************/
/* ic_read_pram 函数 作用:读取主存储器,并传到上位机 **/
/*******************************************************************/
void ic_read_mram(void)
{uchar i,j;
ic_sendcmd(0x30,0x20,0x00);
for(j=0;j<14;j++)
{
for(i=0;i<32;i++)
{temp[i]=ic_readbyte();
}
temp[32]='\0';
com_send(temp);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -