-
- /下面为读例子程序
- 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();
- }
|