📄 sim.c
字号:
k=0;
for(i=0;i<8;i++)
{
k ^= RxdBuf[i];
TxdBuf[5+i] = RxdBuf[i];
}
for(i=0;i<70;i++)
{
k ^= dat[i];
TxdBuf[13+i] = dat[i];
}
for(i=0;i<0x8D;i++)
{
k ^= tp[i];
TxdBuf[83+i] = tp[i];
}
TxdBuf[224]=k;
if(P33==0)
{
ErrorHint("未检测到用户卡!",136);
}
statecode=SimCmd(225,1); //向用户卡发送
if(statecode != 0x9000)
{
if(statecode==0x9303)AppBlockHint(1,1);
ErrorHint("用户卡数据汇总出错!",statecode);
}
if(mode==0)
{//正常报税处理申报备份数据,补发用户卡报税不处理
for(i=0;i<83;i++)tp[i]=TxdBuf[i+13];
//-----------------------------------------------------------------------------
//更新申报数据缓冲区
for(i=0;i<70;i++)dat[i]=0;
I2cWrite(DecAddUp,8,dat); //清零一个报税周期内的销售累计金额、退票累计金额
//更新申报数据起始日期
xp=&dat[0];
xp->dat = CalculateTime(time,1); //按输入截止日期统计报税数据
I2cWrite(Declare,70,dat);
//------------------------------------------------------------------------------
//将申报备份数据存放在24C64中
I2cRead(DeclareNum,1,dat);
if(dat[0]>60)dat[0]=0;
adr=DeclareBak+dat[0]*83;
I2cWrite(adr,83,tp);
dat[0]+=1;
I2cWrite(DeclareNum,1,dat);
//------------------------------------------------------------------------------
//将报税当天销售累计金额、退票累计金额写入报税周期内的销售累计金额、退票累计金额
I2cRead(IntradaySortSum,48,dat);
wc=0;
time=0;
for(i=0;i<6;i++)
{
xp=&dat[i*4];
fp=&dat[i*4+24];
wc+=xp->dat; //正常发票金额
time+=fp->dat; //退票金额
}
xp=&dat[0];
xp->dat=wc;
xp=&dat[4];
xp->dat=time;
I2cWrite(DecAddUp,8,dat);
//----------------------------------------------------------------------------------
i=1;
I2cWrite(DeclareFlg,1,&i); //更新报税标志
}
}
uchar FindRecordNumber(uchar mode)
{//确定应该从第几个记录文件开始写
//核查级别为“01”时覆盖稽查卡原有数据;为“0xFF”时从原有数据后添加
uchar x;
gyt4 *xp;
uint k;
if(mode==1)return 1;
RxdBuf[0]=0xEF;
RxdBuf[1]=0x03;
SelectFile(0x00,0x00,0x02,RxdBuf,2);
x=1;
while(1)
{
k=ReadRecord(0,x,0x04,0xE9,2);
if(k==0x6A83 || x==255)
{
LcdDisplay(16,0,"管理卡已经写满!",3);
Hint(32,0,"请更换管理卡",0);
return 0;
}
xp=&RxdBuf[0]; //判断时间是否为空
// if(xp->dat==0xFFFFFFFF)break;
if(xp->dat==0)break;
else x++;
}
return x;
}
uchar SelectTomeFile()
{
uchar i,j,x,dat[10];
if(UserIdentify(1)!=1)
return 0;
I2cRead(MachineNo,8,dat);
RxdBuf[0]=0xEF;
RxdBuf[1]=0x06;
SelectFile(0x00,0x00,0x02,RxdBuf,1);
j=1;x=0;
while(1)
{
i=ReadRecord(0,j,0x04,18,1); //参数必须是0x04
if(i!=1)return 0;
for(i=0;i<8;i++)
if(dat[i]!=RxdBuf[i])x=1;
if(x==0)break;
else {x=0;j++;}
}
//获得发票使用信息文件标识符
SelectFile(0x00,0x00,0x02,&RxdBuf[16],1);
return 1;
}
uchar InsteadCardHint(uchar x,uchar mode)
{//提示本卡已写满,需要换卡,继续操作
uchar i,k;
LcdDisplay(16,0,"卡已写满,请换卡!",3);
// Hint(16,0,"卡已写满,请换卡!",3);
while(1)
{
SimDetect(x & 0x0F);
SimDetect(x); //等待并检测SIM卡插入
if(x==0x12)
{
k=ManagementIdentify();
if(k==mode)
{
ReadBinary(0x81,0,10,2);
i=FindRecordNumber(RxdBuf[9]);
if(i!=0)break;
}
else
{
if(k!=0xFF)Hint(16,0,"核查类别不一致,请换卡!",3);
}
}
else
{//检测用户卡是否合法
//200卷单卷发票使用数据存储空间
if(SelectTomeFile()!=0)break;
}
}
LcdDisplay(16,0,"开始写入数据......",3);
return i;
}
uchar GetTime(uchar *dat,uchar len,uchar *begintime,uchar *endtime)
{
uchar str[16],temp[2];
gyt4 *xp,*fp;
LcdDisplay(0,0,dat,3);
while(1)
{
LcdDisplay(16,0,"起始日期:",1);
memset(str,0,sizeof(str));
temp[0]=0;
if(GetBcd(16,72,str,len,temp)==K_TC)return 0;
if(len==6)str[3]=0x01;
if(Verdict(str)==1)
{//检查日期合法性
xp=str;
fp=begintime;
fp->dat=xp->dat;
break;
}
else LcdDisplay(32,0,"输入时间格式错误!",1);
}
while(1)
{
LcdDisplay(32,0,"终止日期:",1);
temp[0]=0;
memset(str,0,sizeof(str));
if(GetBcd(32,72,str,len,temp)==K_TC)return 0;
if(len==6)str[3]=0x27;
if(Verdict(str)==1)
{//检查日期合法性
if(len==6)str[3]=0x32; //强制将日设置为32号,方便比较
xp=str;
fp=endtime;
fp->dat=xp->dat;
break;
}
else LcdDisplay(48,0,"输入时间格式错误!",1);
}
return 1;
}
uchar CheckDeclareDat(uchar *dat,uchar mode)
{//申报数据核查
uchar i,j,m,tp[1],str[240];
uint adr,k;
gyt4 tm1,tm2;
gyt4 *xp,*fp;
//注意:时间格式和其它不一样,只有"年 月"
I2cRead(DeclareNum,1,tp);
if(tp[0]==0)
{
LcdDisplay(16,0,"目前没有申报数据!",3);
return 0;
}
i=GetTime("申报数据核查:(年月)",6,tm1.str,tm2.str);
if(i==0)return 0;
LcdDisplay(0,0,"开始查找对应数据......",3);
adr=DeclareBak;
m=22;str[21]=0;
I2cRead(adr,83,&str[m]);
xp=&str[m];
if(xp->dat>tm2.dat)
{
LcdDisplay(16,0,"没有对应时间段的数据!",1);
return 0;
}
for(j=0;j<21;j++)str[j]=dat[j];
for(j=188;j<233;j++)str[j]=0;
j=FindRecordNumber(mode);
if(j==0)return 0;
if(PwrFlg!=0)
PowerOffHint(" ","申报数据核查未完成!",0xAA);
for(i=0;i<tp[0];i++)
{
I2cRead(adr,83,&str[m]);
xp=&str[m];fp=&str[m+4];
if(tm1.dat<=xp->dat && fp->dat<=tm2.dat)
{
str[21]+=1;
if(str[21]>=2)
{
UpdateRecord(j,233,str,2); //向管理卡发送
j++;k=1;
if(j<255)
{
k=ReadRecord(0,j,0x04,0xE9,2);
}
if(j==255 || k==0x6A83)
{
j=InsteadCardHint(0x12,2);
}
m=22;
str[21]=0;
}
else m+=83;
}
adr+=83;
}
if(str[21]!=0)
{
for(i=105;i<233;i++)str[i]=0;
UpdateRecord(j,233,str,1); //向管理卡发送
}
if(PwrFlg!=0)
PowerOffHint(" ","申报数据核查已完成!",0x55);
return 1;
}
uchar CheckDailyDat(uchar *dat,uchar mode)
{//起始日期手工输入:年、月、日
uchar j,m,str[240];
uint i,k;
ulong adr;
gyt2 fp;
gyt4 *xp,tm1,tm2;
I2cRead(DailyDatNum,2,fp.str);
if(fp.dat==0)
{
LcdDisplay(16,0,"目前没有日交易数据!",3);
return 0;
}
i=GetTime("日交易数据核查:(年月日)",8,tm1.str,tm2.str);
if(i==0)return 0;
LcdDisplay(0,0,"开始查找对应数据......",3);
for(j=0;j<21;j++)str[j]=dat[j];
for(j=213;j<233;j++)str[j]=0;
m=21;
adr=DailyTradeDat;
SerialFlashRead(FlashDat,adr,192,&str[m]);
xp=&str[m];
if(xp->dat>tm2.dat)
{
LcdDisplay(16,0,"没有对应时间段的数据!",3);
return 0;
}
j=FindRecordNumber(mode);
if(j==0)return 0;
if(PwrFlg!=0)
PowerOffHint(" ","日交易数据核查未完成!",0xAA);
for(i=0;i<fp.dat;i++)
{
SerialFlashRead(FlashDat,adr,192,&str[m]);
xp=&str[m];
if(tm1.dat<=xp->dat && xp->dat<=tm2.dat)
{
UpdateRecord(j,233,str,2); //向管理卡发送
j++;k=1;
if(j<255)
{
k=ReadRecord(0,j,0x04,0xE9,2);
}
if(j==255 || k==0x6A83)
{
j=InsteadCardHint(0x12,1);
}
}
adr+=192;
}
if(PwrFlg!=0)
PowerOffHint(" ","日交易数据核查已完成!",0x55);
return 1;
}
uchar CheckInvoiceDat(uchar *dat,uchar mode)
{//发票明细核查:起始日期手工输入:年、月、日;发票号码也手工输入
uchar i,j,k,m,w,str[240],temp[2];
uint v,u;
ulong adr,x;
gyt4 *xp,tm1,tm2;
gyt2 fp;
I2cRead(InvoPrintNum,2,fp.str);
if(fp.dat==0)
{
LcdDisplay(16,0,"目前没有发票明细数据!",3);
return 0;
}
LcdDisplay(0,0,"发票明细核查:(年月日)",3);
while(1)
{
LcdDisplay(16,0,"1.按起始日期核查",0);
LcdDisplay(32,0,"2.按发票号码核查",0);
k=KeyScan();
if(k==K_TC)return 0;
if(k==K_1)
{
j=GetTime("按起始日期核查:(年月日)",8,tm1.str,tm2.str);
if(j==0)return 0;
LcdDisplay(0,0,"开始查找对应数据......",3);
for(j=0;j<21;j++)str[j]=dat[j];
for(k=211;k<233;k++)str[k]=0;
adr=InvoPrintDat;
m=22;
SerialFlashRead(FlashInvo,adr,27,&str[m]);
xp=&str[m];
if(xp->dat>tm2.dat)
{
LcdDisplay(16,0,"没有对应时间段的数据!",3);
return 0;
}
w=FindRecordNumber(mode);
if(w==0)return 0;
if(PwrFlg!=0)
PowerOffHint(" ","发票明细核查未完成!",0xAA);
for(v=0,j=0;v<fp.dat;v++)
{
SerialFlashRead(FlashInvo,adr,27,&str[m]);
xp=&str[m];
if(tm1.dat<=xp->dat && xp->dat<=tm2.dat)
{
xp=&str[m+4]; //交换发票号和开票类型的存储位置
x=xp->dat;
i=str[m+8];
xp=&str[m+5];
xp->dat=x;
str[m+4]=i;
j++;
if(j>=7)
{
str[21]=7;
UpdateRecord(w,233,str,2);
w++;u=1;
if(w<255)
{
u=ReadRecord(0,w,0x04,0xE9,2);
}
if(w==255 || u==0x6A83)
{
w=InsteadCardHint(0x12,0);
}
j=0;m=22;
}
else m+=27;
}
adr+=27;
}
if(j!=0)
{
str[21]=j;
for(k=m;k<233;k++)str[k]=0;
UpdateRecord(w,233,str,2); //向管理卡发送
}
if(PwrFlg!=0)
PowerOffHint(" ","发票明细核查已完成!",0x55);
return 1;
}
if(k==K_2)
{
for(j=0;j<21;j++)str[j]=dat[j];
for(k=48;k<233;k++)str[k]=0;
adr=InvoPrintDat;
str[21]=1;
LcdDisplay(16,0,"请输入发票号:",1);
LcdDisplay(32,0," ",1);
while(1)
{
temp[0]=0;
tm1.dat=GetInt(32,32,0,14,0,temp);
if(temp[0] == K_TC)return 0;
if(tm1.dat!=0 && temp[0] == K_HJ)break;
}
LcdDisplay(0,0,"开始查找对应数据......",3);
j=FindRecordNumber(mode);
if(j==0)return 0;
if(PwrFlg!=0)
PowerOffHint(" ","发票明细核查未完成!",0xAA);
for(v=0;v<fp.dat;v++)
{
SerialFlashRead(FlashInvo,adr,27,&str[22]);
xp=&str[26];
if(tm1.dat==xp->dat)
{
xp=&str[m+4]; //交换发票号和开票类型的存储位置
x=xp->dat;
i=str[m+8];
xp=&str[m+5];
xp->dat=x;
str[m+4]=i;
UpdateRecord(j,233,str,2);
if(PwrFlg!=0)
PowerOffHint(" ","发票明细核查已完成!",0x55);
return 1;
}
adr+=27;
}
LcdDisplay(16,0,"没有对应的数据!",3);
return 0;
}
Beep(500);
}
}
void InvoTomeWrite()
{//单卷发票使用汇总信息写入用户卡
uchar i,dat[40];
gyt2 xp;
uint m;
ulong adr;
if(SimDetect(0x11)==0)
{
SimDetect(0x01);
return;
}
if(SelectTomeFile()==0)return;
//----------------------------------------------------------------------------------
dat[0]=0x12;
dat[1]=0x34;
dat[2]=0x56;
dat[3]=0x78;
VerifyPin(0,4,dat,2); //效验用户卡PIN,PIN需要手工输入吗?
//-----------------------------------------------------------------------------------
i=1;
//-------------------------------------------------------------------------------------------
//每台机器对应一个发票使用信息文件,所以写入单卷发票时覆盖原有数据
//应该将本次报税周期内使用的发票数据写入,最好在自定义命令中加上时间段
// while(1)
// {//确定应该从第几个记录文件开始写
// j=ReadRecord(0,i,0x04,0x25,2);
// if(j==0x6A83 || i==200)
// {
// LcdDisplay(16,0,"用户卡已经写满!",3);
// Hint(32,0,"请更换用户卡",0);
// return;
// }
// tp=&RxdBuf[14]; //判断发票是否为0
// if(tp->dat!=0 && tp->dat!=0xFFFFFFFF)i++;
// else break;
// }
//-------------------------------------------------------------------------------------------
I2cRead(InvoStatNum,2,xp.str);
adr=InvoStatBegin;
if(PwrFlg!=0)
PowerOffHint(" ","单卷发票汇总信息未写入!",0xAA);
for(m=0;m<xp.dat;m++)
{
SerialFlashRead(FlashDat,adr,37,dat);
UpdateRecord(i,37,dat,1);
if(i>=200)
{//提示本卡已写满,需要换卡,继续操作
InsteadCardHint(0x11,0);
i=1;
}
adr+=37;
i++;
}
if(PwrFlg!=0)
PowerOffHint(" ","单卷发票汇总信息已写入!",0x55);
LcdDisplay(32,0,"操作成功!",0);
SimDetect(0x01);
}
uchar InvoiceCheck(uchar x)
{
uchar i,dat[11],str[40];
gyt4 *xp,*fp;
gyt2 tp;
ulong adr,gs;
I2cRead(InvoiceNo,8,dat);
xp=&dat[0];
fp=&dat[4];
if(xp->dat==0)return 2;
if(xp->dat<=fp->dat)return 1;
else
{//本卷发票已经用完
if(x==1)
{//单卷发票使用汇总数据处理-----------------------------------------
ReadBinary(0x85,0,19,0);
for(i=0;i<18;i++)str[i]=RxdBuf[i+1]; //第一个字节是发票有无标志
I2cRead(TomeNum1,15,&str[18]);
xp=&InvoDate[0];
fp=&str[33];
fp->dat=xp->dat; //开票截止时间
I2cRead(InvoStatNum,2,tp.str);
gs = tp.dat;
if(gs>1771)
{
adr=InvoStatDat;
tp.dat=0;
#if FlashDatM25P80
SerialFlashSectorErase(FlashDat,0);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -