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

📄 st3lib10.c

📁 无线音频电话(gprs)
💻 C
📖 第 1 页 / 共 5 页
字号:
	if (Level) PUB_HIGH_Card_Rest=(PUB_HIGH_Card_Rest|cc);
	else PUB_HIGH_Card_Rest=(PUB_HIGH_Card_Rest & (~cc));
	_SelAddrMain();
	XBYTE[DEF_HIGH_Card_Rest] = PUB_HIGH_Card_Rest;
    return;
}

void   _CardSetClock(uchar Level)
{
    uchar cc;

    if ( PUB_Card_ICNO > 1 )
		return;

	cc = 0x40;
	if (  PUB_Card_ICNO > 0 )
		cc = 0x80;
	if ( Level == 0 )
		PUB_HIGH_Card = PUB_HIGH_Card & (~cc);
	else
		PUB_HIGH_Card = PUB_HIGH_Card | cc;
	_SelAddrMain();
    XBYTE[DEF_HIGH_Card] = PUB_HIGH_Card;
	return;
}

void   _CardSetCLK4(uchar Level)
{
    _SelAddrMain();
    if ( Level )
		PUB_HIGH_Card = PUB_HIGH_Card | 0x20;
    else
		PUB_HIGH_Card = PUB_HIGH_Card & (~0x20);
    XBYTE[DEF_HIGH_Card] = PUB_HIGH_Card;
    return;
}

void   _CardPutBit(uchar IOBit)
{
	INT0 = IOBit;
	return;
}

void   _CardPutByte(uchar IOData)
{
	ET0 = 0;
	while ( PUB_Card_TI == 0x00) { ET0 = 1;PCON = PCON | 0x01;ET0 = 0;}
    ET0 = 1;
    PUB_Card_SendBuff = IOData;
    PUB_Card_SendBuff = (PUB_Card_SendBuff << 1) | 0x0fc00;
    ACC = IOData;
    if ( P == 0 ) 
		PUB_Card_SendBuff = PUB_Card_SendBuff | 0x200;
    PUB_T0Type = DEF_T0_ICSEND;
    if ( PUB_Card_ICReverse[PUB_Card_ICNO] == 0 ) 
		PUB_Card_SendBuff = PUB_Card_SendBuff ^ 0x200;
	PUB_Card_Counter = 0; 
	PUB_Card_TI = 0x00;
	TL0 = TH0;
	TR0 = 1;
	ET0 = 1;
    return;
}

uchar  _CardReadBit(void)
{
    uchar cc;

	cc = INT0;
	return cc;
}

uchar  _CardReadByte(void)
{
    uchar cc;

	ET0 = 0;
	while ( PUB_Card_RI == 0x00 ) { ET0 = 1;PCON = PCON | 0x01;ET0 = 0;}
	ET0 = 1;
	cc = PUB_Card_RecData;
	PUB_Card_RI = 0x00; 
    return cc;
}

uchar  _CardTestDoor(void)
{
    uchar  cc; 
	
	_SelAddrMain();
	cc = XBYTE[DEF_HIGH_Key];
	if( PUB_Card_ICNO == 0)
	    if(cc&0x10)  return 0;
	    else   return 1;
	else
	    if(cc&0x20)  return 0;
	    else   return 1;
}                           

void   _CardSetRecLimit(uint RecLimit)
{
    PUB_Card_RecLimit = RecLimit;
    return;
}

uchar  _CardReadIOLimit(uchar *recdata, uchar Reverse)
{
    uint i;
    uchar j;

    i = 0;
    while ( (i < PUB_Card_RecLimit) && ( PUB_Card_RI == 0 ) )
    {
        for (j=0;j<160;j++) 
			if ( PUB_Card_RI == 1) 
				break;
        i++;
    }
    if ( PUB_Card_RI == 1)
    {
        if ( Reverse == 0 )  *recdata =_CardReadByte();
        else *recdata = _ReverseData(_CardReadByte());
        return 1;
    }
    else return 0;
}

uchar  _CardSmartReset(uchar *ResetData)
{
    uchar ResetLen;
    uchar i;
    uchar loop;

	TR2=0;//lxj
    _CardSetRecLimit(1000);
    _CardSetReset(0);
    _CardSetReset(1);
    _EnableICRec();

    ResetLen = 0;
    loop = 1;
    while(loop)
    {
        loop = _CardReadIOLimit(ResetData+ResetLen,0);
        ResetLen = ResetLen + loop;
        _CardSetRecLimit(100);
    }
    _CardSetRecLimit(1000);
    if ( ResetData[0] == 0x3B )
        PUB_Card_ICReverse[PUB_Card_ICNO] = 0;
    else if ( ResetData[0] == 0x03)
    {
            PUB_Card_ICReverse[PUB_Card_ICNO] = 1;
            for (i=0;i<ResetLen;i++)  
				*(ResetData+i) = _ReverseData(*(ResetData+i));
    }
	else
	{TR2=1;return 0;}//lxj
    if ( ResetLen > 1 )
    {
        if ( ( *(ResetData+1) & 0xf0 ) != 0xe0 ) 
			PUB_Card_ICT01[PUB_Card_ICNO] = 0;
        else 
			PUB_Card_ICT01[PUB_Card_ICNO] = 1;
        PUB_Card_ICPCB[PUB_Card_ICNO] = 0x00;
    }
    {TR2=1;return ResetLen;}//lxj
}

uchar  _CardSmartOpen(void)
{
	uchar ResetData[35];
	uchar ResetLen;

    _CardSetPower(1);
    _CardPutBit(1);
    _CardSetCLK4(1);
    _CardSetClock(1);
    _Delay(1);
    PUB_Card_Asy[PUB_Card_ICNO] = 1;
    ResetLen = _CardSmartReset(ResetData);
    if ( ResetLen != 0 ) 
		return 0;
    else
    {
        _CardSmartClose();
        return 1;
    }
}

void   _CardSmartClose(void)
{
    uchar cc,i;
    
    PUB_Card_Asy[PUB_Card_ICNO] = 0;
    cc = 0;
    for (i=0;i<6;i++) 
		cc = cc + PUB_Card_Asy[i];
    if ( cc == 0 ) 
		_CardSetCLK4(0);
    _CardSetClock(0);
    _CardSetReset(0);
    _CardSetPower(0);
    return;
}

uchar  _CardSmartApdu(APDU_COMM *apducom,APDU_RESP *apduresp)
{
    uchar i;
    uchar FlagReverse;
    uchar Lc,Le;
    uchar HeaderBuff[8];
    uchar CmdIns,CmdIns_;
    uchar cc,cc2;
    uchar RDataPt;
    uchar ioff;

	TR2=0;//lxj
    FlagReverse = PUB_Card_ICReverse[PUB_Card_ICNO];
    Lc = (*apducom).LengthIn;
    Le = (*apducom).LengthExpected;
    ioff=0;
    if ( PUB_Card_ICT01[PUB_Card_ICNO] == 0 )
    {
        memcpy(HeaderBuff,(*apducom).Command,4);
        if ( Lc > 0 ) HeaderBuff[4] = Lc;
        else  HeaderBuff[4] = Le;
        _CardSmartApduSend(HeaderBuff,5,FlagReverse);
        CmdIns = HeaderBuff[1];
        CmdIns_ = 0xff- CmdIns ;//+ 0x01;
        RDataPt = 0;
        for(;;)
        {
            if ( _CardReadIOLimit(&cc,FlagReverse) == 0)
			{TR2=1;return 1;}//lxj
            if(cc==0x60)
                continue;
            if(((cc>0x60) && (cc<=0x6f)) || ((cc>=0x90) && (cc<=0x9f)))
            {
                if ( _CardReadIOLimit(&cc2,FlagReverse) == 0 ) {TR2=1;return 2;}//lxj
                (*apduresp).Status = cc;
                (*apduresp).Status = ((*apduresp).Status<<8) + cc2;
                (*apduresp).LengthOut = RDataPt;
  			{TR2=1;return 0;}//lxj
          }
            else
            {
                if ( (cc != CmdIns ) && ( cc != CmdIns_) ) {TR2=1;return 3;}//lxj
                else
                {
                    if ( cc==CmdIns_ )
					{
                        if(Lc>0) {
                            _CardSmartApduSend((*apducom).DataIn+ioff,1,FlagReverse);
                            ioff++; Lc--;
                        }
                        else if(Le>0) {
                            if(_CardReadIOLimit((*apduresp).DataOut+RDataPt,FlagReverse)==0) {TR2=1;return 4;}//lxj
                            else { RDataPt++; Le--;}
                        }
                    }
                    else
                    {
                        if(Lc>0) 
						{
                            _CardSmartApduSend((*apducom).DataIn+ioff,Lc,FlagReverse);
                            Lc=0;
                        }
                        else if ( Le > 0 )
                        {
                            while ( Le>0 )
                            {
                                if ( _CardReadIOLimit((*apduresp).DataOut+RDataPt,FlagReverse) == 0 ) {TR2=1;return 5;}//lxj
                                else { RDataPt++; Le--;}
                            }
                        }
                    }
                }
            }
        }
    }
    else
    {
        HeaderBuff[0] = 0x00;
        HeaderBuff[1] = PUB_Card_ICPCB[PUB_Card_ICNO];
        cc = HeaderBuff[1];
        for (i=0;i<4;i++)
        {
            HeaderBuff[3+i] = (*apducom).Command[i];
            cc ^= (*apducom).Command[i];
        }
        cc2 = 4;
        if ( Lc != 0 )
        {
            cc2 = cc2+ 1 + Lc;
            cc ^= Lc;
            for(i=0;i<Lc;i++) cc ^= *((*apducom).DataIn+i);
        }
        if ( Le != 0 ) { cc2++; cc ^= Le; }
        cc ^= cc2;
        HeaderBuff[2] = cc2;
        _DisableICRec();
        _CardSmartApduSend(HeaderBuff,7,FlagReverse);
        if ( Lc != 0 )
        {
            _CardSmartApduSend(&Lc,1,FlagReverse);
            _CardSmartApduSend((*apducom).DataIn,Lc,FlagReverse);
        }
        if ( Le != 0 ) _CardSmartApduSend(&Le,1,FlagReverse);
        _CardSmartApduSend(&cc,1,FlagReverse);
        _EnableICRec();
        if ( _CardReadIOLimit(&cc2,FlagReverse) == 0 ) return 86;
        i = cc2;
        if ( _CardReadIOLimit(&cc2,FlagReverse) == 0 ) return 87;
        i ^= cc2;
        if ( _CardReadIOLimit(&cc2,FlagReverse) == 0 ) return 88;
        i ^= cc2;
        RDataPt = 0;
        while ( RDataPt < cc2-2 )
        {
            if ( _CardReadIOLimit(&cc,FlagReverse) == 0 ) return 89;
            i ^= cc;
            *((*apduresp).DataOut+RDataPt) = cc;
            RDataPt++;
        }
        if ( _CardReadIOLimit(&cc,FlagReverse) == 0 ) return 90;
        (*apduresp).Status = cc;
        i ^= cc;
        if ( _CardReadIOLimit(&cc,FlagReverse) == 0 ) return 91;
        i ^= cc;
        (*apduresp).Status = ((*apduresp).Status<<8) + cc;
        (*apduresp).LengthOut = cc2 - 2;
        if ( _CardReadIOLimit(&cc,FlagReverse) == 0 ) return 92;
        if ( i != cc ) return 13;
        PUB_Card_ICPCB[PUB_Card_ICNO] ^= 0x40;
    }
    return 0;
}

void  _CardSmartApduSend(uchar *SendBuff,uchar SendLen,uchar FlagReverse)
{
    uchar i;
    uint  j;    
                   
    _DisableICRec();
    for (i=0;i<SendLen;i++)
    {
        if (i>0) 
			for (j=0;j<PUB_Card_GuardTime;j++);
        if (FlagReverse) 
			_CardPutByte( _ReverseData(SendBuff[i]));
        else  
			_CardPutByte(SendBuff[i]);
        while ( PUB_Card_TI == 0);
    }
    _EnableICRec();
    return;
}

void   _DisableICRec(void)
{
    TR0 = 0x00;
    ET0 = 0x00;
    EX0 = 0x00;
}

void   _EnableICRec(void)
{
    PUB_Card_RI = 0x00;
    INT0  = 0x01;
    TR0 = 0x00;
    ET0 = 0x00;
    IE0 = 0x00;
    EX0 = 0x01;
}

//////////////////////////////////////////MAG Card opration functions
void  _Mag2Accept(uchar* track2Data)
{
    return;
}

void  _Mag3Accept(uchar* track3Data)
{
    return;
}

uchar  _MagAlterData(uchar *SouBuff, uchar DP, uchar CP, uchar *DesBuff, uint SouLen)
{
    return 1;
}

uchar  _MagTest(void)
{
    return 1;
}

void	_MagWrite(uchar* Mag2Buff,uchar Mag2Len,uchar* Mag3Buff, uchar Mag3Len)
{
	return;
}






void  _SysInit(void)
{
	uchar i, j;

P1_6=0;P1_5=1;
XBYTE[0x8030]=0x08;
PUB_PrintOutData=0x08;
AppRun();
	_InitLCD();
	_InitXMEM();
	PUB_HIGH_Card_Rest = 0x00;
	PUB_HIGH_Date = 0xFF;
	PUB_HIGH_Card = 0x00;
	PUB_PrintStep=0;
	PUB_Key = 0;
	PUB_Free = 0;
    PUB_T0Type = DEF_T0_NONE;
    PUB_Card_TI = 0x01;
    PUB_Card_RI = 0x00;
    PUB_Card_ICNO = 0;
    for (i=0;i<6;i++)
		PUB_Card_Asy[i] = 0;
    PUB_Card_GuardTime = 0x000A;
    PUB_Card_RecLimit  = 1000;
    PUB_Mag2Pt = NULL;
    PUB_Mag3Pt = NULL;
    EA = 0x00;
	_InitTimer();
    PX0 = 1;	PX1 = 0;	PT0 = 1;
	PT1 = 0;	PT2 = 0;	PS  = 0;
    _CardSetClock(0);
    _CardSetCLK4(0);
    _CardSetReset(0);
    _CardSetPower(0);
	DEF_232_POWER=1;
    EA = 0x01;
	return;
}

void main(void)
{
	_SysInit();
	MyApplication();
	EXT_AREA();
}

////////////////////////////////////system config (st3) functions
uchar	_GetSysScreenRow(void)
{
	return 4;
}

uchar	_GetSysScreenCol(void)
{
	return 16;
}

uchar	_GetSysKeycapCount(void)
{
	return 14;
}

uchar	_GetSysClockCount(void)
{
	return 1;
}

uchar	_GetSysTimerCount(void)
{
	return 1;
}

uchar	_GetSysPrinterRow(void)
{
	return 1;
}

uchar	_GetSysPrinterCol(void)
{
	return 24;
}

uchar	_GetSysModemCount(void)
{
	return 1;
}

uchar	_GetSysMagRdCount(void)
{
	return 0;
}

uchar	_GetSysMagWtCount(void)
{
	return 0;
}

uchar	_GetSysICCardCount(void)
{
	return 4;
}

uchar	_GetSysCommCount(void)
{
	return 1;
}

uchar	_GetSysRamBlock(void)
{
	return 15;
}

uchar	_GetSysFlashBlock(void)
{
	return 7;
}

uchar	_GetSysFirstPrgBlk(void)
{
	return 21;
}

uchar	_GetSysBackupBlock(void)
{
	return 8;
}

uchar	_GetSysFirstBckBlk(void)
{
	return 20;
}

///////////////////////////////////////////////////////Modem Function
uint	CrcData(uint CrcBuff, uchar dd)
{
	dd = ( CrcBuff >> 8 ) ^ dd;
	CrcBuff = ( (CrcBuff ^ *(CrcTabH+dd)) << 8 ) ^ *(CrcTabL+dd);
	return CrcBuff;
}

uchar _ModemReset(void)
{
	uchar cc;

	_SelAddrMain();
	PUB_HIGH_Card = (PUB_HIGH_Card & (~0x10));
	XBYTE[DEF_HIGH_Card] = PUB_HIGH_Card;
	_SelAddrModem();
	DEF_MODEM_TXD   = 1;
	DEF_MODEM_RXD   = 1;
	DEF_MODEM_TXC   = 1;
	DEF_MODEM_RXC   = 1;
	XBYTE[DEF_MODEM_DR];
	XBYTE[DEF_MODEM_ID] = 0x80;
	XBYTE[DEF_MODEM_CR0]= 0x05;
	XBYTE[DEF_MODEM_CR1]= 0x20;
	XBYTE[DEF_MODEM_TR] = 0x00;
	cc = XBYTE[DEF_MODEM_ID] & 0xF0;
	if(	cc != 0x80)
		return DEF_MODEM_RESET | DEF_MODEM_STATUS_NOMODEM;
	else
		return DEF_MODEM_RESET | DEF_MODEM_STATUS_OK;
}

void _ModemHangUp(void)
{
	_SelAddrMain();
	PUB_HIGH_Card = (PUB_HIGH_Card & (~0x10));
	XBYTE[DEF_HIGH_Card] = PUB_HIGH_Card;
	PUB_Hang_Timer = _GetTickCount();
	PUB_HIGH_Card_Rest = (PUB_HIGH_Card_Rest & (~0x40));
	XBYTE[DEF_HIGH_Card_Rest] = PUB_HIGH_Card_Rest;
	return;
}

uchar _ModemDl(uchar *pTelNo)
{

⌨️ 快捷键说明

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