for (i=0;i《125;i++)
{}
}
}
/* 获取需要存入IC卡数据的函数*/
void getdata()
{
// 此函数简化如下:
uchar i;
for (i=0;i《8;i++)
data_in[i]=i+1;
}
/* 写单片机AT89S8252的SPDR寄存器,数据通过SPI口串行输出给IC卡芯片 */
void write_spi(uchar dat)
{
SPDR = dat;
while (!(SPSR & 0x80)) ; // 等待一次传输完成
}
/* 获取IC卡芯片状态函数 */
uchar IC_stat(void)
{
P1_1 = 0; // 使能IC卡芯片;/cs=0
write_spi(STAT_REG_READ); // 写入读IC卡芯片状态指令
write_spi(0x00); // 写无关比特
P1_1 = 1; // 禁用IC卡芯片;/cs=1
return SPDR; // 返回IC卡芯片状态字节
}
/* 写IC卡芯片函数:将数据写入buffer,如果buffer满,
则将buffer中数据写入主内存页 */
void write_to_IC(uchar dat)
{
uchar stat;
/* 检查IC卡芯片是否忙 */
stat = IC_stat();
while ((stat&0x80)==0x00);
/* 数据写入buffer */
P1_1 = 0; // 使能IC卡芯片;/cs=0
write_spi(BUFFER_1_WRITE); // buffer1写指令代码
write_spi(0x00); // 写入8位无关位
write_spi((uchar)(buf_start_addr》》8)); // 写入7位无关位加上9位buffer起始字节地址的第1位
write_spi((uchar)buf_start_addr); // 写入9位buffer起始字节地址的后8位
write_spi(dat); // 写入数据
P1_1 = 1; // 禁用IC卡芯片;结束buffer write指令
buf_start_addr++; // 下一buffer起始字节地址
/* 如果buffer写满,则将buffer中数据写入主内存页 */
if (buf_start_addr 》 263)
{
buf_start_addr = 0; // buffer起始字节地址重置0
if (page_addr 《 2047) // 如果主内存页不满
{
/* buffer数据写入主内存页 */
P1_1 = 0; // 使能IC卡芯片;/cs=0
write_spi(B1_TO_MM_PAGE_NO_ERA); // 写入无在线擦除的buffer1写主内存页指令代码
write_spi((uchar)(page_addr》》7)); // 写入4位保留位加上11位页地址的高4位
write_spi((uchar)(page_addr《《1)); // 写入11位页地址的低7位和1位无关位
write_spi(0x00); // 再写入8位无关位
P1_1 = 1; // 禁用IC卡芯片;结束无在线擦除的buffer写主内存页指令
page_addr++; // 下一页地址
}
}
}
/* 读IC卡芯片函数,如果一页读完,则读取下一页 */
uchar read_from_IC()
{
uchar stat;
uchar tmp;
/* 检查IC卡芯片是否忙 */
stat = IC_stat();
while ((stat&0x80)==0x00);
/* 从主内存页中读出数据 */
P1_1 = 0; // 使能IC卡芯片;/cs=0
write_spi(MM_PAGE_READ) ; // 写入主内存页读指令代码
tmp = (uchar)(page_addr》》7);