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

📄 chipsecond.c

📁 本程序为某企业的税控机固件程序.基于东芝TMP93CS41 16位单片机编写,符合国家标准.该程序已经经过多次长期调试.
💻 C
字号:
#include "560.h"
#pragma  section code tab5 0x80000

extern void _delay(void);
extern void _ICrd(void);


void Beepsd(unsigned int m)
{
	IOP3 |= 0x08;
	while(m != 0)
    	{
    		_delay();
    		m--;
    	}
	IOP3 &= 0xF7;
}

/*Flash的写*/
void W29c040wrsd(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;	/*检测写入完整否的计数变量*/

	Llv_counter = 0;
	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;
//		Flashrdsd(Llv_counter,write_data);
		p = (unsigned char *)Llv_counter;
		for(Liv_j = 0; Liv_j < 256; Liv_j++)
			write_data[Liv_j] = *(p + Liv_j);

		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;
		for (Liv_i = 0; Liv_i < 10; Liv_i++)
			_delay();
//		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++;
//		}
//		W29pwr(temp_adr, write_data);
		Liv_i = 256;
	}
	/*同一页面写*/
//	Flashrdsd(high_addr,write_data);
	p = (unsigned char *)high_addr;
	for(Liv_j = 0; Liv_j < 256; Liv_j++)
		write_data[Liv_j] = *(p + Liv_j);
	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;
	for (Liv_i = 0; Liv_i < 10; Liv_i++)
		_delay();
//	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++;
//	}
//	W29pwr(high_addr, write_data);
}

/*Flash写,数据缓冲区在serialdata中*/
void W29c040wrsd_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;	/*检测写入完整否的计数变量*/

	Llv_counter = 0;
	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;
//		Flashrdsd(Llv_counter,write_data);
		p = (unsigned char *)Llv_counter;
		for(Liv_j = 0; Liv_j < 256; Liv_j++)
			write_data[Liv_j] = *(p + Liv_j);

		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;
		for (Liv_i = 0; Liv_i < 10; Liv_i++)
			_delay();
//		while (Llv_counter < 0x7FFF)
//		{
//			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;
	}
	/*同一页面写*/
//	Flashrdsd(high_addr,write_data);
	p = (unsigned char *)high_addr;
	for(Liv_j = 0; Liv_j < 256; Liv_j++)
		write_data[Liv_j] = *(p + Liv_j);

	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;
	for (Liv_i = 0; Liv_i < 10; Liv_i++)
		_delay();
//	while (Llv_counter < 0x7FFF)
//	{
//		write_data[1] = *p;
//		write_data[1] &= 0x40;
//		if (write_data[0] == write_data[1])
//			break;
//		write_data[0] = write_data[1];
//		Llv_counter++;
//	}	
}

unsigned char Icrdsd(unsigned int padr,unsigned int badr,unsigned int size)
{
	union gyt2 abc;
	unsigned int i;

	abc.pr = padr;
	Buffer[0] = abc.str[0];
	Buffer[1] = abc.str[1];

	abc.pr = badr;
	Buffer[2] = abc.str[0];
	Buffer[3] = abc.str[1];

	abc.pr = size;
	Buffer[4] = abc.str[0];
	Buffer[5] = abc.str[1];

	_ICrd();

	for (i = 0; i < size; i++)
		rxd[i] = serialdata[i];
	/*效验过程*/
	abc.pr = padr;
	Buffer[0] = abc.str[0];
	Buffer[1] = abc.str[1];

	abc.pr = badr;
	Buffer[2] = abc.str[0];
	Buffer[3] = abc.str[1];

	abc.pr = size;
	Buffer[4] = abc.str[0];
	Buffer[5] = abc.str[1];

	_ICrd();
	for (i = 0; i < size; i++)
	{
		if(rxd[i] != serialdata[i])
			return ERROR;
	}
	return RIGHT;
}

void Updatemain(void)
{
	unsigned char *p;
	unsigned int page,padr,i,j;
	unsigned long adr,t;

	__DI();
	adr = 0x900;
//	page = (unsigned int)(adr/1024);
//	padr = (unsigned int)(adr%1024);
	page = 2;
	padr = 256;
	for(i=0;i<450;i++)	//写0x900-0x1A000的主程序
	{
		if (i%50 == 0x00)
			Beepsd(10);
		j = Icrdsd(page,padr,256);		//一次写256个字节
		if (j == ERROR)
			return;

		p = (unsigned char *)0x00;
		*(p + 0x5555) = 0xAA;
		*(p + 0x2AAA) = 0x55;
		*(p + 0x5555) = 0xA0;
		p = (unsigned char *)adr;
		for (j = 0; j < 256; j++)
			*(p+j) = serialdata[j];

		p = (unsigned char *)(adr&0xFF0000);
		t = 0;
		serialdata[0] = *p;
		serialdata[0] &= 0x40;
		while (t < 0x2FFFFF)
		{
			serialdata[1]=*p;
			serialdata[1] &= 0x40;
			if(serialdata[0] == serialdata[1])
				break;
			serialdata[0]=serialdata[1];
			t++;
		}

		padr += 256;
		adr += 256;
		if (padr > 1023)
		{
			padr = 0x00;
			page++;
		}
	}
	while(con)
	{
		Beepsd(10);
	}
}

unsigned char Icguanlinew(void)
{//读出管理卡(ssf1101)中的信息,并写到Flash中,编码单品: 23字节;条码单品:28字节
	unsigned char *p;
	unsigned int page,padr,i,j;
	unsigned long adr,t;
	union gyt2 abc;

	abc.str[0] = serialdata[3];	/*前面早就读出来了的*/
	abc.str[1] = serialdata[2];

	adr = taxreg;
	page = 0;
	padr = 0x100;
	for (i = 0; i < abc.pr; i++)
	{
		if (i%40 == 0)
			Beepsd(10);
		j = Icrdsd(page,padr,256);		//一次写256个字节
		if (j == ERROR)
			return ERROR;
		/**********************/
		p = (unsigned char *)0x00;
		*(p + 0x5555) = 0xAA;
		*(p + 0x2AAA) = 0x55;
		*(p + 0x5555) = 0xA0;
		p = (unsigned char *)adr;
		for (j = 0; j < 256; j++)
			*(p+j) = serialdata[j];

		p = (unsigned char *)(adr&0xff0000);
		t = 0;
		serialdata[0] = *p;
		serialdata[0] &= 0x40;
		while(t<0x2fffff)
		{
			serialdata[1] = *p;
			serialdata[1] &= 0x40;
			if(serialdata[0] == serialdata[1])
				break;
			serialdata[0] = serialdata[1];
			t++;
		}

		padr+=256;
		adr+=256;
		if(padr>1023)
		{
			padr = 0;
			page++;
		}
	}
	return RIGHT;
}

⌨️ 快捷键说明

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