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

📄 iccard.c

📁 IC卡的操作(包括读写器以及IC卡的操作)
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -