📄 sim.c
字号:
}
else
adr=InvoStatDat+gs*37;
if(PwrFlg==1)
PowerOffHint(" ","单卷发票汇总信息未记录!",0xAA);
SerialFlashWrite(FlashDat,adr,37,str); //写入单卷发票使用汇总数据
tp.dat+=1;
I2cWrite(InvoStatNum,2,tp.str);
if(PwrFlg==1)
PowerOffHint(" ","单卷发票汇总信息已记录!",0x55);
//------------------------------------------------------------------
PtintInvoTome(str); //自动打印发票使用汇总数据报表.
}
#if DebugSim
LcdDisplay(16,32,"本卷发票已经用完!",3);
Hint(32,32,"请手工录入发票:",0);
if(ImportInvoice()==1)return 1;
else return 2;
#endif
}
}
void WriteCheckDat()
{//核查级别为“01”时覆盖稽查卡原有数据;为“0xFF”时从原有数据后添加
uchar i,k,m,dat[25];
if(SimDetect(0x12)==0)return; //等待并检测管理卡插入
i=ManagementIdentify();
if(i==0xFF)
{
SimDetect(0x02);
return;
}
ReadBinary(0x81,0,10,2);
m=RxdBuf[9];
ReadDate();
for(RxdNum=0;RxdNum<4;RxdNum++)dat[RxdNum]=InvoDate[RxdNum];
I2cRead(TaxpayerNo,8,&dat[4]);
I2cRead(MachineNo,8,&dat[12]);
dat[20]=i;
k=1;
switch(i)
{
case 0: k=CheckInvoiceDat(dat,m); break; //核查明细
case 1: k=CheckDailyDat(dat,m); break; //核查日交易数据
case 2: k=CheckDeclareDat(dat,m); break; //核查申报数据
case 3:
TimeSetup(2);
LcdDisplay(16,0,"修改时间完成!",3);
break; //修改时钟
default:LcdDisplay(16,0,"未定义的核查类别!",3);
LcdDisplay(32,0,"无法进行核查!",0);
k=0;
break;
}
if(k==1)LcdDisplay(32,0,"操作成功!",1);
SimDeactive(0);
SimDetect(0x02);
}
uchar DeclareFlgQuery()
{
uchar i,j,k,dat[8];
uint statecode;
I2cRead(FiscalCardNo,8,dat); //读取税控卡编号
RxdBuf[0]=0xEF;
RxdBuf[1]=0x04;
SelectFile(0x00,0x00,0x02,RxdBuf,1);
j=1;k=0;
while(1)
{
statecode=ReadRecord(0,j,0x04,220,1);
if(statecode==0x6A83)
{
Hint(16,0,"未找到对应申报文件!",1);
return 0xAA;
}
for(i=0;i<8;i++)
if(RxdBuf[i+1] != dat[i]) //读出的第一字节是汇总标志
{
k=1;break;
}
if(k==0)break;
else {j++;k=0;}
}
return RxdBuf[0];
}
uchar InvoiceCount()
{//查询剩余多少卷发票
uchar i,j;
uint k;
gyt2 *fp;
RxdBuf[0]=0xEF;
RxdBuf[1]=0x05;
SelectFile(0x00,0x00,0x02,RxdBuf,1);
j=0;
for(i=1;i<11;i++)
{
k=ReadRecord(1,i,0x04,20,1);
if(k==0x6A83)return j;
fp = &RxdBuf[18];
j += (uchar)fp->dat;
}
return j;
}
uchar GetDistributeNum(uchar x,uchar y)
{
uchar str1[]={"已分发 卷发票"};
uchar str2[]={"剩余 卷发票可分发"};
uchar k,tp[2];
str1[6]=x+'0';
str2[4]=(y/10)+ '0';
str2[5]=(y%10)+ '0';
LcdDisplay(0,0,str1,3);
LcdDisplay(16,0,str2,0);
LcdDisplay(48,0,"最多存储10卷发票数据",0);
while(1)
{
LcdDisplay(32,0,"要分发的发票卷数:",1);
tp[0]=0;
k=GetInt(32,144,0,2,0,tp);
if(tp[0]==K_TC)return 0;
if(k!=0 && (k+x)<=10)break;
Beep(400);
}
return k;
}
uchar DistributeMode()
{//检测卡是否插入
uchar i,j;
uchar x,k,str[4];
if(SimDetect(0x11)==0)return 0;
if(UserIdentify(1)!=1)
{
SimDetect(0x01);
return 0;
}
I2cRead(InvoiceNum,1,&i);
if(i>=10)
{
LcdDisplay(16,0,"发票存储空间已满,",3);
Hint(32,0,"不能再分发发票!",0);
SimDetect(0x01);
return 0;
}
j=InvoiceCount();
if(j==0)
{
LcdDisplay(32,0,"发票已用完,请购买发票!",0);
SimDetect(0x01);
return 0;
}
while(1)
{
WindowsSet(3);
strcpy(&WinHint[0][1],"1.分发最大数量发票");
strcpy(&WinHint[1][1],"2.分发一卷发票");
strcpy(&WinHint[2][1],"3.自定义分发的发票卷数");
str[0]=K_TC;
str[1]=K_HJ;
str[2]=0;
k=Windows(1,0,str);
if(str[0]==K_TC)return 0;
if(k>0 && k<4)break;
Beep(400);
}
switch(k)
{
case 1: x=10-i; break;
case 2: x=1; break;
case 3: x=GetDistributeNum(i,j);
if(x==0)return 0;
break;
default : x=1; break;
}
LcdDisplay(16,0,"开始分发......",3);
for(i=0;i<x;i++) //最多10卷发票
{
DistributeInvoice(i);
}
LcdDisplay(32,0,"分发完成!",0);
SimDetect(0x01);
return 1;
}
uchar ImportInvoice()
{
// ulong begin,end;
uchar i,flag,n,m,dat[230];
uchar mcu[8],str[25],hstr[]={"发票录入成功!"};
gyt4 *xp,*tp;
uint adr;
if(!FiscalIdentify(1))
{
LcdDisplay(16,48,"非本机税控卡,",3);
Hint(32,48,"不能录入发票!",0);
return 0;
}
I2cRead(InvoiceNo,8,mcu);
xp=&mcu[0];
tp=&mcu[4];
if(tp->dat!=0)
{
if(tp->dat>=xp->dat)
{
LcdDisplay(16,32,"本卷发票未用完,",3);
Hint(32,32,"不能录入发票!",0);
return 0;
}
}
I2cRead(InvoiceNum,1,dat);
n=dat[0];
if(n==0)
{
LcdDisplay(16,0,"没有已分发的发票数据,",3);
Hint(32,0,"请先分发发票!",0);
return 0;
}
else
{
i=0;flag=0;
while(1)
{
adr=i*22+InvoCode;
I2cRead(adr,22,dat);
xp=&dat[10];
tp=&dat[14];
strcpy(str,"第 卷发票代码:");
if(i<9)str[2]=i+'1';
else
{
str[2]='1';
str[3]='0';
}
LcdDisplay(0,0,str,3);
BcdToStr(10,dat,str,0);
LcdDisplay(16,0,str,0);
strcpy(str,"发票起始号:");
NumToStr(xp->dat,&str[11],0);
LcdDisplay(32,0,str,0);
strcpy(str,"发票终止号:");
NumToStr(tp->dat,&str[11],0);
LcdDisplay(48,0,str,0);
while(1)
{
m=KeyScan();
if(m==K_TC)return 0;
if(m==K_HJ)
{
flag=1;
break;
}
if(m==K_DOWN || m==K_RIGHT)
{
if(i<(n-1))i++;
else i=0;
break;
}
if(m==K_UP || m==K_LEFT)
{
if(i>0)i--;
else i=n-1;
break;
}
Beep(200);
}
if(flag==1)break;
}
if(InputInvoice(dat)==0)
{
Hint(32,16,"录入不成功!",3);
return 0;
}
n-=1;
adr+=22;
m=(n-i)*22;
I2cRead(adr,m,dat);
adr-=22;
I2cWrite(adr,m,dat);
dat[0]=n;
I2cWrite(InvoiceNum,1,dat);
if(PwrFlg==1)
PowerOffHint(" ",hstr,0x55);
Hint(16,16,hstr,3);
return 1;
}
}
void FirstIni()
{//初始化所有的计数器、变量
uint i,j;
uchar str[20]={__DATE__};
uchar dat[]=__TIME__;
gyt2 tp;
// #if FlashInvoM25P80
// SerialFlashBulkErase(FlashInvo);
// #else
// for(i=0;i<16;i++)SerialFlashSectorErase(FlashInvo,i);
// #endif
// #if FlashDatM25P80
// for(i=0;i<8;i++)SerialFlashSectorErase(FlashDat,i);
// #endif
for(i=0;i<256;i++)RxdBuf[i]=0;
I2cWrite(48,208,RxdBuf); //机器出厂数据48字节不能清零
for(i=0,j=256;i<3;i++,j+=256)
I2cWrite(j,256,RxdBuf);
tp.dat=100;
//PLU和项目数量应该在商品信息下载时写入,不能清零
I2cWrite(PluNumber,2,tp.str);
tp.str[0]=50;
I2cWrite(ItemNumber,1,tp.str);
InvoDate[0]=0x20;
InvoDate[1]=0x05;
InvoDate[2]=0x03;
InvoDate[3]=0x10;
I2cWrite(MachineTime,4,InvoDate);
I2cWrite(HardwareVer,18,"GS800 Version 1.00");
str[11]=' ';
strcpy(&str[12],dat);
str[17]=0;
I2cWrite(SoftwareVer,18,str);
}
uchar TerminateTime(uchar *time)
{
uchar dat[10],str[2];
gyt4 *fp,hp;
str[1]=0;
while(1)
{
LcdDisplay(16,0,"截止日期:",1);
memset(dat,0,sizeof(dat));
str[0]=0;
if(GetBcd(16,72,dat,8,str)==K_TC)return 0;
if(Verdict(dat)!=1) //检查日期合法性
{
LcdDisplay(32,0,"输入时间格式错误!",1);
continue;
}
fp=&dat[0]; //截止日期
hp.dat=fp->dat;
ReadDate();
fp=&InvoDate[0];
if(hp.dat>=fp->dat)
{//截止日期必须小于当天日期,因为当天的日交易签名还没有做
Hint(16,0,"截止日期 < 当天日期",3);
continue;
}
I2cRead(Declare,4,hp.str);
fp=&dat[0];
if(hp.dat>fp->dat)
{//报税时申报数据起始日期必须不大于截止日期
Hint(16,0,"起始日期 <= 截止日期",3);
continue;
}
break;
}
strcpy(time,dat);
return 1;
}
void TaxManage()
{
uchar i,x,str[4],dat[25],hstr[]={"注册成功!"};
gyt4 *xp;
x=1;
while(1)
{
WindowsSet(8);
strcpy(&WinHint[0][1],"1.税控机初始化");
strcpy(&WinHint[1][1],"2.分发发票");
strcpy(&WinHint[2][1],"3.录入发票");
strcpy(&WinHint[3][1],"4.报税");
strcpy(&WinHint[4][1],"5.完税");
strcpy(&WinHint[5][1],"6.税务数据核查");
strcpy(&WinHint[6][1],"7.发票验旧");
strcpy(&WinHint[7][1],"8.串行数据通讯");
str[0]=K_TC;
str[1]=K_HJ;
str[2]=0;
x=Windows(x,0,str);
if(str[0]==K_TC)return;
#if DebugSim
switch(x)
{
case 1: if(!FiscalIdentify(0))
{
LcdDisplay(48,0,"按任意键继续!",0);
KeyScan();
break;
}
if(SimDetect(0x11)==0)break; //等待并检测用户卡插入
if(UserIdentify(0)==1)
{
LcdDisplay(0,0,"开始初始化......",3);
if(PwrFlg!=0)
PowerOffHint(" ","初始化未完成!",0xAA);
FirstIni();
LcdDisplay(16,0,"开始注册......",0);
if(PwrFlg!=0)
PowerOffHint(" ","注册未完成!",0xAA);
FiscalCashRegisterIni();
if(PwrFlg!=0)
PowerOffHint(" ",hstr,0x55);
LcdDisplay(32,0,hstr,3);
}
SimDeactive(0);
SimDetect(0x01);
break;
case 2: DistributeMode();
break;
case 3: ImportInvoice();
break;
case 4:
if(!FiscalIdentify(1))
{
LcdDisplay(48,0,"按任意键继续!",0);
KeyScan();
break;
}
if(SimDetect(0x11)==0)break; //等待并检测用户卡插入
if(UserIdentify(1)==1)
{
i=DeclareFlgQuery();
if(i==0xAA)break;
if(i==0 || i==0xFF)
{
I2cRead(DeclareFlg,1,dat);
if(dat[0]==0)//正常报税要求输入截止日期
{
if(TerminateTime(dat)==0)break;
i=0;
}
else //补发的用户卡报税,不要求输入截止日期
{
i=1;
}
LcdDisplay(16,0,"开始报税......",1);
if(PwrFlg!=0)
PowerOffHint(" ","报税未完成!",0xAA);
xp = &dat[0];
DeclareDuty(xp->dat,i);
if(PwrFlg!=0)
PowerOffHint(" ","报税已完成!",0x55);
LcdDisplay(32,0,"报税成功!",0);
}
else
LcdDisplay(16,0,"没有完税,不能报税!",0);
}
SimDeactive(0);
SimDetect(0x01);
break;
case 5:
if(!FiscalIdentify(1))
{
LcdDisplay(48,0,"按任意键继续!",0);
KeyScan();
break;
}
if(SimDetect(0x11)==0)break; //等待并检测用户卡插入
I2cRead(DeclareFlg,1,dat);
if(UserIdentify(1)==1)
{
i=DeclareFlgQuery(); //返写监控数据后汇总标志被清零
if(i==0xAA)break;
if((i==0 || i==0xFF) && dat[0]==1)
{
LcdDisplay(16,0,"开始回传监控数据......",3);
if(PwrFlg==1)
PowerOffHint(" ","回传监控数据未完成!",0xAA);
UpdateControls();
if(PwrFlg!=0)
PowerOffHint(" ","回传监控数据已完成!",0x55);
LcdDisplay(32,0,"回传监控数据成功!",0);
}
else
LcdDisplay(16,0,"没有报税,不能完税!",0);
}
SimDeactive(0);
SimDetect(0x01);
break;
case 6: WriteCheckDat();
break;
case 7: InvoTomeWrite(); break;
case 8: TaxCom();
break;
default : Beep(400); break;
}
#endif
}
}
uint CRC16( uchar * aData, uint aSize )
{
uint code Table_CRC16[]={
0x0000,0x8005,0x800F,0x000A,0x801B,0x001E,0x0014,0x8011,
0x8033,0x0036,0x003C,0x8039,0x0028,0x802D,0x8027,0x0022,
0x8063,0x0066,0x006C,0x8069,0x0078,0x807D,0x8077,0x0072,
0x0050,0x8055,0x805F,0x005A,0x804B,0x004E,0x0044,0x8041,
0x80C3,0x00C6,0x00CC,0x80C9,0x00D8,0x80DD,0x80D7,0x00D2,
0x00F0,0x80F5,0x80FF,0x00FA,0x80EB,0x00EE,0x00E4,0x80E1,
0x00A0,0x80A5,0x80AF,0x00AA,0x80BB,0x00BE,0x00B4,0x80B1,
0x8093,0x0096,0x009C,0x8099,0x0088,0x808D,0x8087,0x0082,
0x8183,0x0186,0x018C,0x8189,0x0198,0x819D,0x8197,0x0192,
0x01B0,0x81B5,0x81BF,0x01BA,0x81AB,0x01AE,0x01A4,0x81A1,
0x01E0,0x81E5,0x81EF,0x01EA,0x81FB,0x01FE,0x01F4,0x81F1,
0x81D3,0x01D6,0x01DC,0x81D9,0x01C8,0x81CD,0x81C7,0x01C2,
0x0140,0x8145,0x814F,0x014A,0x815B,0x015E,0x0154,0x8151,
0x8173,0x0176,0x017C,0x8179,0x0168,0x816D,0x8167,0x0162,
0x8123,0x0126,0x012C,0x8129,0x0138,0x813D,0x8137,0x0132,
0x0110,0x8115,0x811F,0x011A,0x810B,0x010E,0x0104,0x8101,
0x8303,0x0306,0x030C,0x8309,0x0318,0x831D,0x8317,0x0312,
0x0330,0x8335,0x833F,0x033A,0x832B,0x032E,0x0324,0x8321,
0x0360,0x8365,0x836F,0x036A,0x837B,0x037E,0x0374,0x8371,
0x8353,0x0356,0x035C,0x8359,0x0348,0x834D,0x8347,0x0342,
0x03C0,0x83C5,0x83CF,0x03CA,0x83DB,0x03DE,0x03D4,0x83D1,
0x83F3,0x03F6,0x03FC,0x83F9,0x03E8,0x83ED,0x83E7,0x03E2,
0x83A3,0x03A6,0x03AC,0x83A9,0x03B8,0x83BD,0x83B7,0x03B2,
0x0390,0x8395,0x839F,0x039A,0x838B,0x038E,0x0384,0x8381,
0x0280,0x8285,0x828F,0x028A,0x829B,0x029E,0x0294,0x8291,
0x82B3,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -