📄 st3lib10.c
字号:
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 + -