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

📄 main.c

📁 本程序为某企业的税控机固件程序.基于东芝TMP93CS41 16位单片机编写,符合国家标准.该程序已经经过多次长期调试.
💻 C
📖 第 1 页 / 共 2 页
字号:
	    da = ((unsigned char)(crc/256))/16;      	// 暂存CRC的高4位
	    crc <<= 4;                   		// CRC右移4位, 相当于CRC的低12位
	    crc ^= crcdat[da^(*ptr&0x0f)];
	    // CRC的高4位和本字节的后半字节相加后查表计算CRC,然后再加上上一次CRC的余数
	    ptr++;
	 }
  	dtr[1] = (unsigned char)crc;
  	dtr[0] = (unsigned char)(crc>>8);
}

/*串口通讯发送ER函数*/
void seri_er(unsigned char error_code)
{
	unsigned char crc[2];

	txd[0] = 0x45;
	txd[1] = 0x52;
	txd[2] = 0x00;
	txd[3] = 0x05;
	txd[4] = error_code;
	Callcrc(txd,5,crc);
	txd[5] = crc[0];
	txd[6] = crc[1];
	_seri_send_c();
	comm_timeout = 0;
}

/*设置系统时间*/
void Set_Systime(void)
{
	unsigned char i;
	unsigned char data[10];
	unsigned char Ds_time[8];

//	_USER_RESET();
//	if (SAM_RACK[0] == 0x00)
//	{/*复位正确*/
//		_SELECT_FILE02();	/*USER EF02 datacmd 0x01*/
//		if (SAM_P1[0] != C_RIGHT)
//		{/*选择文件错误*/
//			seri_er(0x09);
//			return;
//		}
//
//		i = READ_BINARY(0,0,1,data);
//		if (i == ERROR)
//		{/*读文件错误*/
//			seri_er(0x09);
//			return;
//		}
//
//		if (data[0] == 0x02)
//		{/*而且是时间稽查卡*/
//			i = READ_BINARY(0,10,8,data);
//			if (i == ERROR)
//			{/*读文件错误*/
//				seri_er(0x09);
//				return;
//			}
//			_get_time();
//			for (i = 0; i < 5; i++)
//				Ds_time[i] = Ds12887[i];
//			/*判断应用启用期未到*/
//			if (Data_cmp(3,Ds_time,data) == D_LESS)
//			{
//				seri_er(0x30);
//				return;
//			}
//			/*判断应用有效期到*/
//			if (Data_cmp(3,Ds_time,&data[4]) == D_GREAT)
//			{
//				seri_er(0x31);
//				return;
//			}
//
//			/*读核查控制文件(EF01)*/
//			_SELECT_EF01();
//			if (SAM_P1[0] != C_RIGHT)
//			{/*选择文件错误*/
//				seri_er(0x09);
//				return;
//			}
//
//			i = READ_BINARY(0,0,0x0A,data);
//			if (i == ERROR)
//			{/*读文件错误*/
//				seri_er(0x09);
//				return;
//			}
//			/*比较被稽查纳税人编码*/
//			Flashrd(uuserno,serialdata,8);
//			if (Data_cmp(8,serialdata,data) != D_EQUAL)
//			{
//				seri_er(0x15);
//				return;
//			}
//			_GET_CHALLENGE(); /*取随机数*/
//			if (SAM_P1[0] == C_RIGHT)
//			{
//				for (i = 0;i < 8; i++)
//					serialdata[i] = SAM_DATA[i];
//			}
//			else
//			{
//				seri_er(0x34);
//				return;
//			}
//
//			_SAM_RESET();	/*税控卡复位*/
//			if(SAM_RACK[0] != 0x00)
//			{/*卡片复位错误*/
//				seri_er(0x01);
//				return;
//			}
//
//			_SELECT_FILE02();
//			if (SAM_P1[0] != C_RIGHT)
//			{/*选择文件错误*/
//				seri_er(0x07);
//				return;
//			}
//			SAM_P2[0] = data[9];	/*data[9]为稽查级别*/
//			for (i = 0; i < 8; i++)
//				SAM_DATA[i] = serialdata[i];
//			_INTERNAL_ATUHNTICATION();	/*内部认证*/
//			if (SAM_P1[0] != C_RIGHT)
//			{
//				seri_er(0x31);
//				return ;
//			}
//
//			SAM_RACK[1] |= 0x80;	/*选择稽查卡*/
//			SAM_P2[0] = data[9];
//			_EXTERNAL_AUTHENTICATION();	/*外部认证*/
//			if (SAM_P1[0] != 0x90)
//			{
//				seri_er(0x32);
//				return;
//			}
//			goto set_time;
//  		}
//	}

	/*判断是否初始化*/
	_SAM_RESET();		//PSAM卡复位
	if(SAM_RACK[0] != 0x00)
	{
		seri_er(0x01);
		return;
	}

	_SELECT_FILE02();
	if (SAM_P1[0] != C_RIGHT)
	{
		seri_er(0x07);
		return;
	}

	i = READ_BINARY(0, 1, 1, data);
	if (i == ERROR)
	{
		seri_er(0x07);
		return;
	}

	if (data[0] == 0x00)
	{
		seri_er(0x1E);
		return;
	}

//set_time:
	Ds12887[6] = rxd[12];		/*weekday */
    	Ds12887[5] = rxd[11];		/*second*/
	Ds12887[4] = rxd[10];		/*minute*/
	Ds12887[3] = rxd[9];		/*hour*/

	Ds12887[2] = rxd[8];		/*day*/
	Ds12887[1] = rxd[7];		/*month*/
	Ds12887[0] = rxd[6];		/*year*/
	_set_time();
	_seri_ok();
}

void Get_Systime(void)
{
	unsigned char crc[2];

	_get_time();
	rxd[0] = 0x4F;
	rxd[1] = 0x4B;
	rxd[2] = 0x00;
	rxd[3] = 0x0A;
	rxd[4] = 0x20;
	rxd[5] = Ds12887[0];
	rxd[6] = Ds12887[1];
	rxd[7] = Ds12887[2];
	rxd[8] = Ds12887[3];
	rxd[9] = Ds12887[4];
	Callcrc(rxd,10,crc);
	rxd[9] = crc[0];
	rxd[10] = crc[1];
	_seri_send_c();
}

void Com0_Manage(void)
{
	unsigned char i;
	unsigned char crc[2];
	union gyt4 pp;	/*only for test*/

	comm_timeout = 0;

	/*判断联机标志*/
//	if (Flag_Online != 0x01)
//	{
//		Buffer[0] = 0x1B;
//		Buffer[1] = 0x10;
//		Buffer[2] = 0x01;
//		Buffer[3] = 0x00;
//		Buffer[4] = 0x05;
//		Buffer[5] = 0xC4;
//		Buffer[6] = 0xC7;
//		_seri_rec_c();	/*接收联机命令*/
//
//		if ((Debug_code[0] == 0xF5) && (Data_cmp(7,Buffer,rxd) == D_EQUAL))
//		{
//			Flag_Online = 0x01;
//			_seri_ok();
//		}
//		else
//		{
//			seri_er(0xE1);
//			Beep(30);
//		}
//		return;
//	}

	/*接收并分析数据*/
	_seri_rec_c();
	if(Debug_code[0] != 0xF5)
	{
		seri_er(0x1F);
		Beep(30);
		return;
	}
	i = rxd[4];
	Callcrc(rxd,i,crc);
	if((rxd[i] != crc[0])||(rxd[i+1] != crc[1]))
	{
		seri_er(0x35);
		return;
	}

	INTET54 = 0x50;	/*开定时器4中断级*/
	TRUN |= 0x10;	/*开定时器使能*/

	switch(rxd[2])
	{
		case 0x10:	/*获取初始化数据*/
				break;
		case 0x30:	/*税控器初始化*/
//				strcpy((char *)&Lcd_dis[1],"    初始化      ");
//				Lcd_dis[0] = first;	//row代表显示行
//				_lcd_show();
				_USER_RESET();		//user卡复位
				if(SAM_RACK[0] != 0x00)
				{
//					strcpy((char *)&Lcd_dis[1],"USER卡复位错误  ");
//					Lcd_dis[0] = second;	//row代表显示行
//					_lcd_show();
					seri_er(0x02);		/*USER卡上电错误*/
					break;
				}

				_SELECT_FILE02();	/*USER EF02 datacmd 0x01*/
				if (SAM_P1[0] != C_RIGHT)
				{
					_card_release();
					seri_er(0x08);		/*读USER卡错误*/
					break;
				}

				_SAM_RESET();		//PSAM卡复位
				if(SAM_RACK[0] != 0x00)
				{
//					strcpy((char *)&Lcd_dis[1],"ASM 卡复位错误  ");
//					Lcd_dis[0] = second;	//row代表显示行
//					_lcd_show();
					seri_er(0x01);		/*SAM卡上电错误*/
					break;
				}

				_SELECT_FILE02();	/*USER EF02 datacmd 0x01*/
				 if (SAM_P1[0] != C_RIGHT)
				{
					_card_release();
					seri_er(0x07);		/*读SAM卡错误*/
					break;
				}

				i = Tax_Format();	/*初始化流程*/

				_card_release();	/*卡片释放*/

				if (i == RIGHT)
				{
					_seri_ok();
//					strcpy((char *)&Lcd_dis[1],"初始化完毕, 取卡");
//					Lcd_dis[0] = second;
//					_lcd_show();
					Beep(20);
				}
				break;
		case 0x31:	/*发票分发*/
				i = Invoice_Distribute();

				_card_release();	/*卡片释放*/

				if (i == RIGHT)
				{
//					strcpy((char *)&Lcd_dis[1],"  分发完毕, 取卡");
//					Lcd_dis[0] = second;
//					_lcd_show();
					Beep(20);
				}

				break;
		case 0x32:	/*已分发的发票号上传*/

				break;
		case 0x3A:	/*已分发的发票号上传*/
				Get_Systime();
				break;
		case 0x3B:	/*设置时钟*/
				Set_Systime();
				break;
		case 0x3C:
				break;
		case 0x3D:

				break;
		default :
				Beep(100);
				break;
	}

	INTET54 = 0x00;	/*关定时器4中断级*/
	TRUN &= 0xEF;	/*关定时器使能*/
}
/****************only for test***************/

//void Show_time(unsigned char DisplayFlag)
//{
//	unsigned char a,b,c;
//
//	a=0;
//	b=0;
//	c=0;
//
//	_get_time();
//	if (DisplayFlag == VFD_Clock)
//	{/*VFD 时钟*/
//		a = Ds12887[3];//时
//		b = Ds12887[4];//分
//		c = Ds12887[5];//秒
//		Dis[1] = char_not_display;
//		Dis[2] = char_not_display;
//	}
//
//	if (DisplayFlag == VFD_Date)
//	{/*VFD 日期*/
//		a = Ds12887[0];
//		b = Ds12887[1];
//		c = Ds12887[2];
//		Dis[1] = char_2;
//		Dis[2] = char_0;
//	}
//
//        if (DisplayFlag != VFD_NoDisplay)
//	{
//		Dis[3] = a>>4;
//		Dis[4] = a&0x0F;
//
//		Dis[5] = char_JH;
//
//		Dis[6] = b>>4;
//		Dis[7] = b&0x0F;
//
//		Dis[8] = char_JH;
//
//		Dis[9] = c>>4;
//		Dis[10] = c&0x0F;
//
//		_show();
//	}
//}

/*******************************************/

void main(void)
{
	unsigned char i;

	Buffer		= (unsigned char *)0x100;
	Lcd_dis		= (unsigned char *)0x10B;
	Ds12887 	= &Buffer[1];
	Debug_code 	= (unsigned char *)0x144;
	serialdata	=(unsigned char *)0x145;

	rxd		= (unsigned char *)0x350;
	txd		= (unsigned char *)0x350;

	SAM_RACK	=(unsigned char *)0x230;
	SAM_CLA		= (unsigned char *)0x253;
	SAM_INS		= (unsigned char *)0x254;
	SAM_P1		= (unsigned char *)0x255;
	SAM_P2		= (unsigned char *)0x256;
	SAM_P3		= (unsigned char *)0x257;
	SAM_DATA 	= (unsigned char *)0x258;
	EF_FILENAME	= (unsigned char *)0x259;

	con = 1;
	system_lock = 1;	//上电初始化,直接锁机
	command = 0;		//清除命令字

	_init_lcd();	/*初始化液晶*/
	_init_rtc();	/*初始化时钟*/

	INTES1 = 0x04;	/*开串口1中断*/
//	INTE0AD = 0x04; /*开卡片中断*/
	while(system_lock)
	{
		;
	}

	while(con)
	{
		strcpy((char *)&Lcd_dis[1],"    欢迎使用    ");
		Lcd_dis[0] = first;	//row代表显示行
		_lcd_show();

		while(command==0x00)
			{
				;
			}

		switch(command)
		{
			case 0x10:	/*获取初始化数据*/
					break;

			case 0x30:	/*税控器初始化*/
//				strcpy((char *)&Lcd_dis[1],"    初始化      ");
//				Lcd_dis[0] = first;	//row代表显示行
//				_lcd_show();
				_USER_RESET();		//user卡复位
				if(SAM_RACK[0] != 0x00)
				{
//					strcpy((char *)&Lcd_dis[1],"USER卡复位错误  ");
//					Lcd_dis[0] = second;	//row代表显示行
//					_lcd_show();
					seri_er(0x02);		/*USER卡上电错误*/
					break;
				}

				_SELECT_FILE02();	/*USER EF02 datacmd 0x01*/
				if (SAM_P1[0] != C_RIGHT)
				{
					_card_release();
					seri_er(0x08);		/*读USER卡错误*/
					break;
				}

				_SAM_RESET();		//PSAM卡复位
				if(SAM_RACK[0] != 0x00)
				{
//					strcpy((char *)&Lcd_dis[1],"ASM 卡复位错误  ");
//					Lcd_dis[0] = second;	//row代表显示行
//					_lcd_show();
					seri_er(0x01);		/*SAM卡上电错误*/
					break;
				}

				_SELECT_FILE02();	/*USER EF02 datacmd 0x01*/
				 if (SAM_P1[0] != C_RIGHT)
				{
					_card_release();
					seri_er(0x07);		/*读SAM卡错误*/
					break;
				}

				i = Tax_Format();	/*初始化流程*/

				_card_release();	/*卡片释放*/

				if (i == RIGHT)
				{
					_seri_ok();
//					strcpy((char *)&Lcd_dis[1],"初始化完毕, 取卡");
//					Lcd_dis[0] = second;
//					_lcd_show();
					Beep(20);
				}
				break;

			case 0x31:	/*发票分发*/
				i = Invoice_Distribute();

				_card_release();	/*卡片释放*/

				if (i == RIGHT)
				{
//					strcpy((char *)&Lcd_dis[1],"  分发完毕, 取卡");
//					Lcd_dis[0] = second;
//					_lcd_show();
					Beep(20);
				}

				break;

			case 0x32:	/*已分发的发票号上传*/

				break;

			case 0x3A:	/*已分发的发票号上传*/
				Get_Systime();
				break;

			case 0x3B:	/*设置时钟*/
				Set_Systime();
				break;

			case 0x3C:
				break;

			case 0x3D:

				break;

			default :
				break;
		}
		command=0x00;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -