cpu卡和存储卡读写器程序/52User.h__.htm
文件头:
/*--------------------------------------------------------------------------
REG52.H
Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
/* BYTE Registers */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;
/* 8052 Extensions */
sfr T2CON = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2 = 0xCC;
sfr TH2 = 0xCD;
/* BIT Registers */
/* PSW */
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS
/*******以下为SAM卡接点定义*****/
sbit SAM_VCC = P2^7;
sbit SAM_RST = P2^6;
sbit SAM_CLK = P2^5;
sbit SAM_DATA = P2^3;
sbit SAM_DET = P3^2;
// define the MCU port for memcard
/******************************************************/
/********AT24C|SLE4406|SLE4428|SLE4442|SLE4404|AT88****/
sbit VCC = P1^7;
sbit RST = P1^6;
sbit SCL = P1^3;
sbit SDA = P1^1;
/*****************************************************/
/****************at88*********************************/
sbit FUS = P1^4;
sbit PGM = P1^0;
/****************************************************/
/*************SLE4404********************************/
sbit ICT = P1^4;
sbit ICP = P1^0;
/***************************************************/
/**************at45d041*****************************/
sbit SDAI = P1^2;
sbit SDAO = P1^0;
sbit at45dSCL =P1^2;
sbit ByRd11= P1^6;
sbit CS = P1^1;
/***************************************************/
文件头:
/*******************************************************/
/*本头文件主要定义了程序中使用的全局变量和数据结构
/*
/*
/*******************************************************/
#define uchar unsigned char
#define uint unsigned int
/*---------------------------------------------
****************常量定义***********************
---------------------------------------------*/
#define MAX_LE_SHORT 0x100 /*短情况下期望接收到的最大数据字节*/
#define MAX_LE_EXT 0x1000 /*扩展情况下期望接收到的最大数据字节*/
#define APDU_CASE_1 1
#define APDU_CASE_2_SHORT 2
#define APDU_CASE_3_SHORT 3
#define APDU_CASE_4_SHORT 4
#define APDU_CASE_2_EXT 5
#define APDU_CASE_3_EXT 6
#define APDU_CASE_4_EXT 7
#define ANSWER_RECEIVED 1
/* --------------在命令数组中的位置----------*/
#define CLA_IDX 0 /* 类别 */
#define INS_IDX 1 /* 指令 */
#define P1_IDX 2 /* 参量1*/
#define P2_IDX 3 /* 参量2*/
#define P3_IDX 4
全局结构*/
uchar pdata * idata RPCBuf=&Addr1;
uchar pdata * idata SPCBuf=&Addr2+2;
uchar pdata * idata ptCapdu=&Addr1+2; //指向RAPDU数组的指针
uchar pdata * idata SICCBuf=&Addr1+2;
uchar pdata * idata RICCBuf=&Addr2;
uchar pdata * idata aucI_SndBuf=&Addr1-1;
uchar data SIFDLen=0;
uchar data RIFDLen=0;
uchar data RICCLen=0;
uchar data SICCLen=0;
uchar data sbyte,rbyte=0x00,check;
uchar data RBitCount,SBitCount; //传送位数计数
uchar idata RCount; //232接收计数
uint data EtuCount,ErrorCount=0x00; //错误次数计数
uchar idata uSaveChar;
bit HaveCard; //有无卡;1:有卡,0:无卡;
bit HaveSAMCard;
bit IfSend; //发送接收识别;1:发送,0:接收
bit HaveCommand; //有上位机的命令
bit HaveReset; //是否已经复位;
bit HaveResetSAM;
bit bStartFlag;
bit isTimeOut = 0;
bit HavePowered=0; //存储卡是否已经上电;
bit isSAM=0; //1:SAM;0:CPU
/*******************************************************/
/*本头文件主要定义了程序中使用的错误返回值
/*
/*
/*******************************************************/
#define OK 1
#define NoCard 2
#define HaveTimeOut 3
#define SerialError 4
#define illegal 5
#define SendError 6
#define ReceiveError 7
#define ERROR 0
#define TRUE 1
#define FALSE 0
//bit HaveCard; //有无卡;1:有卡,0:无卡;
//bit HaveCommand; //是否有pc机发来的命令;1:有;0:无
//bit HaveReset; //卡是否已经复位 1:已经复位;0:没有复位
/****************** 本文件定义IC卡读写器物理层及数据链路层函数 **************************/
/****************** 编写时间:2001年9月12日 **************************/
//#pragma OE
#include "52User.h"
#include "datas.h"
#include "errcode.h"
#include "intrins.h"
#include "tr2.h"
#include "transt1.h"
#include "memcard1.h"
/****************子函数定义*********************/
void delay_50us()
{
uchar i;
for(i=0;i<5;i++);
}
void delay_104us()
{
TL0=0x68;
ET0=0;
TR0=1;
while(!TF0);
TR0=0;
TF0=0;
ET0=1;
}
void delay_104SAM()
{
TL1=0x68;
ET1=0;
TR1=1;
while(!TF1);
TR1=0;
TF1=0;
ET1=1;
}
void initT0()
{
TL0=0x60;
ET0=1;
TR0=1;
}
void initT1()
{
TL1=0x60;
ET1=1;
TR1=1;
}
/***** 定义ReceiveATR函数,该函数接收来自ICC的复位应答,并将其保存到以RICCBuf为首址的存储空间 *****/
/******************* 正确接收完则返回OK,无卡则返回NoCard,超时则返回HaveTimeOut *******************/
uchar ReceiveATR
endErrCode(reCode);
SPCBuf=&Addr2+2; //重置SPCBuf缓冲区指针
}
}
/*****************************************************************************************/
/***********主程序,初始化,判断有无卡************/
/*****************************************************************************************/
main()
{
Init(); //初始化
while(1) //开始接收PC机命令
{
if(HaveCommand) //如果有命令
{
ES=0; //关闭串口中断
HaveCommand=0; //是否有命令标志清零
if(RPCBuf[1]==0x01)
{
if(!isSAM)
{
isSAM=1;
iICC_SAVE = iICC_CNT;
iICC_IFD_SAVE = iIFD_CNT;
iICC_CNT = iSAM_SAVE;
iIFD_CNT = iSAM_IFD_SAVE;
}
SAMCommandProc(); //处理上位机命令
}
else
{
if(isSAM)
{
isSAM=0;
iSAM_SAVE = iICC_CNT;
iSAM_IFD_SAVE = iIFD_CNT;
iICC_CNT = iICC_SAVE;
iIFD_CNT = iICC_IFD_SAVE;
}
CPUCommandProc();
}
ES=1;
}
}
}
#include <stdio.h>
#include <string.h>
#include "memcard.h"
//#include "memcard1.h"
//#pragma ot(2)
void delay(uint iTime)
{
uint i;
for(i=0;i<iTime;i++);
}
//上电函数
void power_on(void)
{
VCC = 1;
}
//下电函数
void power_down(void)
{
VCC = 0;
}
/*******************************************************************************************/
/********以下为SLE4442卡的函数**************************************************************/
/*******************************************************************************************/
//复位应答
void answer_reset_4442(void)
{
uchar data i;
RST=HIGH;
SDA=HIGH;
delay(DELAY_SCL_4442);
SCL = 0;
delay(DELAY_SCL_4442);
SCL = 1;
delay(DELAY_SCL_4442);
RST=LOW;
delay(DE