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

📄 gps.c

📁 一个基于XMODEM协议的下载字库的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
0x00,0x07,0xFF,0xE0,0x18,0x00,0x00,0x7E,0x07,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0xFF,0xF0,0x0F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x03,0xFF,
0xFF,0xFE,0x7F,0xFF,0xFF,0xC1,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xF8,0x0F,0xE0,0x7F,
0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFE,0x00,0x3C,0x3C,0x00,0x7F,0xF8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x0E,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x07,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

INT8U  bdata SfrByte1;

sbit SB00 = SfrByte1 ^ 0;
sbit SB01 = SfrByte1 ^ 1;
sbit SB02 = SfrByte1 ^ 2;
sbit SB03 = SfrByte1 ^ 3;
sbit SB04 = SfrByte1 ^ 4;
sbit SB05 = SfrByte1 ^ 5;
sbit SB06 = SfrByte1 ^ 6;
sbit SB07 = SfrByte1 ^ 7;

static INT8U Data_WrBuff[128];
/*******************************************************************************
write0808
说  明:	在NX25P40 0x38000处开始写入0808的点阵字库
********************************************************************************/
void write0808(void)
{
	INT8U i, j;
	INT32U addr;
	INT8U code *data p1;

	p1 = AsciiCharArray;
	addr = 0x38000;
	for(i=0; i<9; i++)
	{
		for(j=0; j<128; j++)
		{
			Data_WrBuff[j]= *p1++;
		}
		SPI_Program(addr, 128, Data_WrBuff);
		addr += 128;
		delay_10ms();
	}
}
/*******************************************************************************
writebmp
说  明:	在NX25P40 0x38500处开始写入开机界面点阵
********************************************************************************/
void writebmp(void)
{
	INT8U i, j;
	INT32U addr;
	INT8U code *data p1;

	p1 = stp;
	addr = 0x38500;
	for(i=0; i<19; i++)
	{
		for(j=0; j<128; j++)
		{
			Data_WrBuff[j]= *p1++;
		}
		SPI_Program(addr, 128, Data_WrBuff);
		addr += 128;
		delay_10ms();
	}
}
/*******************************************************************************
writebmp
说  明:	在NX25P40 0x39000处开始写入0816点阵字库
********************************************************************************/
INT8U ConvertXAChar(INT8U da)
{
  SfrByte1 = da;	
  if(!(SB00 ^ SB07)); else { SB00 = ~SB00;SB07 = ~SB07;}
  if(!(SB01 ^ SB06)); else { SB01 = ~SB01;SB06 = ~SB06;}
  if(!(SB02 ^ SB05)); else { SB02 = ~SB02;SB05 = ~SB05;}
  if(!(SB03 ^ SB04)); else { SB03 = ~SB03;SB04 = ~SB04;}
  
  return(SfrByte1);
}

void write0816(void)
{
	INT8U i, j, ch;
	INT32U addr;
	INT8U code *data p1;

	p1 = 0x6000;
	addr = 0x39000;
	for(i=0; i<16; i++)
	{
		for(j=0; j<128; j++)
		{
			ch = *p1++;
			Data_WrBuff[j]= ConvertXAChar(ch);
		}
		SPI_Program(addr, 128, Data_WrBuff);
		addr += 128;
		delay_10ms();
	}
}

/*******************************************************************************
chUART_Process
说  明:	处理接收的数据,如果收到正确的数据返回0,如果重复收到上次的数据,返回1
			否则返回2
********************************************************************************/
unsigned char chUART_Process(void)
{
	unsigned char i;
	unsigned char *pchTemp;
	recUART rUART_Temp;
	unsigned char chRece_Count;
	
	chRece_Count = (unsigned char)nBlock_Count;
	EA=0;
	rUART_Temp = rUARTRece;
	EA=1;
	
	pchTemp = (unsigned char *)rUART_Temp.chBuff;
	if(pchTemp[0]+pchTemp[1] == 0xFF)
	{
		if(chRece_Count == pchTemp[0])		//接收到正确的块
		{
			pchTemp += 2;
			for(i=0; i<128; i++)
			{
				Data_WrBuff[i]= *pchTemp++;
			}		
			return 0;
		}
		else if(chRece_Count == pchTemp[0]+1)
			return 1;
		else
			return 2;
	}
	else
		return 2;
}
/*******************************************************************************
vUART_TimeOut_Nak
说  明:	准备完毕,请求开始传输,如果上面没有准备好,每隔5S请求一次
********************************************************************************/
void vUART_TimeOut_Nak(void)
{
	vSoftTimer_Run(UART_NAK, UART_ACK_TIME, vUART_TimeOut_Nak);	
	vGPS_SendChar(NAK);
}
/*******************************************************************************
vUART_TimeOut_Ack
说  明:	收到正确的数据后,启动本定时器,在设定的时间内没有收到下帧数据,
			再次发起请求
********************************************************************************/
void vUART_TimeOut_Ack(void)
{
	vSoftTimer_Run(UART_ACK, UART_ACK_TIME, vUART_TimeOut_Ack);	
	vGPS_SendChar(ACK);
}
/*******************************************************************************
vUART_Execute
说  明:	如果收到正确的数据,写入NX25P40,如果接收数据完毕,写入0808,0816,开机界面
********************************************************************************/
void vUART_Execute(void)
{
	INT8U i, chTemp;
	INT32U addr, j;

	if(chRece_Over == 0x01)	//接收完毕所有数据
	{
		vGPS_SendChar(ACK);
		delay_1sec();
		vGPS_SendChar(ACK);
		
		GraphStr0816(1,0, "WRITE0808",1,10);
		write0808();									//写入8×8点阵
		
		GraphStr0816(1,0, "WRITE0816",1,10);			//写入8×16点阵
		write0816();
		
		writebmp();										//写入开机界面

		chRece_Over = 2;								//写完NX25P40后,执行程序检查是否正确			
	}
	if(chBlock_Over == 0x01)	
	{
		EA = 0;
		chBlock_Over = 0;
		EA = 1;
		////////////////////////////////////////		
		if(nBlock_Count == 1)							//如果这是收到的第一帧数据,执行以下操作
		{
			GraphStr0816(1,0, "ERASE..",1,7);
			SPI_EraseBulk();				//擦除EPROM
			vSoftTimer_Stop(UART_NAK);		//如果收到数据了,说明传输开始了,此时
											//不需要在次申请传输开始。
		}
		///////////////////////////////////////
		vSoftTimer_Run(UART_ACK, UART_ACK_TIME, vUART_TimeOut_Ack);		//等待下一帧数据

		chTemp = chUART_Process();
		if(chTemp == 0x00)	
		{
			GraphStr0816(1,0, "WRITE..",1,7);		   

			//显示接收到的数据帧
			j = nBlock_Count;
			i = j/1000 + 0x30;
			GraphChar0816(3,1,i,1);
			i = j%1000/100 + 0x30;
			GraphChar0816(3,2,i,1);
			i = j%100/10 + 0x30;
			GraphChar0816(3,3,i,1);
			i = j%10 + 0x30;
			GraphChar0816(3,4,i,1);
			
			//写入数据
			addr = (INT32U)(nBlock_Count-1) * 128L;
			SPI_Program(addr, 128, Data_WrBuff);
			vGPS_SendChar(ACK);
			nBlock_Count++;														
		}
		else if(chTemp == 0x01)	
		{
			vGPS_SendChar(ACK);
		}
		else if(chTemp == 0x02)	
		{
			vGPS_SendChar(NAK);
		}
	}
}



⌨️ 快捷键说明

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