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

📄 memcard.lst

📁 最流行的mifare卡读卡器全部源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V6.12  MEMCARD                                                                12/09/2002 13:03:11 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE MEMCARD
OBJECT MODULE PLACED IN memcard.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE memcard.c DB OE SMALL ROM(LARGE) 

stmt level    source

   1          #include <stdio.h>
   2          #include <string.h>
   3          #include "memcard.h"
   4          //#include "memcard1.h"
   5          #pragma  ot(2)
   6          void delay(uint iTime)
   7          {
   8   1      	uint i;
   9   1      	for(i=0;i<iTime;i++);
  10   1      }
  11          
  12          //上电函数
  13          void power_on(void)
  14          {
  15   1      	VCC = 1;
  16   1      }
  17          
  18          //下电函数
  19          void power_down(void)
  20          {
  21   1      	VCC = 0;
  22   1      }
  23          
  24          /*******************************************************************************************/
  25          /********以下为SLE4442卡的函数**************************************************************/
  26          /*******************************************************************************************/
  27          
  28          //复位应答
  29          void answer_reset_4442(void)
  30          {
  31   1      	uchar data i;
  32   1      	RST=HIGH;
  33   1      	SDA=HIGH;
  34   1      	delay(DELAY_SCL_4442);
  35   1      	SCL = 0;
  36   1      	delay(DELAY_SCL_4442);
  37   1      	SCL = 1;
  38   1      	delay(DELAY_SCL_4442);
  39   1      	RST=LOW;
  40   1      	delay(DELAY_SCL_4442);
  41   1      	for(i=0;i<32;i++)
  42   1      	{
  43   2      		SCL = 0;
  44   2      		delay(DELAY_SCL_4442);
  45   2      		SCL = 1;
  46   2      		delay(DELAY_SCL_4442);
  47   2      	}
  48   1      	return;
  49   1      }
  50          //////////////////////////////////////////////////////////////////////////////
  51          //开始状态
  52          void begin_4442(void)
  53          {
  54   1      	SDA=HIGH;
  55   1      	delay(DELAY_SCL_4442);
C51 COMPILER V6.12  MEMCARD                                                                12/09/2002 13:03:11 PAGE 2   

  56   1      	SCL = 0;
  57   1      	delay(DELAY_SCL_4442);
  58   1      	SDA=LOW;
  59   1      	delay(DELAY_SCL_4442);
  60   1      	SCL = 1;
  61   1      	return;
  62   1      }
  63          
  64          //结束状态
  65          void stop_4442(void)
  66          {
  67   1      	SDA=LOW;
  68   1      	delay(DELAY_SCL_4442);
  69   1      	SCL = 0;
  70   1      	delay(DELAY_SCL_4442);
  71   1      	SDA=HIGH;
  72   1      	return;
  73   1      }
  74          
  75          //检查写入是否完毕
  76          bit process_4442(void)
  77          {
  78   1      	uchar data i;
  79   1      	stop_4442();
  80   1      	SCL = 1;
  81   1      	for(i=0;i<256;i++)
  82   1      	{
  83   2      		SCL = 0;
  84   2      		delay(DELAY_SCL_4442);
  85   2      		SCL = 1;
  86   2      		delay(DELAY_SCL_4442);
  87   2      		SDA=HIGH;
  88   2      		if(SDA==HIGH)
  89   2      			return TRUE;
  90   2      	}
  91   1      	return FALSE;
  92   1      }
  93          //读取一个字节保护位(a)
  94          uchar byte_read_4442_a(void)
  95          {
  96   1      	uchar data cTemp,i;
  97   1      	cTemp=0x00;
  98   1      	SDA=HIGH;
  99   1      	for(i=0;i<8;i++)
 100   1      	{
 101   2      		cTemp*=2;
 102   2      		SCL = 1;
 103   2      		delay(DELAY_SCL_4442);
 104   2      		if(SDA==HIGH)
 105   2      			cTemp++;
 106   2      		SCL = 0;
 107   2      		delay(DELAY_SCL_4442);
 108   2      	}
 109   1      	return cTemp;
 110   1      }	
 111          //写入一个字节
 112          void byte_write_4442(uchar cTemp)
 113          {
 114   1      	uchar data i;
 115   1      	for(i=0;i<8;i++)
 116   1      	{
 117   2      		SDA=cTemp&0x01;
C51 COMPILER V6.12  MEMCARD                                                                12/09/2002 13:03:11 PAGE 3   

 118   2      		SCL = 0;
 119   2      		delay(DELAY_SCL_4442);
 120   2      		SCL = 1;
 121   2      		delay(DELAY_SCL_4442);
 122   2      		cTemp=cTemp>>1;
 123   2      	}
 124   1      }
 125          
 126          //读取一个字节(b)
 127          uchar byte_read_4442_b(void)
 128          {
 129   1      	uchar data cTemp,i;
 130   1      	cTemp=0x00;
 131   1      	SDA=HIGH;
 132   1      	for(i=0;i<8;i++)
 133   1      	{
 134   2      		cTemp=cTemp/2;
 135   2      		SCL = 1;
 136   2      		delay(DELAY_SCL_4442);
 137   2      		if(SDA==HIGH)
 138   2      			cTemp=cTemp+0x80;
 139   2      		SCL = 0;
 140   2      		delay(DELAY_SCL_4442);
 141   2      	}
 142   1      	return cTemp;
 143   1      }
 144          
 145          uchar error_counter_4442(void)
 146          {
 147   1      	uchar data cTemp,i;
 148   1      	answer_reset_4442();
 149   1      	begin_4442();
 150   1      	byte_write_4442(0x31);
 151   1      	for(i=0;i<2;i++)
 152   1      	{
 153   2      		byte_write_4442(0x00);
 154   2      	}
 155   1      	stop_4442();
 156   1      	cTemp=byte_read_4442_b();
 157   1      	return cTemp&0x07;
 158   1      }
 159          /*功能:从SLE4442中读取数据
 160          参数:
 161              iOffset:读取数据起始地址
 162              iReadLen:读取数据长度
 163              sBuffer:读取数据指针
 164          返回:
 165              OP_OK
 166          																			*/
 167          bit read_sle4442(uchar iOffset,uchar iReadLen,uchar *sBuffer)
 168          {
 169   1      	uchar data i;
 170   1      	if((iOffset<0)||(iOffset>255))
 171   1      		return FALSE;
 172   1      	if((256-iOffset)<iReadLen)
 173   1      		return FALSE;
 174   1      	answer_reset_4442();
 175   1      	begin_4442();
 176   1      	byte_write_4442(0x30);
 177   1      	byte_write_4442(iOffset);
 178   1      	byte_write_4442(0x00);
 179   1      	stop_4442();
C51 COMPILER V6.12  MEMCARD                                                                12/09/2002 13:03:11 PAGE 4   

 180   1      	for(i=0;i<iReadLen;i++)
 181   1      	{
 182   2      		*sBuffer++=byte_read_4442_b();
 183   2      	}
 184   1      	stop_4442();
 185   1      	return TRUE;
 186   1      }
 187          																			/*
 188          功能:向SLE4442中写入数据
 189          参数:
 190              iOffset:写入数据起始地址
 191              iWriteLen:写入数据长度
 192              sBuffer:写入数据指针
 193          返回:
 194              OP_OK
 195          																			*/
 196          bit write_sle4442(uchar iOffset,uchar iWriteLen,uchar* sBuffer)
 197          {
 198   1      	uchar data i,ipOffset;
 199   1      	uchar *swBuffer;
 200   1      	if((iOffset<0)||(iOffset>255))
 201   1      		return FALSE;
 202   1      	if((256-iOffset)<iWriteLen)
 203   1      		return FALSE;
 204   1      	swBuffer=sBuffer;
 205   1      	ipOffset=iOffset;
 206   1      	answer_reset_4442();
 207   1      	for(i=0;i<iWriteLen;i++)
 208   1      	{
 209   2      		begin_4442();
 210   2      		byte_write_4442(0x38);
 211   2      		byte_write_4442(ipOffset++);
 212   2      		byte_write_4442(*swBuffer++);
 213   2      		if(process_4442()!=TRUE)
 214   2      			return FALSE;
 215   2      	}
 216   1      	answer_reset_4442();
 217   1      	begin_4442();
 218   1      	byte_write_4442(0x30);
 219   1      	byte_write_4442(iOffset);
 220   1      	byte_write_4442(0x00);
 221   1      	stop_4442();
 222   1      	for(i=0;i<iWriteLen;i++)
 223   1      	{
 224   2      		if(byte_read_4442_b()!=*sBuffer++)
 225   2      				return FALSE;
 226   2      	}
 227   1      	stop_4442();
 228   1      	return TRUE;
 229   1      }
 230          																			/*
 231          功能:读SLE4442卡保护位
 232          参数:
 233              sBuffer:读取数据指针
 234              iReadLen:读取数据长度
 235          返回:
 236              OP_OK
 237          																			*/
 238          bit read_pbit_sle4442(uchar iReadLen,uchar* sBuffer)
 239          {
 240   1      	uchar i;
 241   1      	if(iReadLen!=4)
C51 COMPILER V6.12  MEMCARD                                                                12/09/2002 13:03:11 PAGE 5   

 242   1      		return FALSE;
 243   1      	answer_reset_4442();
 244   1      	begin_4442();
 245   1      	byte_write_4442(0x34);
 246   1      	for(i=0;i<2;i++)
 247   1      		byte_write_4442(0xff);
 248   1      	stop_4442();
 249   1      	for(i=0;i<iReadLen;i++)
 250   1      		*sBuffer++=byte_read_4442_a();
 251   1      	return TRUE;
 252   1      }
 253          
 254          																			/*
 255          功能:写SLE4442卡保护位
 256          参数:
 257              iOffset:写入数据起始地址
 258          	sBuffer:写入数据指针
 259              iBufferLen:写入长度
 260          返回:
 261              OP_OK
 262          																			*/
 263          bit write_pbit_sle4442(uchar iOffset,uchar iBufferLen,uchar* sBuffer)
 264          {
 265   1      	uchar data i;
 266   1      	if((iOffset<0)||(iOffset>31))
 267   1      		return FALSE;
 268   1      	if(iBufferLen>(32-iOffset))
 269   1      		return FALSE;
 270   1      	answer_reset_4442();
 271   1      	for(i=0;i<iBufferLen;i++)
 272   1      	{
 273   2      		begin_4442();
 274   2      		byte_write_4442(0x3c);
 275   2      		byte_write_4442(iOffset++);
 276   2      		byte_write_4442(*sBuffer++);
 277   2      		if(process_4442()!=TRUE)
 278   2      				return FALSE;
 279   2      	}
 280   1      	return TRUE;
 281   1      }
 282          
 283          																			/*
 284          功能:比较SLE4442密码
 285          参数:
 286              sPassword:密码存放指针
 287              iPassLen:密码长度
 288          返回:
 289              OP_OK
 290          																			*/
 291          bit compare_password_sle4442(uchar* sPassword,uchar iPassLen)
 292          {
 293   1      	uchar data i,cTemp;
 294   1      	if(iPassLen!=3)
 295   1      		return FALSE;
 296   1      	cTemp=error_counter_4442();
 297   1      	if(cTemp==0x00)
 298   1      		return FALSE;
 299   1      	switch(cTemp)
 300   1      	{
 301   2      	case 0x01,0x03,0x07:
 302   2      		{
 303   3      			cTemp=cTemp&0xfe;
C51 COMPILER V6.12  MEMCARD                                                                12/09/2002 13:03:11 PAGE 6   

 304   3      			break;
 305   3      		}
 306   2      	case 0x02,0x06:
 307   2      		{
 308   3      			cTemp=cTemp&0xfc;
 309   3      			break;
 310   3      		}
 311   2      	case 0x04:
 312   2      		{
 313   3      			cTemp=cTemp&0xf8;
 314   3      			break;
 315   3      		}
 316   2      	default:
 317   2      		{
 318   3      			return FALSE;
 319   3      		}
 320   2      	}
 321   1      	answer_reset_4442();
 322   1      	begin_4442();
 323   1      	byte_write_4442(0x39);
 324   1      	byte_write_4442(0x00);
 325   1      	byte_write_4442(cTemp);
 326   1      	if(process_4442()!=TRUE)
 327   1      	{
 328   2      		return FALSE;
 329   2      	}
 330   1      	for(i=1;i<=iPassLen;i++)
 331   1      	{
 332   2      		begin_4442();
 333   2      		byte_write_4442(0x33);
 334   2      		byte_write_4442(i);
 335   2      		byte_write_4442(*sPassword++);
 336   2      		if(process_4442()!=TRUE)
 337   2      		{
 338   3      			return FALSE;
 339   3      		}		
 340   2      	}
 341   1      	answer_reset_4442();
 342   1      	begin_4442();
 343   1      	byte_write_4442(0x39);
 344   1      	byte_write_4442(0x00);
 345   1      	byte_write_4442(0xff);
 346   1      	if(process_4442()!=TRUE)
 347   1      	{
 348   2      		return FALSE;
 349   2      	}
 350   1      	if(error_counter_4442()!=0x07)
 351   1      	{
 352   2      		return FALSE;
 353   2      	}
 354   1      	return TRUE;
 355   1      }
 356          
 357          																			/*
 358          功能:读取SLE4442密码
 359          参数:
 360              sPassword:密码存放指针
 361              iPassLen:密码长度
 362          返回:
 363              OP_OK
 364          																			*/
 365          bit read_password_sle4442(uchar* sPassword,uchar iPassLen)
C51 COMPILER V6.12  MEMCARD                                                                12/09/2002 13:03:11 PAGE 7   

 366          {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -