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

📄 sle44064.c

📁 2106卡的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    {
      qry_ext1(Le+2,resp);       
      sw1=resp[Le]; sw2=resp[Le+1];
    }else{
f1:   delay_50us_NOP(1);
      for(i=0;i<Lc;i++) 
      {
        XmtDat=comm[5+i];
        RSXmt();
      }  
      Lc=0;
      goto A;
    }  
  }else
  {
    sw1=BPrc;  
    qry_ext1(1,&BPrc);
    sw2=BPrc;
    if(sw1==0x61)
    {
      comm[0]=0x00;
      comm[1]=0xC0;
      comm[2]=0x00;
      comm[3]=0x00;
      comm[4]=sw2;
      comm[5]=0;
      len=5;
      delay_50us_NOP(1);
      goto Begin;
    }  
  }
  *lenr=Le;
  
  return ( (((WORD)sw1)<<8)+sw2 );
}

void Check_VCC()
{
  LED(RED,ON);    
  ECPU=FALSE;
  if(ICVCC!=1)
  {
    ICVCC=1;
    delay_10ms(1);
  }  
}
void n_nop(WORD _num)
{
  WORD i;
  for(i=_num;i!=0;i--)
  {
    _nop_();
  }  
}
void clkpulse()
{
  ICCLK=1;
  n_nop(10);
  ICCLK=0;
}

void Reset_4406()
{
  ICRST=1;
  ICCLK=1;
  n_nop(50);
  ICCLK=0;
  ICRST=0;  
}

bit rd_bit()		//shangshengran modify IO
{
  bit RetBit;

  ICIO=1;
  n_nop(5);  
  RetBit=(ICIO==1);
  n_nop(5);
  return RetBit;    
}  

void rstpulse()
{
  ICRST=1;
  n_nop(10);
  ICRST=0;
}

BYTE RdByte(BYTE j)
{
  BYTE i, RcvDat;
  bit rdbit;

  for(i=0;i<8;i++)
  {
    if(j*8+i!=0)
    clkpulse();
    RcvDat=RcvDat<<1;
    rdbit=rd_bit();
    if(rdbit)
      RcvDat=RcvDat|0x01;
  }
  return RcvDat;
}  

void WtByte(BYTE PrgDat)
{
  BYTE i;

  for(i=8;i!=0;i--)
  {
    clkpulse();
    PrgDat=PrgDat<<1;
    if(!CY)
    {
      rstpulse();
      ICCLK=1;
      n_nop(10000);
      ICCLK=0;
    }   
  }   
}  

void Srd_4406(BYTE offset,BYTE len,BYTE *databuff)
{
  bit rdbit;
  BYTE j,RcvDat;

  Check_VCC();
  Reset_4406();

  for(j=0;j<offset+len;j++)
  {
    RcvDat=RdByte(j);
    if(j>=offset)
      databuff[j-offset]=RcvDat;
  }  
}

void Swr_4406(BYTE offset,BYTE len,BYTE *databuff)
{
  bit rdbit;
  BYTE j,PrgDat;

  Check_VCC();  
  Reset_4406();

  for(j=0;j<offset+len;j++)
  {
    TOGGLE_WD();
    if(j<offset)
    {
      RdByte(j);    
    }else{
      PrgDat=databuff[j-offset];
      WtByte(PrgDat);      
    }       //j>=offset
  }         //end j
}

bit Eswc_4406(BYTE offset)  
{
  BYTE i,j;
  bit rdbit;

  Check_VCC();  
  Reset_4406();

  for(j=0;j<offset;j++)
  {
    TOGGLE_WD();  
    if(j<offset-1)
    {
      RdByte(j);          
    }else{
      for(i=8;i!=0;i--)
      {
        clkpulse();
        rdbit=rd_bit();    
        if(rdbit)
        {
          rstpulse();
          ICCLK=1;
          n_nop(10000);
          ICCLK=0;
          rstpulse();
          ICCLK=1;
          n_nop(10000);
          ICCLK=0;
          return TRUE;
        }  
      }     //end i
    }       //j==offset-2
  }         //end j
  return FALSE;
}

bit Csc_4406(BYTE* databuff)  
{
  BYTE i,j,PrgDat;
  bit rdbit,CanCmp=FALSE;

  Check_VCC();  
  Reset_4406();

  for(j=0;j<9;j++)
    RdByte(j);          
  for(i=8;i!=0;i--)
  {
    clkpulse();
    rdbit=rd_bit();    
    if((!CanCmp)&&rdbit)
    {
      rstpulse();
      ICCLK=1;
      n_nop(10000);
      ICCLK=0;
      CanCmp=TRUE;
    }  
  }      
  if(CanCmp)
  {
    for(j=0;j<3;j++)  
    {
      TOGGLE_WD();
      PrgDat=databuff[j]; 
      for(i=8;i!=0;i--)
      {
        ICCLK=1;
        n_nop(5);
        PrgDat=PrgDat<<1;
        ICIO=CY;
        n_nop(5);
        ICCLK=0;
        n_nop(10);
      }  
    }  
  }
  return CanCmp;
}  
/****************************************************************************
* Function:     cmd_execution                                               *
****************************************************************************/
void cmd_execution(void)
{
  BYTE Status;
  BYTE len;
  BYTE cmd;
  WORD Ret;

  len = SerBuffer[LENGTH];
  SerBuffer[LENGTH] = 0;
  Status=OK;

  cmd = SerBuffer[COMMAND];
  switch (cmd)
  {
    case 0x5f:                  // Set Port
      beep = SerBuffer[PORTBYTE]&0x01;
      Status = OK;
      break;
      
    case 0x60:
     Status=Check_ICSW();
     if(Status!=OK)
       break;
     Reset(&SerBuffer[LENGTH], &SerBuffer[ADR]); //Insert Card or Warm Reset,CPU Card Reset
     Status=OK;
     break;

    case 0x61:                  //Remove Card
      Power_off();
      break;

    case 0x62:			//Get Interface Device Status
      SerBuffer[ADR]   =ICSW==CARDON? 0x00: 0x05;
      SerBuffer[LENGTH]=1;      
      break;  
    case 0x66:			//CPUC_Cmd
      SerBuffer[len+3]=0x00;
      Ret=CPUC_Cmd(len,&SerBuffer[ADR], &SerBuffer[LENGTH], &SerBuffer[ADR]);
      len=SerBuffer[LENGTH];      
      *((WORD *)(&SerBuffer[3+len]))=Ret;
      SerBuffer[LENGTH]+=2;
      break;
    case 0x67:
      Status=Check_ICSW();
      if(Status!=OK)
        break;
      len=SerBuffer[ADR+3];
      Srd_4406(SerBuffer[ADR+1],len,&SerBuffer[ADR]);  
      SerBuffer[LENGTH]=len;
      break;      
    case 0x68:
      Status=Check_ICSW();
      if(Status!=OK)
        break;
      len=SerBuffer[ADR+3];        
      Swr_4406(SerBuffer[ADR+1],len,&SerBuffer[ADR+4]);  
      break;
    case 0x69:
      Status=Check_ICSW();
      if(Status!=OK)
        break;
      Status=Eswc_4406(SerBuffer[ADR+1])? OK : 1;  
      break;  
    case 0x6a:
      Status=Check_ICSW();
      if(Status!=OK)
        break;
      Csc_4406(&SerBuffer[ADR]);  
      break;  
    default:
      Status = W_CMD_NY_IMPL;
      break;

  } // end switch (Command)

  SerBuffer[STATUS] = Status;
}
/****************************************************************************
* Function:     InitCommPort                                                *
****************************************************************************/
void InitCommPort(void)
{
  TxFlag=0;
  RxFlag=0;
  RxErr =0;
  RcvRdy=0;
  RPtr=0;

//For 11.0592 MHz OSC, use Timer 2 can generate 38.4K, 19.2 or 9600 bps.
  SCON  = 0x50; // Mode 1, 8-bit UART, enable receiption
  T2CON = 0x34; // baud rate generator for Phytec's 12.0/11.0592 MHz OSC
                // recv'd & X'mit have the same baud rate,use timer 2
  RCAP2H= 0xff; // 11.0592 MHz OSC, for 115.2K bps use FFH
  RCAP2L= 0xdc; // 11.0592 MHz OSC, for 115.2K bps use FDH;9.6K bps use DCH
  PCON  = 0x00; // SMOD = 0; (single baud rate)
  ES    = TRUE;

  ET0   = TRUE; // Enable timer 0 interrupt
  ET1   = TRUE; // Enable timer 0 interrupt
  EA    = TRUE;

  DataDleReceived=FALSE;
  CmdReceived = FALSE;
  CmdValid    = FALSE;
  Quit        = FALSE;
  LLfReady    = TRUE;
  SendReady   = TRUE;
  RepCnt      = 0;
  RecvState   = RECV_STX;
}
/****************************************************************************
* function:     init                                                        *
****************************************************************************/
void init(void)
{
  BYTE i;
  bit SW=ON;
  beep=ON;

  for(i=0;i<5;i++)
  {
    TOGGLE_WD();
    TOGGLE_BP();
    SW=~SW;
    LED(GREEN,~SW);
    LED(RED,SW);
    delay_10ms(20);
  }
  InitCommPort();
  Power_off();
}
/****************************************************************************
* Function:     Check_cmd                                                   *
****************************************************************************/
void Check_cmd()
{
  if (CmdValid) //TRUE
  {
    CmdValid = FALSE;
    TOGGLE_WD();
    cmd_execution();
    TI= 1;
  }
}
/****************************************************************************
* Function:     Check_ICSW                                                  *
****************************************************************************/
BYTE Check_ICSW()
{
/*  if(ICSW ==CARDOFF)
  {
    delay_10ms(1);
    if(ICSW ==CARDOFF)
    {
      Power_off();
      return W_NOCARD;
    }
  }*/
  return OK;
}
/****************************************************************************
* Function:     main                                                        *
****************************************************************************/
void main(void)
{
  init();
  while(1)
  {
    TOGGLE_WD();
    Check_cmd();
    Check_ICSW();
  }while(1);
}

⌨️ 快捷键说明

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