📄 sle4428.c
字号:
#include <reg51.h>
#include <define.h>
#define PSC1 0x12
#define PSC2 0x34
typedef unsigned int uint;
typedef unsigned char uchar;
/**程序接口
void sle4428_read_block(uchar* buffer,uint size,uint address);
uchar sle4428_write_block(uchar* buffer,uint size,uint address);
uchar check_card(void);
uchar check_1_2(void);
**/
extern void delay_us(uchar count);
uchar sle4428_rb(uint addr);
void sle4428_command(uchar command,uint addr,uchar datas);
/************************************/
void sle4428_write(uchar s_data)
{
uchar i;
for(i = 0; i < 8; i++)
{
p_io=(bit)(s_data&0x01);
p_clk = 1;
delay_us(12);
p_clk = 0;
delay_us(2);
s_data = s_data >> 1;
}
}
/************************************/
uchar sle4428_read(void)
{
uchar i;
uchar return_byte;
uchar temp;
return_byte = 0;
for(i = 0; i < 8; i++)
{
return_byte = return_byte >> 1;
p_clk = 1;
if(p_io) return_byte |= 0x80;
delay_us(4);
p_clk = 0;
delay_us(4);
}
return return_byte;
}
/************************************/
void sle4428_cmp(void)
{
uint j;
j = 0;
while (j < 0x888 && p_io == 1)
{
delay_us(4);
p_clk = 1;
delay_us(12);
p_clk = 0;
delay_us(4);
j++;
}
}
/************************************/
void sle4428_programming(uchar count)
{
uchar i;
uint j;
j=0;
for(i = 0; i <= count; i++)
{
p_clk = 1;
delay_us(12);
p_clk = 0;
delay_us(4);
}
while (j < 0x888 & p_io == 1)
{
j++;
}
}
/************************************/
void sle4428_reset(void)
{
uchar i,j;
i = 31;
p_clk = 0;
p_rst = 0;
delay_us(16);
p_rst = 1;
delay_us(4);
p_clk = 1;
delay_us(12);
p_clk = 0;
delay_us(4);
p_rst = 0;
delay_us(4);
while (i--)
{
p_clk = 1;
delay_us(12);
p_clk = 0;
delay_us(12);
}
p_io = 1;
}
/************************************/
uchar sle4428_vPSC(uchar password1, uchar password2)
{
uchar counter = sle4428_rb(1021);
counter = counter << 1;
sle4428_reset();
sle4428_command(0x32,1021,counter);
sle4428_programming(102);
sle4428_command(0x0d,1022,password1);
sle4428_cmp();
sle4428_command(0x0d,1023,password2);
sle4428_cmp();
sle4428_command(0x33,1021,0xff);
sle4428_programming(102);
counter = sle4428_rb(1021);
if (counter == 0xff)
return 0;
return 1;
}
/************************************/
uchar sle4428_rb(uint addr)
{
sle4428_reset();
sle4428_command(0x0e,addr,0xff);
return sle4428_read();
}
/************************************/
void sle4428_command(uchar command,uint addr,uchar datas)
{
union aa
{
uchar a[2];
uint address;
} c;
c.address = addr;
c.a[0] = c.a[0] << 6;
command = command | c.a[0];
p_rst = 1;
delay_us(12);
p_clk = 0;
sle4428_write(command);
sle4428_write(c.a[1]);
sle4428_write(datas);
p_io = 1;
delay_us(4);
p_rst = 0;
delay_us(4);
p_clk = 1;
delay_us(12);
p_clk = 0;
delay_us(4);
}
/************************************/
void sle4428_read_block(uchar* buffer,uint size,uint addr)
{
uint i;
for (i=0;i<size;i++)
{
*buffer = sle4428_rb(addr);
buffer++;
addr++;
}
}
/************************************/
uchar check_card(void)
{
uchar buffer[4];
sle4428_read_block(buffer,4,0);
if (buffer[0] != 0x92) return 1;
if (buffer[1] != 0x23) return 1;
if (buffer[2] != 0x10) return 1;
if (buffer[3] != 0x91) return 1;
if(sle4428_vPSC(PSC1, PSC2) != 0)
return 1;
}
/************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -