📄 const.c
字号:
unsigned char VERIFY_FISCAL_PIN(void)
{//效验使用口令。
//首先使用Ds12887中的pin校验,不正确再使用Flash中的pin校验。最后不正确才报错
unsigned char i;
I2crd(pincode,8);
for(i = 0;i < 8;i++)
SAM_DATA[i] = serialdata[i];
_VERIFY_FISCAL_PIN();
if (SAM_P1[0] != C_RIGHT)
{/*效验原始密码*/
Flashrd(first_pin,SAM_DATA,8);
_VERIFY_FISCAL_PIN();
if (SAM_P1[0] != C_RIGHT)
{
Show_code(SAM_P1[0],SAM_P2[0]);
if ((SAM_P1[0] == 0x69)&&(SAM_P2[0] == 0x83))
{//认证方法(PIN)锁定
I2crd(lockmac,1);
serialdata[0] |= 0x02;
I2cwr(lockmac,1);
}
return ERROR;
}
}
for (i = 0;i < 8;i++)
serialdata[i] = SAM_DATA[i];
I2cwr(pincode,8);
return RIGHT;
}
unsigned char DAILY_COLLECT_SIGN(unsigned char p2,unsigned char lc)
{//对日交易累计记录或其他数据签名
unsigned char i;
SAM_P2[0]=p2;
SAM_P3[0]=lc;
_DAILY_COLLECT_SIGN();
if (SAM_P1[0] == C_RIGHT)
return RIGHT;
Show_code(SAM_P1[0],SAM_P2[0]);
return ERROR;
}
unsigned char VERIFY(unsigned char lc,unsigned char *data)
{//用于校验命令数据域的个人密码的正确性
unsigned char i;
SAM_P3[0] = lc;
for (i = 0; i < lc; i++)
SAM_DATA[i] = data[i];
_VERIFY();
if (SAM_P1[0] == 0x90)
return RIGHT;
Show_code(SAM_P1[0],SAM_P2[0]);
return ERROR;
}
/* 税控机税务初始化流程 */
/* 进入这个函数前,用户卡和SAM卡都已 */
/* 经复位并都处在EF02下,SAM卡处于激 */
/* 活状态 */
unsigned char Tax_Format(void)
{
unsigned char sam_readdata[102]; /*从sam卡中读出的数据存放区*/
unsigned char disshop_num; /*分户数量*/
unsigned char Lcv_i; /*Lcv_i,Lcv_j,Lcv_k都是该函数中的临时变量*/
unsigned char Lcv_j; /*主要用来做循环变量等*/
unsigned char Lcv_k;
unsigned long adr;
union gyt4 Flashadd_union4; /*公用体4的指针变量*/
union gyt2 I2cadd_union2; /*公用体2的指针变量*/
/*读出初始化标识(sam-ef02)*/
Lcv_i = READ_BINARY(0, 1, 1, sam_readdata);
if (Lcv_i == ERROR)
{
return ERROR;
}
if (sam_readdata[0] != 0x01)
{
seri_er(0x27); /*税控卡已初始化,税空气是否初始化过依赖于这个标志*/
return ERROR;
}
/*1/税控卡中的税控机编号与出厂时的编号不一致*/
/*读出税控卡中的EF02中的税控机编号*/
/*判断sam卡是否与税控机符合*/
// Lcv_i = READ_BINARY(0, 10, 8, sam_readdata);
Lcv_i = READ_BINARY(0, 10, 16, sam_readdata);
if (Lcv_i == ERROR)
return ERROR;
/*读出税控机中的税控机编号*/
Flashrd(machno, serialdata, 8);
if (Data_cmp(8, sam_readdata, serialdata) != D_EQUAL)
{
// _card_release(); /*Test Only*/
seri_er(0x15); /*机器号不匹配*/
// strcpy((char *)&Lcd_dis[1],"机器编号不匹配 ");
// Lcd_dis[0] = second;
// _lcd_show();
// return ERROR; /*only for test*/
}
/*2/税控卡中与用户卡的纳税人编码不一致*/
/*判断税控卡与用户卡是否匹配*/
SAM_RACK[1] |= 0x80; /*选择用户卡*/
Lcv_i = READ_BINARY(0, 2, 8, serialdata);
if (Lcv_i == ERROR)
{
return ERROR;
}
// Show_string(8,serialdata); /*Test Only*/
if (Data_cmp(8, &sam_readdata[8], serialdata) != D_EQUAL)
{
// _card_release();
seri_er(0x2F);
// strcpy((char *)&Lcd_dis[1],"纳税人编码不匹配");
// Lcd_dis[0] = second;
// _lcd_show();
return ERROR;
}
SAM_RACK[1] &= 0x7F; /*选择sam*/
Lcv_k = READ_BINARY(0, 2, 101, serialdata); /*保存基本信息文件(SAM卡EF02)*/
if (Lcv_k == ERROR)
return ERROR;
Flashwr_serialdata(tsamno,101); /*保存监控管理数据文件(SAM卡EF01)*/
_SELECT_EF01();
if (SAM_P1[0] != C_RIGHT)
return ERROR;
Lcv_k = READ_BINARY(0, 0, 23, serialdata);
if (Lcv_k == ERROR)
return ERROR;
I2cwr(limit_date,23);
for (Lcv_i = 0; Lcv_i < 8; Lcv_i++)
serialdata[Lcv_i] = 0x00;
I2cwr(acash,8); /*两个限额在一起,所以一次搞定*/
SAM_RACK[1] |= 0x80; /*选择用户卡*/
Lcv_k = READ_BINARY(0,1,60,serialdata); /*保存基本信息文件(user卡EF02)*/
if (Lcv_k == ERROR)
return ERROR;
Flashwr_serialdata(umachnum,60); /*保存税种税目文件(user卡EF03)*/
_SELECT_EF03();
if (SAM_P1[0] != C_RIGHT)
return ERROR;
Lcv_i = 0;
for (Lcv_j = 0; Lcv_j < 20; Lcv_j++)
{
Lcv_k = READ_RECORD(Lcv_j + 1, 4, 47, serialdata);/*用户卡EF03*/
if (Lcv_k == ERROR)
return ERROR;
if (serialdata[0] != 0x00)
{
Flashwr_serialdata(taxitem_index + Lcv_i, 47);
Lcv_i += 47;
}
/*税种税目数量大于等于6退出,每台税控机最多支持六种税种税目*/
if (Lcv_i > 235) /*5*47=235*/
break;
}
/*税种税目数量小于6,我们将后面的部分全部补零*/
if (Lcv_i < 6)
{
Lcv_k = 47*(6-Lcv_i);
for(Lcv_j = 0; Lcv_j < Lcv_k; Lcv_j++)
serialdata[Lcv_j] = 0x00;
Flashwr_serialdata((taxitem_index + Lcv_i * 47),Lcv_k);
}
_SELECT_EF08(); /*保存分户开票编号文件(user卡EF08)*/
if (SAM_P1[0] != C_RIGHT)
return ERROR;
Lcv_i = READ_BINARY(0,0,2,serialdata);
if (Lcv_i == ERROR)
return ERROR;
/*分户数量由于存储空间限制,最大为50???*/
disshop_num = serialdata[1];
Lcv_j = disshop_num;
if ((disshop_num != 0x00)||(serialdata[1] != 0xFF))
{/*计算分户编码在文件EF08中的相对位置*/
disshop_num = 2 + disshop_num * 2;
Lcv_i = READ_BINARY(0, 0, disshop_num, sam_readdata);
if (Lcv_i == ERROR)
{
// strcpy((char *)&Lcd_dis[1]," 初始化错误九 ");
// Lcd_dis[0] = second; //row代表显示行
// _lcd_show();
return ERROR;
}
/*分户数量*/
serialdata[0] = sam_readdata[0];
serialdata[1] = sam_readdata[1];
for (Lcv_i = 0; Lcv_i < Lcv_j; Lcv_i++)
{
/*分户编码*/
serialdata[Lcv_i * 5 + 2] = sam_readdata[2 + Lcv_i * 2];
serialdata[Lcv_i * 5 + 3] = sam_readdata[3 + Lcv_i * 2];
/*初始化分户密码为全0*/
serialdata[Lcv_i * 5 + 4] = 0x00;
serialdata[Lcv_i * 5 + 5] = 0x00;
serialdata[Lcv_i * 5 + 6] = 0x00;
}
}
serialdata[0] = 0x00;
Flashwr_serialdata(disshopnum,2 + Lcv_j * 5);
/*写入用户卡PIN码????*/
serialdata[0] = 0x12;
serialdata[1] = 0x34;
serialdata[2] = 0x56;
serialdata[3] = 0x78;
Flashwr_serialdata(userpin,4);
/*初始化系统指针、存储指针和相应的变量*/
/*初始化管理员密码*/
for (Lcv_i = 0; Lcv_i < 4; Lcv_i++)
serialdata[Lcv_i] = 0x11;
Flashwr_serialdata(admin,4);
/*********************/
serialdata[0] = 0x00;
/*初始化发票使用计数器*/
I2cwr(volume_count, 1);
/*初始化断电标志*/
I2cwr(break_flag_add, 1);
/*初始化锁机标志*/
I2cwr(lockmac,1);
/*********************/
serialdata[0] = 0x01;
/*初始化换卷标志*/
I2cwr(volume_flag, 1);
/*初始化卷信息打印标志*/
I2cwr(volume_print, 1);
/*********************/
/*初始化存储卷的标志*/
serialdata[0] = 0xFF;
adr = invoce_code;
for (Lcv_i = 0; Lcv_i < 50; Lcv_i++)
{
I2cwr(adr, 1);
adr = adr + 23;
}
/*********************/
/*初始化最新一卷发票存储地址*/
Flashadd_union4.pr = invoce_code;
for(Lcv_i = 0;Lcv_i < 4;Lcv_i++)
serialdata[Lcv_i] = Flashadd_union4.str[Lcv_i];
I2cwr(Save_adr,4);
/*初始化I2C中发票明细指针*/
I2cadd_union2.pr = I2cMiXi_Star;
serialdata[0] = I2cadd_union2.str[0];
serialdata[1] = I2cadd_union2.str[1];
I2cwr(P_I2cMiXi,2);
/*初始化FLASH中发票明细指针*/
Flashadd_union4.pr = FlashMiXi_Star;
for (Lcv_i = 0; Lcv_i < 4; Lcv_i++)
serialdata[Lcv_i] = Flashadd_union4.str[Lcv_i];
I2cwr(P_FlashMiXi,4);
I2cwr(break_point,4);
/*初始化FLASH中申报指针*/
Flashadd_union4.pr = Declare_Star;
for(Lcv_i = 0;Lcv_i < 4;Lcv_i++)
serialdata[Lcv_i] = Flashadd_union4.str[Lcv_i] ;
I2cwr(P_Declare,4);
/*初始化FLASH中卷信息指针*/
Flashadd_union4.pr = Volume_Star;
for(Lcv_i = 0;Lcv_i < 4;Lcv_i++)
serialdata[Lcv_i] = Flashadd_union4.str[Lcv_i];
I2cwr(P_Volume,4);
/*初始化FLASH中日交易指针*/
Flashadd_union4.pr = Daily_Star;
for (Lcv_i = 0;Lcv_i < 4;Lcv_i++)
serialdata[Lcv_i] = Flashadd_union4.str[Lcv_i];
I2cwr(P_Daily,4);
_get_time();
/*初始化日交易起始日期*/
for (Lcv_i = 0; Lcv_i < 3; Lcv_i++)
serialdata[Lcv_i] = Ds12887[Lcv_i];
I2cwr(data1287,3);
/*初始化日交易锁机日期*/
serialdata[0] = serialdata[0] + 5;
I2cwr(lock_date,3);
/*初始化申报相关的数据(包括起始日期、结束日期和相关的数据清零)*/
serialdata[3] = serialdata[2];
serialdata[2] = serialdata[1];
serialdata[1] = serialdata[0] - 5;
serialdata[0] = 0x20;
for (Lcv_i = 0; Lcv_i < 3; Lcv_i++)
serialdata[Lcv_i + 4] = serialdata[Lcv_i];
/*BCD减法*/
if ((serialdata[3]&0x0F) == 0)
serialdata[7] = serialdata[3] - 7;
else
serialdata[7] = serialdata[3] - 1;
for (Lcv_i = 0; Lcv_i < 75; Lcv_i++)
serialdata[Lcv_i + 8] = 0;
Flashwr_serialdata(Declare_Star,83);
/*NOTE:初始化时,申报截至日期比起始日期少一天。同样在每次申报回送*/
/* 后,也同样将下个月的数据区照这种方法处理 */
SAM_RACK[1] &= 0x7F;/*选择sam*/
/*判断断电标志*/
if((IOP5&0x08) == 0x08)
return ERROR;
/*税控卡初始化流程*/
_FISCAL_REGISTER();
if (SAM_P1[0] != C_RIGHT)
{
return ERROR;
}
/*保存税控卡PIN码*/
Flashwr(first_pin, SAM_DATA, 8);
for (Lcv_i = 0;Lcv_i < 8;Lcv_i++)
serialdata[Lcv_i] = SAM_DATA[Lcv_i];
I2cwr(pincode,8);
no_invoice_flag = 0xFB; /*初始化有无发票标志*/
return RIGHT;
}
unsigned char Invoice_Distribute(void)
{/*发票分发程序user->I2c*/
unsigned char i;
unsigned char crc[2];
union gyt4 pp;
_USER_RESET();
if(SAM_RACK[0] != 0x00)
{
seri_er(0x02); /*USER 卡上电错误*/
// strcpy((char *)&Lcd_dis[1],"用户卡复位错误 ");
// Lcd_dis[0] = second;
// _lcd_show();
return ERROR;
}
/*判断纳税人编码*/
_SELECT_FILE02();
i = READ_BINARY(0, 2, 8, SAM_DATA);
if (i == ERROR)
return ERROR;
Flashrd(tuserno,serialdata,8);
if (Data_cmp(8, SAM_DATA, serialdata) != D_EQUAL)
{
seri_er(0x0E); /*用户卡中的纳税人编码与机器中的不匹配---报告为非法的用户卡*/
// _card_release();
// strcpy((char *)&Lcd_dis[1],"纳税人编码不匹配");
// Lcd_dis[0] = second;
// _lcd_show();
return ERROR;
}
/*断电保护流程*/
I2crd(break_flag_add,1);
if ((serialdata[0]&0x04) == 0x04)
{/*断电和插拔卡*/
if (!(IOP8&0x80))
return ERROR;
_SELECT_EF07();
i = READ_BINARY(0,0,22,SAM_DATA);
if (i == ERROR)
{
// strcpy((char *)&Lcd_dis[1]," 发票分发出错 ");
// Lcd_dis[0] = second;
// _lcd_show();
return ERROR;
}
I2crd(Save_adr,4);
pp.str[0] = serialdata[0];
pp.str[1] = serialdata[1];
pp.str[2] = serialdata[2];
pp.str[3] = serialdata[3];
I2crd(pp.pr+1,22);
i = Data_cmp(22,SAM_DATA,serialdata);
if (i != D_EQUAL)
{
pp.pr = invoce_code;
while(con)
{
I2crd(pp.pr,1);
if (serialdata[0] == 0xFF)
break;
pp.pr = pp.pr + 23;
}
serialdata[0] = 0x00;
for(i = 0;i < 22;i++)
serialdata[i+1] = SAM_DATA[i];
I2cwr(pp.pr,23);
for(i = 0;i < 4;i++)
serialdata[i]=pp.str[i];
I2cwr(Save_adr,4);/*保存地址,为断电所做*/
I2crd(break_flag_add,1);
serialdata[0] &= 0xFB;
I2cwr(break_flag_add,1);
return RIGHT;
}
}
/*设置发票分发断电保护标志*/
I2crd(break_flag_add,1);
serialdata[0] |= 0x04;
I2cwr(break_flag_add,1);
_SELECT_EF05();
/*查找I2C中的空余空间*/
pp.pr = invoce_code;
while(con)
{
I2crd(pp.pr,1);
if (serialdata[0] != 0x00)
break;
pp.pr = pp.pr + 23;
}
if(!(IOP8&0x80))/*无卡判断*/
return ERROR;
/*判断断电标志*/
if((IOP5&0x08) == 0x08)
return ERROR;
_DISTRIBUTE_INVOICE_NB();
if (SAM_P1[0] != C_RIGHT)
{/*发票分发错误后*/
if (SAM_P1[0]==0x94)
seri_er(0x2A);
// strcpy((char *)&Lcd_dis[1]," 发票分发出错 ");
// Lcd_dis[0] = second;
// _lcd_show();
return ERROR;
}
serialdata[0] = 0x00;
for(i = 0;i < 22;i++)
serialdata[i+1] = SAM_DATA[i];
I2cwr(pp.pr,23);
rxd[0] = 0x4F;
rxd[1] = 0x4B;
rxd[2] = 0x00;
rxd[3] = 0x16; /*len*/
for(i = 0;i < 18;i++)
txd[i+4] = SAM_DATA[i];
Callcrc(rxd,22,crc);
rxd[22] = crc[0];
rxd[23] = crc[1];
_seri_send_c();
for(i = 0;i < 4;i++)
serialdata[i] = pp.str[i];
I2cwr(Save_adr,4); /*保存地址,为断电所做*/
/*清除发票分发断电标志*/
I2crd(break_flag_add,1);
serialdata[0] &= 0xFB;
I2cwr(break_flag_add,1);
return RIGHT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -