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

📄 main.c

📁 本程序为某企业的税控机固件程序.基于东芝TMP93CS41 16位单片机编写,符合国家标准.该程序已经经过多次长期调试.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*============================================
            Main Program (Sample)
  ============================================*/
#include    "560.h"         /* for the reference of I/O */

/*******************全局变量区域****************************/
unsigned char *Buffer;

unsigned char *Ds12887;			//Ds12887[13],time buffer
unsigned char *serialdata;

unsigned char *SAM_RACK;
unsigned char *SAM_CLA;
unsigned char *SAM_INS;
unsigned char *SAM_P1;
unsigned char *SAM_P2;
unsigned char *SAM_P3;
unsigned char *SAM_DATA;
unsigned char *EF_FILENAME;

unsigned char *rxd;
unsigned char *txd;
unsigned char *Lcd_dis;
unsigned char *Debug_code;

unsigned char con;
unsigned char comm_timeout;
unsigned char Flag_Online;

unsigned char no_invoice_flag;		/*有无发票标志*/

unsigned char system_lock;		//系统锁机标志,当其不为"0"时,整机功能锁定
unsigned char command;			//系统命令字,该字节由串口命令解析函数提供
/*******************全局函数区域*************************/
extern void _init_rtc(void);
extern void _get_time(void);
extern void _set_time(void);

extern void _seri_send_c(void);
extern void _seri_rec_c(void);
extern void _seri_ok(void);
extern void _seri_er(void);

extern void _delay(void);
//extern void _show(void);

extern void _SAM_RESET(void);
extern void _USER_RESET(void);
extern void _card_release(void);

extern void _SELECT_EF01(void);
extern void _SELECT_FILE02(void);

extern void _GET_CHALLENGE(void);
extern void _EXTERNAL_AUTHENTICATION(void);
extern void _INTERNAL_ATUHNTICATION(void);

extern unsigned char READ_RECORD(unsigned char ,unsigned char ,unsigned char ,unsigned char *);
extern unsigned char READ_BINARY(unsigned char ,unsigned char ,unsigned char ,unsigned char *);
extern unsigned char Invoice_Distribute(void);


extern void W29c040wrsd(unsigned long ,unsigned char *,unsigned int );
extern void W29c040wrsd_serialdata(unsigned long ,unsigned int );

extern void I2cwr(unsigned long ,unsigned char);
extern unsigned char I2crd(unsigned long ,unsigned int );

extern unsigned char Tax_Format(void);
extern char *strcpy(char *,const char *);
/*********************only for test**********************/
//extern void LCD_display(unsigned char row);
extern void _lcd_show(void);
extern void _init_lcd(void);
extern void _clr_lcd(void);
/*******************************************************/
/*系统延时函数*/
void Delayms(unsigned int m)
{
	while(m != 0x00)
    	{
    		_delay();
    		m--;
    	}
}

/*蜂鸣器鸣叫函数*/
void Beep(unsigned char m)
{
    	IOP3 |= 0x08;
    	while(m != 0x00)
    	{
    		_delay();
    		m--;
    	}
    	IOP3 &= 0xF7;
}

void Show_string(unsigned char datanum,unsigned char *show_data)
{
	unsigned char i;

	for (i = 0; i < datanum; i++)
	{
		if ((show_data[i]&0xF0)<0xA0)
			Lcd_dis[2*i+1] = (show_data[i]>>4)+0x30;
		else
			Lcd_dis[2*i+1] = (show_data[i]>>4)+0x37;

		if ((show_data[i]&0x0F)<0x0A)
			Lcd_dis[2*i+2] = (show_data[i]&0x0F)+0x30;
		else
			Lcd_dis[2*i+2] = (show_data[i]&0x0F)+0x37;
	}
	Lcd_dis[2*datanum+1] = 0x00;
	Lcd_dis[0] = third;
	_lcd_show();
}

void Show_code(unsigned char first_data,unsigned char second_data)
{
	unsigned char i;

	Lcd_dis[0] = 0x9E;
//	for ( i = 1; i < 13; i++)
//		Lcd_dis[i] = 0x20;
	if ((first_data&0xF0)<0xA0)
		Lcd_dis[1] = (first_data>>4)+0x30;
	else
		Lcd_dis[1] = (first_data>>4)+0x37;

	if ((first_data&0x0F)<0x0A)
		Lcd_dis[2] = (first_data&0x0F)+0x30;
	else
		Lcd_dis[2] = (first_data&0x0F)+0x37;

	if ((second_data&0xF0)<0xA0)
		Lcd_dis[3] = (second_data>>4)+0x30;
	else
		Lcd_dis[3] = (second_data>>4)+0x37;

	if ((second_data&0x0F)<0x0A)
		Lcd_dis[4] = (second_data&0x0F)+0x30;
	else
		Lcd_dis[4] = (second_data&0x0F)+0x37;

	Lcd_dis[5] = 0x00;
	_lcd_show();
	Delayms(500);
}

/*数组比较函数*/
unsigned char Data_cmp(unsigned char len,unsigned char *p1,unsigned char *p2)
{//比较两个数组是否相等,0 相等   1 p1>p2   2  p1<p2
	unsigned char i;

	for (i = 0; i < len; i++)
	{
		if (p1[i] > p2[i])
			return D_GREAT;//p1>p2
		if (p1[i] < p2[i])
			return D_LESS;//p1<p2
	}
	return D_EQUAL;
}

/*	Flash的读操作流程		*/
void Flashrd(unsigned long adr, unsigned char *dat, unsigned int size)
{
	unsigned int Liv_i;	/*循环变量*/
	unsigned char *p;	/*指针变量*/

	p = (unsigned char *)adr;
	for (Liv_i = 0; Liv_i < size; Liv_i++)
	{
		dat[Liv_i] = *(p + Liv_i);
	}
}

/*	Flash的写,包括第一片写其他片和第二片写第一片	*/
/*	由于在写入的过程中不允许产生任何的中断,所以我	*/
/*	们在这个函数进入后使用了_DI();			*/
void Flashwr(unsigned long adr, unsigned char *dat, unsigned int size)
{
	unsigned int 	Liv_i, Liv_j;
	unsigned int	low_addr;
	unsigned long	high_addr;
	unsigned char 	write_data[256];
	unsigned char   *p;		/*指针变量*/
	unsigned long   Llv_counter;	/*检测写入完整否的计数变量*/

	__DI();
	if (adr < 0x80000)
	{/*向第一片写数据则调用第二片的程序*/
		W29c040wrsd(adr,dat,size);
	}
	else
	{
		low_addr = (unsigned int)(adr&0x0000FF);
		high_addr = adr & 0xFFFF00;
		Liv_i = size + low_addr;
		if (Liv_i > 256)
		{/*跨页面写*/
			Liv_i = Liv_i - 256;
			/*第二步,余下字节写入第二页面*/
			Llv_counter = high_addr + 256;
			Flashrd(Llv_counter,write_data,256);
			for (Liv_j = 0; Liv_j < Liv_i; Liv_j++)
				write_data[Liv_j] = dat[256 - low_addr + Liv_j];

			/*解除数据保护*/
			p = (unsigned char *)(Llv_counter & 0xFF8000);
			*(p + 0x5555) = 0xAA;
			*(p + 0x2AAA) = 0x55;
			*(p + 0x5555) = 0xA0;

			/*写入数据*/
			p = (unsigned char *)Llv_counter;
			for (Liv_j = 0; Liv_j < 256; Liv_j++)
				*(p + Liv_j ) = write_data[Liv_j];

			/*数据校验*/
			p = (unsigned char *)(Llv_counter & 0xFF0000);	/*Llv_counter借用为地址*/
			Llv_counter = 0;
			write_data[0] = *p;
			write_data[0] &= 0x40;
			while (Llv_counter < 0x7FFFF)
			{
				write_data[1] = *p;
				write_data[1] &= 0x40;
				if (write_data[0] == write_data[1])
					break;
				write_data[0] = write_data[1];
				Llv_counter++;
			}
			Liv_i = 256;
		}/*end of if (Liv_i > 256)*/
		/*同一页面写*/
		Flashrd(high_addr,write_data,256);
		for (Liv_j = low_addr; Liv_j < Liv_i; Liv_j++)
			write_data[Liv_j] = dat[Liv_j - low_addr];

		/*解除数据保护*/
		p = (unsigned char *)(high_addr & 0xFF8000);
		*(p + 0x5555) = 0xAA;
		*(p + 0x2AAA) = 0x55;
		*(p + 0x5555) = 0xA0;

		/*写入数据*/
		p = (unsigned char *)high_addr;
		for (Liv_j = 0; Liv_j < 256; Liv_j++)
			*(p + Liv_j ) = write_data[Liv_j];

		/*数据校验*/
		p = (unsigned char *)(high_addr & 0xFF0000);
		Llv_counter = 0;
		write_data[0] = *p;
		write_data[0] &= 0x40;
		while (Llv_counter < 0x7FFFF)
		{
			write_data[1] = *p;
			write_data[1] &= 0x40;
			if (write_data[0] == write_data[1])
				break;
			write_data[0] = write_data[1];
			Llv_counter++;
		}
	}/*end of if (adr < 0x80000) */
	__EI();
}

/*Flash的写入。数据缓冲区在serialdata中*/
void Flashwr_serialdata(unsigned long adr,unsigned int size)
{
	unsigned int 	Liv_i, Liv_j;
	unsigned int	low_addr;
	unsigned long	high_addr;
	unsigned char 	write_data[256];
	unsigned char 	*p;		/*指针变量*/
	unsigned long 	Llv_counter;	/*检测写入完整否的计数变量*/

	__DI();
	if (adr < 0x80000)
	{/*向第一片写数据则调用第二片的程序*/
		W29c040wrsd_serialdata(adr,size);
	}
	else
	{
		low_addr = (unsigned int)(adr & 0x0000FF);
		high_addr = adr & 0xFFFF00;
		Liv_i = size + low_addr;
		if (Liv_i > 256)
		{/*跨页面写*/
			/*第一步,补齐第一页面剩余字节*/
			Liv_i = Liv_i - 256;
			/*第二步,余下字节写入第二页面*/
			Llv_counter = high_addr + 256;
			Flashrd(Llv_counter,write_data,256);
			for (Liv_j = 0; Liv_j < Liv_i; Liv_j++)
				write_data[Liv_j] = serialdata[256 - low_addr + Liv_j];
			/*解除数据保护*/
			p = (unsigned char *)(Llv_counter & 0xFF8000);
			*(p + 0x5555) = 0xAA;
			*(p + 0x2AAA) = 0x55;
			*(p + 0x5555) = 0xA0;

			/*写入数据*/
			p = (unsigned char *)Llv_counter;
			for (Liv_i = 0; Liv_i < 256; Liv_i++)
				*(p + Liv_i ) = write_data[Liv_i];

			/*数据校验*/
			p = (unsigned char *)(Llv_counter & 0xFF0000);/*Llv_counter是暂时借用的*/

			Llv_counter = 0;
			write_data[0] = *p;
			write_data[0] &= 0x40;
			while (Llv_counter < 0x7FFFF)
			{
				write_data[1] = *p;
				write_data[1] &= 0x40;
				if (write_data[0] == write_data[1])
					break;
				write_data[0] = write_data[1];
				Llv_counter++;
			}
			Liv_i = 256;
		}
		/*同一页面写*/
		Flashrd(high_addr,write_data,256);
		for (Liv_j = low_addr; Liv_j < Liv_i; Liv_j++)
			write_data[Liv_j] = serialdata[Liv_j - low_addr];

		/*解除数据保护*/
		p = (unsigned char *)(high_addr & 0xFF8000);
		*(p + 0x5555) = 0xAA;
		*(p + 0x2AAA) = 0x55;
		*(p + 0x5555) = 0xA0;

		/*写入数据*/
		p = (unsigned char *)high_addr;
		for (Liv_i = 0; Liv_i < 256; Liv_i++)
			*(p + Liv_i ) = write_data[Liv_i];

		/*数据校验*/
		p = (unsigned char *)(high_addr & 0xFF0000);
		Llv_counter = 0;
		write_data[0] = *p;
		write_data[0] &= 0x40;
		while (Llv_counter < 0x7FFFF)
		{
			write_data[1] = *p;
			write_data[1] &= 0x40;
			if (write_data[0] == write_data[1])
				break;
			write_data[0] = write_data[1];
			Llv_counter++;
		}
	}/*end of if (adr < 0x80000) */
	__EI();
}

void Icmanage(void)
{
//	unsigned char i;
//
//	_clr_lcd();
//	strcpy((char *)&Lcd_dis[1],"处理中, 请稍候  ");
//	LCD_display(2);
//
//	Dis[1] = char_C;
//	Dis[2] = char_A;
//	Dis[3] = char_R;
//	Dis[4] = char_d;
//	Dis[5] = char_JH;
//	Dis[6] = char_I;
//	Dis[7] = char_N;
//	Dis[8] = char_not_display;
//	Dis[9] = char_not_display;
//	Dis[10] = char_not_display;
//	_show();
//
//	/*CPU卡操作流程*/
//	i = Sammange();
//	if(i != RESETERROR)
//		return;
//
//	/*普通卡操作流程*/
//	IOP3 &= 0xFB;/*卡片上电*/
//	Delayms(600);
//	Ssf1101rd(0,ictype,10);	/*按照1101卡来读写操作*/
////	for (i = 0; i < 8; i++)
////	{
////		Show_code(serialdata[2*i],serialdata[2*i+1]);
////	}
//	if (serialdata[1] == 0xAA)
//	{
//		switch (serialdata[0])
//		{
//			case 0x11 :	/*机器号出厂初始化*/
//					Flashwr(machno,&serialdata[2],8);
//					serialdata[5] = 0x01;
//					break;
//			case 0x33 :	/*商品管理*/
//					Icguanlinew();
////					Sam_Modify_Time();
//					serialdata[5] = 0x1B;
//					break;
//			case 0x44 :	/*使用IC卡更新程序*/
//					_clr_lcd();
//					i = Admimainput();
//					if (i == ERROR)
//						serialdata[5] = 0x20;
//					else
//						serialdata[5] = 0x01;
//					serialdata[6] = i;
//					serialdata[7] = 0x00;
//					aduit_wr();		/*为了区分密码失败事件*/
//					if (i == ERROR)
//						return;
//					Updatemain();
//					break;
//			case 0x55:	/*初始化管理员密码*/
//					SetCipher;
//					Dis[1] = char_P;
//					Dis[2] = char_S;
//        				strcpy((char *)&Lcd_dis[1],"管理密码        ");
//        				LCD_Intinput(3,8,8);
//        				ClrCipher;
//        				if (Key[0] == K_TC)
//						return;
////					if(JudgeFQuit)
////						return;
//					if (Key[11] < 6)
//					{
//						strcpy((char *)&Lcd_dis[1],"管理密码错误!  ");
//						LCD_display(2);
//						Show_code(0x00,0xB1);
//						return;
//					}
//					Dot[0] = (Key[0]<<4) + Key[1];
//					Dot[1] = (Key[2]<<4) + Key[3];
//					Dot[2] = (Key[4]<<4) + Key[5];
//					Dot[3] = (Key[6]<<4) + Key[7];
//
//					i = Dot[0];
//					Dot[0] = Dot[1];
//					Dot[1] = i;
//					i = Dot[2];
//					Dot[2] = Dot[3];
//					Dot[3] = i;			/*Dot是临时借用*/
//
//					if(Data_cmp(4,Dot,&serialdata[2]) != D_EQUAL)
//					{
//						strcpy((char *)&Lcd_dis[1],"管理密码错误!  ");
//						LCD_display(2);
//						Show_code(0x00,0xB1);
//						return;
//					}
//
//  					for (i = 0; i < 4; i++)
//						serialdata[i] = 0x11;
//					Flashwr_serialdata(admin,4);
//					break;
//			case 0x66:
//					UpdatePrintStyle();
//					serialdata[5] = 0x1B;
//					break;
////			case 0xAA :	/*发票明细的导出*/
////					Collect_InvoiceData();
////					serialdata[5] = 0x15;
////					break;
//			default	  :
//					Beep(20);
//					break;
//		}/*end of ssf1101 switch*/
//		/*审计信息*/
//		serialdata[6] = 0x01;
//		serialdata[7] = 0x00;
//		aduit_wr();
//
//	}/*end of ssf1101 if*/
//	else
//	{/*卡型不正确,显示00,蜂鸣器叫6秒*/
//		/*审计信息*/
//		serialdata[5] = 0x16;
//		serialdata[6] = 0x00;
//		Flashrd(Declare_Star,Dis,1);
//		if (Dis[0] != 0xFF)
//			serialdata[7] = 0x01;
//		else
//			serialdata[7] = 0x04;
//		aduit_wr();
//
//		Beep(20);
//		_clr_lcd();
//		strcpy((char *)&Lcd_dis[1],"卡的类型不正确  ");
//		LCD_display(2);
//		strcpy((char *)&Lcd_dis[1],"  请取出IC卡    ");
//		LCD_display(3);
//
//		for(i = 5; i < 9; i++)
//			Dis[i] = char_not_display;
//		Dis[1] = char_C;
//		Dis[2] = char_O;
//		Dis[3] = char_d;
//		Dis[4] = char_E;
//		Dis[9] = char_0;
//		Dis[10] = char_4;
//		_show();
//		while (IOP8&0x10){}
//	}/*end of ssf1101 if-else*/
//
//	IOP3 |= 0x04;	/*卡片下电*/
}

/*CRC计算函数*/
void Callcrc(unsigned char *ptr, unsigned char len, unsigned char *dtr)
{//CRC余式表是按
	unsigned int crc;
	unsigned char da;
	unsigned int crcdat[16];

	crc = 0;
	// CRC余式表
	crcdat[0] = 0x0000;
	crcdat[1] = 0x8005;
	crcdat[2] = 0x800F;
	crcdat[3] = 0x000A;
	crcdat[4] = 0x801B;
	crcdat[5] = 0x001E;
	crcdat[6] = 0x0014;
	crcdat[7] = 0x8011;
	crcdat[8] = 0x8033;
	crcdat[9] = 0x0036;
	crcdat[10] = 0x003C;
	crcdat[11] = 0x8039;
	crcdat[12] = 0x0028;
	crcdat[13] = 0x802D;
	crcdat[14] = 0x8027;
	crcdat[15] = 0x0022;

  	while(len-- != 0)
  	{
	    da = ((unsigned char)(crc/256))/16;      	// 暂存CRC的高四位
	    crc <<= 4;                   		// CRC右移4位,相当于取CRC的低12位
	    crc ^= crcdat[da^(*ptr/16)];
	    // CRC的高4位和本字节的前半字节相加后查表计算CRC,然后加上上一次CRC的余数

⌨️ 快捷键说明

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