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

📄 lll_msr.c

📁 非接触式M1卡读写器,读写源程序,可读S50/S70的卡
💻 C
📖 第 1 页 / 共 3 页
字号:
*                                                                           *
****************************************************************************/

uchar mifs_read(uchar _Adr, uchar idata *_Data)
{
  uchar i;
  uchar _Status;
  uchar _Retcode;
  uchar idata _TempData[16];
  uint delaytime;

  TOGGLE_WD();
  MCM_CS=0;
  MCM_BCNTS = 16;
  MCM_BCNTR = 128;
  MCM_DATA  = 0x30;
  MCM_DATA  = _Adr;

  MCM_TOC = TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV));
  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
	{
     INT1 = 0;       //blue  on
	 T1 =0;          //beep on
	 for(delaytime =0;delaytime<25000;delaytime++)_nop_();
	 T1 =1;
     INT1 =1;
	 _Retcode = OK;
	}
  }
   MCM_CS=1;
  return (_Retcode);
}


/****************************************************************************
*                                                                           *
* Function:     mifs_write                                                  *
*                                                                           *
* Input:        Adr, Data                                                   *
* Output:       -                                                           *
*                                                                           *
****************************************************************************/

uchar mifs_write(uchar _Adr, uchar idata *_Data)
{
  uchar i;
  uchar _Status;
  uchar _Retcode;

  TOGGLE_WD();
  MCM_CS=0;
  MCM_BCNTS  = 16;
  MCM_BCNTR  = 4;
  MCM_DATA   = 0xA0;
  MCM_DATA   = _Adr;

  MCM_TOC = TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV));
  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 = MEDIUM_TIMEOUT;
      while (!((_Status = MCM_STACON) & _DV));
      MCM_TOC = 0;

	  if (_Status & (_BE | _PE))
      {
		_Retcode = W_CODE;
      }
      else
	  {
		MCM_TOC = LONG_TIMEOUT;
        while (!((_Status = MCM_STACON) & _DV));
        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;
          }
        }
      }
    }
  }
  MCM_CS=1;
  return (_Retcode);
}


/****************************************************************************
*                                                                           *
* Function:     mifs_increment                                              *
*                                                                           *
* Input:        Adr, Value                                                  *
* Output:       -                                                           *
*                                                                           *
****************************************************************************/

uchar mifs_increment(uchar _Adr, uchar idata *_Value)
{
  uchar _Status;
  uchar _Retcode;

  TOGGLE_WD();
  MCM_CS=0;
  MCM_BCNTS = 16;
  MCM_BCNTR = 4;
  MCM_DATA  = 0xC1;
  MCM_DATA  = _Adr;

  MCM_TOC = TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV));
  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   = TIMEOUT;

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

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

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


/****************************************************************************
*                                                                           *
* Function:     mifs_decrement                                              *
*                                                                           *
* Input:        Adr, Value                                                  *
* Output:       -                                                           *
*                                                                           *
****************************************************************************/

uchar mifs_decrement(uchar _Adr, uchar idata *_Value)
{
  uchar _Status;
  uchar _Retcode;

  TOGGLE_WD();
  MCM_CS=0;
  MCM_BCNTS = 16;
  MCM_BCNTR = 4;
  MCM_DATA  = 0xC0;
  MCM_DATA  = _Adr;

  MCM_TOC = TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV));
  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   = TIMEOUT;

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

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

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


/****************************************************************************
*                                                                           *
* Function:     mifs_decrement_transfer                                     *
*                                                                           *
* Input:        Adr, Value                                                  *
* Output:       -                                                           *
*                                                                           *
****************************************************************************/

uchar mifs_decrement_transfer(uchar _Adr, uchar idata *_Value)
{
  uchar _Status;
  uchar _Retcode;

  TOGGLE_WD();
   MCM_CS=0;
  MCM_BCNTS = 16;
  MCM_BCNTR = 4;
  MCM_DATA  = 0xC0;
  MCM_DATA  = _Adr;

  MCM_TOC = TIMEOUT;
  while (!((_Status = MCM_STACON) & _DV));
  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   = LONG_TIMEOUT;

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

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

	if (_Status & (_TE | _BE))
    {

⌨️ 快捷键说明

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