CPU卡程序設計實例(八)文件選擇

軟件 技術 老馬識途單片機 2017-04-19

1、文件主目錄宏定義

//卡主目錄3f 01,Esam主目錄3f 00

#define MainDir 0x3f

#define CardMainDir 0x01

#define EsamMainDir 0x00

2、響應字符宏定義

//響應狀態字SW1,SW2,

//命令正確執行的響應數據為SW1SW2=90 00或SW1SW2=61 00

#define RespondStateByte1 0x90

#define RespondStateByte2 0x00

#define RespondStateByte3 0x61

3、文件標識符宏定義

//文件標識符,短文件標識符+0x80

#define CommonApplyInfoFileID 0x95 //公共應用信息文件

#define CommonApplyInfoBackFileID 0x8f //公共應用信息反饋文件

#define OperateInfoFileID 0x88 //操作信息文件

#define OperateInfoBackFileID 0x89 //操作信息反饋文件

4、標量及標誌位定義

unsigned char TxAndRxBuff[124],cTxAndRxStatus;

//cTxAndRxStatus CPU卡接收數據正確標誌

#define ReceINSRightBIT BIT0

5、文件選擇函數

/*******************************************

函數名稱:SelectFile

函數功能:選擇文件目錄

輸入參數:無

輸出參數:無

描述:先根據變量選擇是對卡還是ESAM操作

選擇文件,CPU卡的主目錄3F 01,ESAM的主目錄3F 00

用於選擇卡或ESAM的主工作目錄,主目錄選擇成功後才能繼續對卡或ESAM操作

*******************************************/

void SelectFile(void)

{

unsigned char ctemp;

unsigned char ucTransBuf[2]={0};

if(CardORESAM&CardWorkFlag)

{

ucTransBuf[0]=MainDir;

ucTransBuf[1]=CardMainDir;

}

else

{

ucTransBuf[0]=MainDir;

ucTransBuf[1]=EsamMainDir;

}

TxAndRxBuff[0]=0x00;

TxAndRxBuff[1]=0xA4;

TxAndRxBuff[2]=0x00;

TxAndRxBuff[3]=0x00;

TxAndRxBuff[4]=0x02;

cCommandLen=0x05;

SendCommandHead_Pro();

if(ErrorRWBIT&CardError) goto SelectFileEnd;

Delay1XETU(4);

if(ReceINSRightBIT&cTxAndRxStatus)

{

TxAndRxBuff[0]=ucTransBuf[0];

TxAndRxBuff[1]=ucTransBuf[1];

cCommandLen=2;

SendCommand(cCommandLen);

}

if(ErrorRWBIT&CardError) goto SelectFileEnd;

if(CardORESAM&CardWorkFlag) //從卡上取數

{

for(ctemp=0;ctemp<2;ctemp++)

{

TxAndRxBuff[ctemp]=CardReceChar();

if(ErrorRWBIT&CardError) break;

}

if(ErrorRWBIT&CardError)

{

CardError=ErrorRSTBIT|CardError;

CardError=~ErrorRWBIT&CardError;

goto SelectFileEnd;

}

}

else //從ESAM取數

{

for(ctemp=0;ctemp<2;ctemp++)

{

TxAndRxBuff[ctemp]=EsamReceChar();

if(ErrorRWBIT&CardError) break;

}

if(ErrorRWBIT&CardError)

{

CardError=ErrorRSTBIT|CardError;

CardError=~ErrorRWBIT&CardError;

goto SelectFileEnd;

}

}

//

if((TxAndRxBuff[0]!=RespondStateByte3)&&(TxAndRxBuff[0]!=RespondStateByte1))

CardError=ErrorRWBIT|CardError;

SelectFileEnd:

delay_ms2M(5);

}

6、延時函數

/*****************************************軟件延時,主頻1M*******************/

#define CPU_F1 ((double)1000000)

#define delay_us1M(x) __delay_cycles((long)(CPU_F1*(double)x/1000000.0))

#define delay_ms1M(x) __delay_cycles((long)(CPU_F1*(double)x/1000.0))

/****************************************************************************/

/*****************************************軟件延時,主頻2M*******************/

#define CPU_F2 ((double)2000000)

#define delay_us2M(x) __delay_cycles((long)(CPU_F2*(double)x/1000000.0))

#define delay_ms2M(x) __delay_cycles((long)(CPU_F2*(double)x/1000.0))

/****************************************************************************/

相關推薦

推薦中...