#include <MT318public.h>
#include<Omron.h>
#include<WriteMagCard.h>
#pragma interrupt_handler Int3WriteTrack:5 //中断3
//===========下面在写单个磁道时用到============
uchar MaxNum;//第二磁道为高密度写卡时为104,低密度写卡时为37
uchar WriteState;//写卡状态寄存器 0:写前导零 1:写数据 2:写后续零
uint INT3Counter;//中断次数计数器
uchar ZeroCounter;//前导0,后续0的个数计数器
uchar TempBytePst;//写卡时的数据位置(TempBytePosition),一定要记得在写卡之前清0
uchar TempBitPst;//写卡时的数据位位置
uchar WrBitSta;
uchar Lever;//写卡电平标志寄存器
//===========下面在写所有磁道时用到============
uchar WriteState2;//写卡状态寄存器
uchar INT3Counter2;//中断次数计数器
uchar ZeroCounter2;//前导0,后续0的个数计数器
uchar TempBytePst2;//写卡时的数据位置(TempBytePosition),一定要记得在写卡之前清0
uchar TempBitPst2;//写卡时的数据位位置
uchar WrBitSta2;
uchar Lever2;//写卡电平标志寄存器
//===========下面在写所有磁道时用到============
uchar WriteState3;//写卡状态寄存器
uchar INT3Counter3;//中断次数计数器
uchar ZeroCounter3;//前导0,后续0的个数计数器
uchar TempBytePst3;//写卡时的数据位置(TempBytePosition),一定要记得在写卡之前清0
uchar TempBitPst3;//写卡时的数据位位置
uchar WrBitSta3;
uchar Lever3;//写卡电平标志寄存器
//============下面是公用寄存器================
uchar OneLen;
uchar TwoLen;
uchar ThrLen;//接收到的数据长度计数器
uchar Track1WrFlag;
uchar Track2WrFlag;
uchar Track3WrFlag;//磁道写卡标志寄存器0:写卡;1:不写卡
uchar INT3OK;
uchar WrMagcardFlag;
//=============================================
//*函数名称 :uchar LRCCalclution(uchar *pDataBuff,uchar cLenth)
//*创建人 : Lii
//*创建时间 : 2007.05.31
//*功能描述 : LRC校验
//*入口参数 : uchar *pDataBuff,uchar cLenth
//*出口参数 :LRC
//=============================================
uchar LRCCalclution(uchar *pDataBuff,uchar cLenth)
{
uint i,counter,temp,LRC;
uchar jishuju[6]={0,0,0,0,0,0};
temp=0x01;
LRC=0x00;
for(i=0;i<6;i++)//外循环是位数
{
for(counter=0;counter<cLenth-1;counter++)//内循环是某位所有1之和
{
if(pDataBuff[counter] & (temp<<i))
jishuju[i]++;
}
}
for(i=0;i<6;i++)//计算LRC各位
{
LRC>>=1;
if(jishuju[i]%2) //
{
LRC=LRC | 0x20;
}
}
return LRC;
}
/*-----------------------------------------------------------------*
*函数名称 : void Track1RdataToWdata(*ReciveData)
*创建 人 :Lii
*创建时间 : 2008.10.31
*功能描述 : 把接收到的磁道1数据转换并转存,
另加上起始符,结束符,LRC校验等
*入口参数 : *ReciveData 是接收到的数据
*出口参数 : 无
*修改 :
*修改时间:
*----------------------------------------------------------------*/
void Track1RdataToWdata(uchar *ReciveData)
{
uchar n,i,bitNum,Parity1;
uchar temp;
//temp=0x01;
n=0;
for(i=0;i<76;i++)//计算数据长度并初步整理
{
R_APDU_Buffer[1+i] = ReciveData[i]-0x20;
if(ReciveData[i]==0x10) break;
n++;
}
R_APDU_Buffer[0]=0x05;//STC
R_APDU_Buffer[n+1]=0x1F;//ETC
temp=LRCCalclution(R_APDU_Buffer,n+3);
R_APDU_Buffer[n+2]=temp&0x3F;//LRC
OneLen=n+3;//只在每次复位时清此长度
for(i=0;i<n+3;i++)//
{
Parity1=0;
//temp=0x01;
for(bitNum=0;bitNum<7;bitNum++)//内循环是计算某字节中所有1的个数
{
if(R_APDU_Buffer[i] & (0x01<<bitNum))
Parity1++;
}
if((Parity1%2)==0)//如果字节中1的个数是偶数个,则最高位补1
{
R_APDU_Buffer[i]|=0x40;
}
}
}
/*-----------------------------------------------------------------*
*函数名称 : void Track23RdataToWdata(*ReciveData)
*创建 人 :Lii
*创建时间 : 2008.10.31
*功能描述 : 把接收到的磁道2,3数据转换并转存,
另加上起始符,结束符,LRC校验等
*入口参数 : *ReciveData 是接收到的数据
*出口参数 : 无
*修改 :
*修改时间:
*----------------------------------------------------------------*/
void Track23RdataToWdata(uchar *ReciveData)
{
uchar n,i,bitNum,Parity1;
//uint temp;
//temp=0x01;
n=0;
for(i=0;i<MaxNum;i++)//计算数据长度并初步整理
{
R_APDU_Buffer[1+i] = ReciveData[i]-0x30;
if(ReciveData[i]==0x10) break;
n++;
}
R_APDU_Buffer[0]=0x0B;//STC
R_APDU_Buffer[n+1]=0x0F;//ETC
R_APDU_Buffer[n+2]=((LRCCalclution(R_APDU_Buffer,n+3))&0x0F);//LRC
TwoLen=ThrLen=n+3;//只在每次复位时清此长度
for(i=0;i<n+3;i++)//
{
Parity1=0;
//temp=0x01;
for(bitNum=0;bitNum<7;bitNum++)//内循环是计算某字节中所有1的个数
{
if(R_APDU_Buffer[i] & (0x01<<bitNum))
Parity1++;
}
if((Parity1%2)==0)//如果字节中1的个数是偶数个,则最高位补1
{
R_APDU_Buffer[i]|=0x10;
}
}
}
/*-----------------------------------------------------------------*
*函数名称 : void TrackAllRdataToWdata(*ReciveData)
*创建 人 :Lii
*创建时间 : 2008.10.31
*功能描述 : 把接收到的磁道1,2,3数据转换并转存,
另加上起始符,结束符,LRC校验等
有两种存储方法:
1:数据放到固定分配的存储区
2:数据顺序排放,再记得每部分的起始地址和长度
第1种方法简单易行,就是浪费资源
第2种方法节省资源,做起来稍微复杂一些
这里先按第一种方法做,以后有时间再用第二种
方法试一下。
*入口参数 : *ReciveData 是接收到的数据
*出口参数 : 无
*修改 :
*修改时间:
*----------------------------------------------------------------*/
void TrackAllRdataToWdata(uchar *ReciveData)
{
uchar bitNum,Parity1;
uint OneZero,TwoZero,ThrZero,AllLen,TrackxNnm;
uint i;
TrackxNnm=AllLen=0;
for(i=0;i<330;i++)
{
if(ReciveData[i]==0x00) TrackxNnm++;
if(TrackxNnm==1) {OneZero=i; TrackxNnm+=1;}//这样做的是有目的的
if(TrackxNnm==3) {TwoZero=i; TrackxNnm+=1;}//为了不重复执行计数
if(TrackxNnm==5) {ThrZero=i; TrackxNnm+=1;}
if(ReciveData[i]==0x10) break;
AllLen++;//接收数据总长度
}
//================第一磁道===================
if(ReciveData[OneZero+1]==0x4E)//磁道一数据分析0--79
{
OneLen=0;
Track1WrFlag=1;
}
else
{
Track1WrFlag=0;
OneLen=TwoZero-OneZero-2;
for(i=0;i<OneLen;i++)
{
R_APDU_Buffer[i+1]= ReciveData[i+2]-0x20;
}
R_APDU_Buffer[0]=0x05;//STC
R_APDU_Buffer[OneZero+OneLen+1]=0x1F;//ETC
R_APDU_Buffer[OneZero+OneLen+2]=(LRCCalclution(R_APDU_Buffer,OneLen+2))&0x3F;
OneLen=OneLen+3;//只在每次复位时清此长度
for(i=0;i<OneLen;i++)//奇校验
{
Parity1=0;
for(bitNum=0;bitNum<7;bitNum++)//内循环是计算某字节中所有1的个数
{
if(R_APDU_Buffer[i] & (0x01<<bitNum))
Parity1++;
}
if((Parity1%2)==0)//如果字节中1的个数是偶数个,则最高位补1
{
R_APDU_Buffer[i]|=0x40;
}
}
}
//================第二磁道===================
if(ReciveData[TwoZero+1]==0x4E)//磁道二数据分析80--189
{
TwoLen=0;
Track2WrFlag=1;
}
else
{
Track2WrFlag=0;
TwoLen=ThrZero-TwoZero-2;
for(i=0;i<TwoLen;i++)
{
R_APDU_Buffer[i+81]=ReciveData[i+2+TwoZero]-0x30;
}
R_APDU_Buffer[80]=0x0B;//STC
R_APDU_Buffer[80+TwoLen+1]=0x0F;//ETC
R_APDU_Buffer[80+TwoLen+2]=((LRCCalclution(&R_APDU_Buffer[80],TwoLen+3))&0x0F);//LRC
TwoLen=TwoLen+3;//只在每次复位时清此长度
for(i=0;i<TwoLen;i++)//
{
Parity1=0;
for(bitNum=0;bitNum<6;bitNum++)//内循环是计算某字节中所有1的个数
{
if(R_APDU_Buffer[80+i] & (0x01<<bitNum))
Parity1++;
}
if((Parity1%2)==0)//如果字节中1的个数是偶数个,则最高位补1
{
R_APDU_Buffer[80+i]|=0x10;
}
}
}
//================第三磁道===================
if(ReciveData[ThrZero+1]==0x4E)//磁道三数据分析190--299
{
ThrLen=0;
Track3WrFlag=1;
}
else
{
Track3WrFlag=0;
ThrLen=AllLen-ThrZero-2;
for(i=0;i<ThrLen;i++)
{
R_APDU_Buffer[i+191]=ReciveData[i+2+ThrZero]-0x30;