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

📄 sle4428.c

📁 西门子SLE4428卡片C源代码
💻 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 + -