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

📄 fk4428.c

📁 2106卡的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
  }
  else
  {
    _Retcode = OK;
  }

  return (_Retcode);
}
/****************************************************************************
* Function:     mifs_authentication_2                                       *
****************************************************************************/
BYTE mifs_authentication_2(BYTE _Mode, BYTE _KeyNr, BYTE _Address)
{
  BYTE _Fkt;
  BYTE _Status;
  BYTE _Retcode;

  TOGGLE_WD();

  if (_Mode & KEYB)
  {
	_Fkt = 0x61;
	_KeyNr |= _KEYB;
  }
  else
  {
	_Fkt = 0x60;
	_KeyNr |= _KEYA;
  }

  MCM_TOC       = 10;//TIMEOUT;
  MCM_BCNTS     = 16;
  MCM_KEYSTACON = _AUTH | (_Mode & 0x03);
  MCM_KEYADR    = _AUTH | _KeyNr;
  MCM_DATA      = _Fkt;
  MCM_DATA      = _Address;

  while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
  MCM_TOC = 0;

  if (_Status & (_TE | _AE | _PE | _BE))
  {
    if (_Status & _TE)
    {
      _Retcode = W_NOTAG;
    }
    else
    {
      if (_Status & _AE)
      {
		_Retcode = W_AUTH;
      }
      else
      {
	if (_Status & _PE)
	{
		  _Retcode = W_PARITY;
	}
		else
	{
	  delay_50us(10);
	  if ((MCM_DATA & 0x0A) == 0x00)
	  {
	    _Retcode = W_AUTH;
		  }
	  else
		  {
	    _Retcode = W_BITCNT;
		  }
	}
      }
    }
  }
  else
  {
    _Retcode = OK;
  }

  return (_Retcode);
}
/****************************************************************************
* Function:     mifs_halt                                                   *
****************************************************************************/
BYTE mifs_halt(void)
{
  BYTE _Status;
  BYTE _Retcode;

  TOGGLE_WD();

  MCM_BCNTS = 16;
  MCM_BCNTR = 4;
  MCM_DATA  = 0x50;
  MCM_DATA  = 0;

  MCM_TOC = 10;//TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
  MCM_TOC = 0;

  if (_Status & _TE)
  {
	_Retcode = OK;
  }
  else
  {
    _Retcode = W_CODE;
  }

  return (_Retcode);
}
/****************************************************************************
* Function:     mifs_read                                                   *
****************************************************************************/
BYTE mifs_read(BYTE _Adr, BYTE idata *_Data)
{
  BYTE i;
  BYTE _Status;
  BYTE _Retcode;
  BYTE idata _TempData[16];

  TOGGLE_WD();

  MCM_BCNTS = 16;
  MCM_BCNTR = 128;
  MCM_DATA  = 0x30;
  MCM_DATA  = _Adr;

  MCM_TOC = 10;//TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
  MCM_TOC = 0;

  if (_Status & (_TE | _BE | _PE | _CE))
  {
	if (_Status & _TE)
	{
	  _Retcode = W_NOTAG;
	}
	else
	{
	  if (_Status & _BE)
	  {
		delay_50us(31);                 // min. 1.5 ms
		i = MCM_DATA;

		if (!(MCM_STACON & _DV))
		{
		  if ((i & 0x0B) == 0x00)
		  {
			_Retcode = W_NOTAUTH;
		  }
		  else
		  {
			_Retcode = W_READ;
		  }
		}
		else
		{
		  _Retcode = W_READ;
		}
	  }
	  else
	  {
		if (_Status & _PE)
		{
		  _Retcode = W_PARITY;
		}
		else
		{
		  _Retcode = W_CRC;
		}
	  }
	}
  }
  else
  {
	for (i = 0; i < 16; i++)
	{
	  _Data[i] = MCM_DATA;
	}
	for (i = 0; i < 16; i++)
	{
	  _TempData[i] = MCM_DATA;
	}

	if (memcmp(_Data, _TempData, 16))
	{
	  _Retcode = W_BYTECNT;
	}
	else
	{
	  _Retcode = OK;
	}
  }

  return (_Retcode);
}
/****************************************************************************
* Function:     mifs_write                                                  *
****************************************************************************/
BYTE mifs_write(BYTE _Adr, BYTE idata *_Data)
{
  BYTE i;
  BYTE _Status;
  BYTE _Retcode;

  TOGGLE_WD();

  MCM_BCNTS  = 16;
  MCM_BCNTR  = 4;
  MCM_DATA   = 0xA0;
  MCM_DATA   = _Adr;

  MCM_TOC = 10;//TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
  MCM_TOC = 0;

  if (_Status & (_TE | _BE))
  {
	if (_Status & _TE)
    {
      _Retcode = W_NOTAG;
	}
    else
    {
      _Retcode = W_BITCNT;
    }
  }
  else
  {
    switch (MCM_DATA & 0x0B)
	{
      case 0x00:
		_Retcode = W_NOTAUTH;
	break;

      case 0x01:
	_Retcode = W_WRITE;
	break;

      case 0x0A:
		_Retcode = OK;
	break;

      default:
		_Retcode = W_CODE;
	break;
    }

    if (_Retcode == OK)
    {
	  MCM_BCNTS = 128;
      MCM_BCNTR = 4;

      for (i = 0; i < 16; i++)
      {
	MCM_DATA = _Data[i];
	  }

      MCM_TOC = 16;//MEDIUM_TIMEOUT;
      while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
      MCM_TOC = 0;

	  if (_Status & (_BE | _PE))
      {
		_Retcode = W_CODE;
      }
      else
	  {
		MCM_TOC = 95;//LONG_TIMEOUT;
	while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
	MCM_TOC = 0;

	if (_Status & (_TE | _BE))
	{
	  if (_Status & _TE)
	  {
			_Retcode = W_NOTAG;
		  }
	  else
		  {
	    _Retcode = W_BITCNT;
	  }
		}
	else
	{
		  switch (MCM_DATA & 0x0F)
		  {
		    case 0x0A:
	      _Retcode = OK;
	      break;

		    case 0x04:
		    case 0x05:
	      _Retcode = W_WRITE;
	      break;

		    default:
	      _Retcode = W_CODE;
	      break;
	  }
	}
      }
    }
  }

  return (_Retcode);
}
/****************************************************************************
* Function:     mifs_increment                                              *
****************************************************************************/
BYTE mifs_increment(BYTE _Adr, BYTE idata *_Value)
{
  BYTE _Status;
  BYTE _Retcode;

  TOGGLE_WD();

  MCM_BCNTS = 16;
  MCM_BCNTR = 4;
  MCM_DATA  = 0xC1;
  MCM_DATA  = _Adr;

  MCM_TOC = 10;//TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
  MCM_TOC = 0;

  if (_Status & (_TE | _BE))
  {
    if (_Status & _TE)
    {
      _Retcode = W_NOTAG;
	}
    else
    {
      _Retcode = W_BITCNT;
    }
  }
  else
  {
    switch (MCM_DATA & 0x0B)
    {
      case 0x00:
		_Retcode = W_NOTAUTH;
	break;

	  case 0x0A:
		_Retcode = OK;
		break;

	  default:
	_Retcode = W_INCR;
		break;
    }
  }

  if (_Retcode == OK)
  {
    MCM_BCNTS = 32;
    MCM_BCNTR = 4;
    MCM_TOC   = 10;//TIMEOUT;

	MCM_DATA  = *(_Value++);
	MCM_DATA  = *(_Value++);
	MCM_DATA  = *(_Value++);
	MCM_DATA  = *(_Value);

    while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
    MCM_TOC = 0;

    if (!(_Status & _TE))
    {
      if ((MCM_DATA & 0x0F) == 0x04)
      {
	_Retcode = W_EMPTY;
      }
      else
      {
		_Retcode = W_INCR;
      }
    }
	else
	{
      _Retcode = OK;
	}
  }

  return (_Retcode);
}
/****************************************************************************
* Function:     mifs_decrement                                              *
****************************************************************************/
BYTE mifs_decrement(BYTE _Adr, BYTE idata *_Value)
{
  BYTE _Status;
  BYTE _Retcode;

  TOGGLE_WD();

  MCM_BCNTS = 16;
  MCM_BCNTR = 4;
  MCM_DATA  = 0xC0;
  MCM_DATA  = _Adr;

  MCM_TOC = 10;//TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
  MCM_TOC = 0;

  if (_Status & (_TE | _BE))
  {
    if (_Status & _TE)
	{
	  _Retcode = W_NOTAG;
    }
    else
    {
	  _Retcode = W_BITCNT;
    }
  }
  else
  {
    switch (MCM_DATA & 0x0B)
    {
      case 0x00:
	_Retcode = W_NOTAUTH;
		break;

      case 0x0A:
	_Retcode = OK;
	break;

      default:
	_Retcode = W_DECR;
	break;
    }
  }

  if (_Retcode == OK)
  {
    MCM_BCNTS = 32;
	MCM_BCNTR = 4;
    MCM_TOC   = 10;//TIMEOUT;

	MCM_DATA  = *(_Value++);
	MCM_DATA  = *(_Value++);
	MCM_DATA  = *(_Value++);
	MCM_DATA  = *(_Value);

	while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
    MCM_TOC = 0;

	if (!(_Status & _TE))
    {
      if ((MCM_DATA & 0x0F) == 0x04)
      {
	_Retcode = W_EMPTY;
      }
      else
      {
	_Retcode = W_DECR;
	  }
	}
	else
	{
	  _Retcode = OK;
	}
  }

  return (_Retcode);
}
/****************************************************************************
* Function:     mifs_decrement_transfer                                     *
****************************************************************************/
BYTE mifs_decrement_transfer(BYTE _Adr, BYTE idata *_Value)
{
  BYTE _Status;
  BYTE _Retcode;

  TOGGLE_WD();

  MCM_BCNTS = 16;
  MCM_BCNTR = 4;
  MCM_DATA  = 0xC0;
  MCM_DATA  = _Adr;

  MCM_TOC = 10;//TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
  MCM_TOC = 0;

  if (_Status & (_TE | _BE))
  {
    if (_Status & _TE)
	{
	  _Retcode = W_NOTAG;
    }
    else
    {
	  _Retcode = W_BITCNT;
    }
  }
  else
  {
    switch (MCM_DATA & 0x0B)
    {
      case 0x00:
	_Retcode = W_NOTAUTH;
		break;

      case 0x0A:
	_Retcode = OK;
	break;

      default:
	_Retcode = W_DECR;
	break;
    }
  }

  if (_Retcode == OK)
  {
    MCM_BCNTS = 32;
	MCM_BCNTR = 4;
    MCM_TOC   = 95;//LONG_TIMEOUT;

	MCM_DATA  = *(_Value++);
	MCM_DATA  = *(_Value++);
	MCM_DATA  = *(_Value++);
	MCM_DATA  = *(_Value);

	while (!((_Status = MCM_STACON) & _DV))TOGGLE_WD();
    MCM_TOC = 0;

	if (_Status & (_TE | _BE))
    {
	  if (_Status & _TE)
      {
	_Retcode = W_NOTAG;
	  }
      else
	  {
		_Retcode = W_BITCNT;
	  }
	}
	else
	{
	  switch (MCM_DATA & 0x0F)
	  {
		case 0x0A:
	  _Retcode = OK;
	  break;

		case 0x04:
	  _Retcode = W_EMPTY;
	  break;

⌨️ 快捷键说明

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