📄 gps.c
字号:
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 + -