📄 iccard.c
字号:
ulong lResult;
lResult=ICTotalSize()-ICFreeSize();
return(lResult);
}
//获取总空间字节数
ulong ICTotalSize()
{
ulong lResult;
lResult=ICSysInfo.DataLength;
lResult*=ICSysInfo.PageBytes;
return(lResult);
}
//读目录信息
void ICReadDirInfo(uchar IndexOfDir,ICDirInfo *DirInfo)
{
uchar i;
uchar *p;
uint Page,ByteAddr;
ICDirIndextToPageByteAddr(IndexOfDir,&Page,&ByteAddr);
p=(uchar *)DirInfo;
*p++=ICReadPageByte(Page,ByteAddr);
for (i=1;i<sizeof(ICDirInfo);i++)
*p++=ICReadNextByte();
}
//写入目录信息
uchar ICWriteDirInfo(uchar IndexOfDir,ICDirInfo *DirInfo)
{
uchar b;
uint Page,ByteAddr;
uchar *p=(uchar*) DirInfo;
ICDirIndexToPageByteAddr(IndexOfDir,&Page,&ByteAddr);
b=ICWriteToPage(p,(uchar)sizeof(ICDirInfo),Page,ByteAddr);
return(b);
}
//读取IC卡系统信息
void ICReadSysInfo(_ICSysInfo *ICInfo,uint SysPage)
{
uchar i;
uchar *p=(uchar *)ICInfo;
*p++=ICReadPageByte(SysPage,0);
for (i=1;i<sizeof(ICSysInfo);i++)
*p++=ICReadNextByte();
}
//写入IC卡系统信息
uchar ICWriteSysInfo(_ICSysInfo *ICInfo,uint SysPage)
{
uchar b;
uchar *p=(uchar*)ICInfo;
b=ICWriteToPage(p,(uchar)sizeof(_ICSysInfo),SysPage,0);
return (b);
}
//读页标记
uint ICReadPageSign(uint Page)
{
uint wPage,wByteAddr,wResult,i;
i=ICSysInfo.PageBytes/sizeof(Page);
wPage=(Page/i)+ICSysInfo.FatStart;
wByteAddr=(Page&i)*sizeof(Page);
i=ICReadPageByte (wPage ,wByteAddr);
wResult=i;
wResult=wResult<<1;
i=ICReadNextByte();
wResult=i;
return(wResult);
}//写页标记
uchar ICWritePageSign(uint Page,uint Sign)
{
uchar b;
uint wPage ,wByteAddr,i;
i=ICSysInfo.PageBytes/sizeof(Page);
wPage=(Page/i)+ICSysInfo.FatStart;
wByteAddr=(Page&i)*sizeof(Page);
ICPageToBuf2(wPage);
ICWaitReady();
b=ICBuf2CmpPage(wPage);
return(b);
}
//寻找第一个空闲的页
uint ICFirstFreePage()
{
return (ICNextFreePage,0);
}
//寻找下一个空闲的页
uint ICNextFreePage(uint StartPage)
{
uint w;
do
{
w=ICReadPageSign(StartPage);
if (w==csFree)
break;
if(w==csEnd)
{
w=0x00;
break;
}
StartPage++;
}
while(1);
return(w);
}
void ICDirIndexToPageByteAddr(uchar DirIndex,uint *Page,uint *ByteAddr)
{
uchar i;
i=ICSysInfo.PageBytes/sizeof(ICDirInfo);
*Page=(DirIndex/i)+ICSysInfo.DirStart;
*ByteAddr=(DirIndex%i)*sizeof(ICDirInfo);
}uchar ICWriteToPage(uchar *p ,uchar Count ,uint Page ,uint ByteAddr)
{
uchar b;
uchar i;
ICPageToBuf2(Page);
ICWaitReady();
ICWriteBuf2Byte(ByteAddr,*p++);//写入字符串至缓存2
for(i=1;i<Count;i++)
ICWriteNextByte(*p++);
ICBuf2ToPage(Page);//缓存2写入页
ICWaitReady();
b=ICBuf2CmpPage(Page);//比较写入是否成功
return(b);
}
uchar ICReadPageByte(uint Page ,uint ByteAddr)
{
uchar c;
c=ICCommand(PageRead,Page,ByteAddr);
return(c);
}
void ICWriteBuf1Byte(uint ByteAddr,uchar b)
{
ICCommand(ICWriteBuf1Byte,0,ByteAddr);
ICWriteNextByte(b);
}
void ICWriteBuf2Byte(uint ByteAddr,uchar b)
{
ICCommand(ICWriteBuf2Byte,0,ByteAddr);
ICWriteNextByte(b);
}
uchar ICReadBuf1Byte(uint ByteAddr)
{
uchar c;
c=ICCommand(Buf1Read,0,ByteAddr);
return(c);
}uchar ICReadBu21Byte(uint ByteAddr)
{
uchar c;
c=ICCommand(Buf2Read,0,ByteAddr);
return(c);
}
uchar ICBuf1CmpPage(uint Page)
{
uchar b;
uchar c;
ICCommand(PageCmpBuf1,Page,0);
ICWaitReady();
c=ICStatus();
b=c&0x40;
return(b);
}
uchar ICBuf2CmpPage(uint Page)
{
uchar b;
uchar c;
ICCommand(PageCmpBuf2,Page,0);
ICWaitReady();
c=ICStatus();
b=c&0x40;
return(b);
}
void ICBuf1ToPage(uint Page)
{
ICCommand(Buf1ToPageWithErase,Page,0);
}
void ICBuf2ToPage(uint Page)
{
ICCommand(Buf2ToPageWithErase,Page,0);
}
void ICPageToBuf1(uint Page)
{
ICCommand(PageToBuf1,Page,0);
}
void ICPageToBuf2(uint Page)
{
ICCommand(PageToBuf2,Page,0);
}
//等待IC卡准备好
void ICWaitReady()
{
uchar c;
while (1)
{
c=ICStatus();
if (c&0x80)
break;
}
}//读IC卡状态
uchar ICStatus()
{
uchar ucResult;
ucResult=ICCommand(StatusRead,0,0);
return(ucResult);
}
//IC卡命令选择执行
unsigned char ICCommand(OpCode cmd,uint Page,uint ByteAddr)
{
unsigned char ucResult;
ICOutOpCode(cmd);
if (cmd!=StatusRead)
{
ICOutXBits(4);
ICOutPage(Page);
ICOutByteAddr(ByteAddr);
}
switch(cmd)
{
case PageRead:
{
ICOutXBits(32);
ucResult=ICReadNextByte();
break;
}
case Buf1Read:
case Buf2Read:
{
ICOutXBits(8);
ucResult=ICReadNextByte();
break;
}
case PageToBuf1:
case PageToBuf2:
{
ICOutXBits(8);
break;
}
case StatusRead:
ucResult=ICReadNextByte();
break;
default:break;
}
return ucResult;
}//选择写下一个字节
void ICWriteNextByte(uchar b)
{
uchar i,mid1,mid2;
mid1=b;
for (i=0;i<8;i++)
{
mid2=mid1&0x80;
if (mid2==0)
PORTA&=~BIT(PA2);
else
PORTA|=BIT(PA2);
mid1=mid1<<1;
PORTA&=~BIT(PA0);
PORTA|=BIT(PA0);
}
}
//连续读下一个字节
uchar ICReadNextByte()
{
uchar i,mid;
for (i=0;i<8;i++)
{
PORTA&=~BIT(PA0);
PORTA|=BIT(PA0);
mid=(PORTA&0x02)<<7;
mid>>1;
}
return(mid);
}
//发送命令字
void ICOutOpCode(OpCode cmd)
{
uchar b;
b=(uchar)cmd;
ICWriteNextByte(b);
}//送页面地址
void ICOutPage(uint Page)
{
uchar i,mid1,mid2;
mid1=(uchar)(Page>>8);
mid2=mid1&0x04;
for (i=0;i<3;i++)
{
if (mid2==0)
PORTA&=~BIT(PA2);
else
PORTA|=BIT(PA2);
mid1=mid1<<1;
PORTA&=~BIT(PA0);
PORTA|=BIT(PA0);
}
mid1=(uchar)(Page&0xff);
for (i=0;i<8;i++)
{
if (mid2==0)
PORTA&=~BIT(PA2);
else
PORTA|=BIT(PA2);
mid1=mid1<<1;
PORTA&=~BIT(PA0);
PORTA|=BIT(PA0);
}
}
//发送字节地址
void ICOutByteAddr(uint ByteAddr)
{
uchar i,mid1,mid2;
mid1=(uchar)(ByteAddr>>8);
mid2=mid1&0x01;
if (mid2==0)
PORTA&=~BIT(PA2);
else
PORTA|=BIT(PA2);
mid1=(uchar)(ByteAddr&0xff);
PORTA&=~BIT(PA0);
PORTA|=BIT(PA0);
for (i=0;i<8;i++)
{
mid2=mid1&0x80;
if (mid2==0)
PORTA&=~BIT(PA2);
else
PORTA|=BIT(PA2);
mid1=mid1<<1;
PORTA&=~BIT(PA0);
PORTA|=BIT(PA0);
}
}
//发送X个任意字节
void ICOutXBits(uchar x)
{
PORTA&=~BIT(PA2);
while (x>0)
{
PORTA&=~BIT(PA0);
PORTA|=BIT(PA0);
x--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -