⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 const.c

📁 本程序为某企业的税控机固件程序.基于东芝TMP93CS41 16位单片机编写,符合国家标准.该程序已经经过多次长期调试.
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -