/下面为读例子程序
main()
{
unsigned char code RecBuf[4]={0xdd,0xcc,0xbb,0xaa}; //接收缓冲区,初始化数据
unsigned char ret; //函数返回值
unsigned char test[4]={0x51,0x80,0x51,0x80}; //读卡不成功,显示数据
do
{
ret = ReadCm(0x32,4,RecBuf); //从0地址开始读4个字节
//读成功返加0,失败返回1
if(ret==0) //请在此设置断点查看是否读成功以及读到的数据
{
Display(RecBuf);
}
else
{
Display(test);
}
}while(1);
}
/***************************************************************
函数名称:ReadCm
功 能:从主存储器中读出数据块并存入ReadBuf中
输 入:unsigned char StarAddr --- 开始地址(0 - 255)
unsigned char ByteNum --- 要读出的字节数(1 - 256)
unsigned char *RecBuf --- 接收数据缓冲区
输 出: 0 --- 读成功
1 --- 表示无效卡或者卡损坏
****************************************************************/
unsigned char ReadCm(unsigned char StarAddr,unsigned char ByteNum,unsigned char *RecBuf)
{
unsigned char i = 0;
if (RstCard() == 1) /* 使卡复位*/
return 1; /* 如果复位失败返回1 */
SendCommand(0x30,StarAddr,0x00); /* 发送读主存命令 */
for(i = 0; i < ByteNum; i++)
{
*RecBuf = Readchar(); /* 从主存中读出ByteNum个字节并存入RecBuf中 */
RecBuf++;
}
return 0;
}
/***************************************************************
函数名称:Readchar
功 能:读一个字节
输 入: 无
输 出:所得的字节的值
****************************************************************/
unsigned char Readchar(void)
{
CLK = 0; Delay5Us(); mybit0 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
CLK = 0; Delay5Us(); mybit1 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
CLK = 0; Delay5Us(); mybit2 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
CLK = 0; Delay5Us(); mybit3 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
CLK = 0; Delay5Us(); mybit4 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
CLK = 0; Delay5Us(); mybit5 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
CLK = 0; Delay5Us(); mybit6 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
CLK = 0; Delay5Us(); mybit7 = IO; CLK = 1; Delay5Us(); //一个脉冲接收1 bit
return(ibase); //返回读得的一个字节
}
/***********************************************************
函数名称:RstCard
功 能:使IC卡SLE4442复位
输 入:无
输 出:0 --- 复位成功
1 --- 复位失败,卡为无效卡或卡已损坏
************************************************************/
unsigned char RstCard(void)
{
unsigned char i;
unsigned char ReadBuf[4];
IO = 1; //IO 引脚置高电平
RST = 0; //RST 引脚置低电平
CLK = 0; //CLK 引脚置低电平
Delay10Us(); //下面在一个RST脉冲期间产生一个CLK脉冲
RST = 1;
Delay5Us();
CLK = 1;
Delay5Us();
CLK = 0;
Delay5Us();
RST = 0;
//接收复位响应值
for(i = 0; i < 4; i++)
{
ReadBuf = Readchar();
}
CLK = 1;
Delay5Us();
CLK = 0;
IO = 1; //置CLK和IO为复位时序图复位完成时的状态
if ((ReadBuf[0] == IDENTIFY1) && (ReadBuf[1] == IDENTIFY2) &&
(ReadBuf[2] == IDENTIFY3) && (ReadBuf[3] == IDENTIFY4))
{
return 0; //复位值正确,返回复位成功
}
else
{
return 1; //复位值错误,返回复位失败
}
}
/************************************************************
函数名:SendCommand
功 能:根据不同的参数把命令字发给IC卡
参 数:unsigned char command --- 命令字;
unsigned char Address --- 地址;
unsigned char senddata --- 数据
返回值:无
*************************************************************/
void SendCommand(unsigned char command,unsigned char Address,unsigned char senddata)
{
IO = 1; /*产生开始状态*/
CLK = 0;
Delay5Us();
CLK = 1;
Delay10Us();
IO = 0;
Delay10Us();
CLK = 0;
/*发送命令*/
SendByte(command);
SendByte(Address);
SendByte(senddata);
/*产生停止状态*/
CLK = 0;
IO = 0;
Delay5Us();
CLK = 1;
Delay5Us();
IO = 1;
Delay5Us();
}
|