?? main.c
字號:
#include "LCD_Library.h"
#include "nmea.h"
#include "mymath.h"
/**********************************************
* Function: RS232_Init(void)
* Input Variables: none
* Return Variables: None
* Usage: Init UART
**********************************************/
void RS232_Init()
{
SCON = 0x50; // UART工作于模式1, REN=1
TMOD = 0x20 ; // Timer1 工業于模式2
PCON |= 0x80; // SMOD1 = 1
TH1 = 0xF3; // 波特率9600 Bds at 24MHz
TL1 = 0xF3; // 波特率9600 Bds at 24MHz
ES = 1; // 串口中斷使能
TR1 = 1; // 啟動Timer1
}
#define BUFFER_LENGTH 2048
static unsigned char pRead = 0; // Buffer Writing Point
static unsigned char pWrite = 0; // Buffer Reading Point
volatile unsigned char LoopFlag = 0; // Buffer Reading Point
volatile unsigned char UpdateFlag = 0;
volatile unsigned char OverflowFlag = 0;
xdata char _Buffer[BUFFER_LENGTH];
/**********************************************
* Function: ReadBuffera(void)
* Input Variables: void
* Return Variables: unsigned char
* Usage: read a char from the Buffer
*********************************************/
unsigned char ReadBuffer()
{
unsigned char Buffer_value; // Buffer 值
Buffer_value = _Buffer[pRead]; // 從緩存區讀數
pRead++; // 指針向前移動
if(pRead == BUFFER_LENGTH) // 如果到緩存末尾
{
pRead = 0; // 循環指針
LoopFlag = 0; // 清除LoopFlag
}
if((pRead == pWrite) && (!LoopFlag)) // 如果數據讀取完畢
{
UpdateFlag = 0; // 清除更新標志
}
if(OverflowFlag) // 如果數據緩存溢出
{
OverflowFlag = 0; // 清除數據溢出標志
}
return Buffer_value; // 返回讀取值
}
/**********************************************
* Function: serial_IT
* Input Variables: void
* Return Variables: void
* Usage: UART Interrupt Service Routine
*********************************************/
void serial_IT(void) interrupt SIO_VECTOR
{
EA = 0; // 關中斷
if (RI == 1)
{ // 接收中斷
RI = 0; // 清除中斷標志
_Buffer[pWrite] = SBUF; // 將數據寫入緩存區
UpdateFlag = 1; // 置高數據更新標志
pWrite++;
if(pWrite == BUFFER_LENGTH)
{
pWrite = 0; // 循環緩存區
LoopFlag = 1; // 置高Loop標志
}
if((pWrite >= pRead) && (LoopFlag == 1))
{
OverflowFlag = 1; // 數據溢出標志置高
}
}
else
{
TI = 0; // 清除發送中斷標志
}
EA = 1; // 開中斷,準備下次接收
}
/**********************************************
* Function: void main(void)
* Input Variables: void
* Return Variables: void
* Usage: 主函數
*********************************************/
void main(void)
{
nmeaINFO info; // 定義NMEAInfo結構體變量
nmeaPARSER parser; // 定義NMEAParser變量
int size, it = 0;
nmeaPOS dpos; // 定義dpos
nmea_property()->trace_func = &LCD_PutStrSz; // 定義調試跟蹤函數
nmea_property()->error_func = &LCD_PutStrSz; // 定義錯誤顯示函數
nmea_zero_INFO(&info); // 初始化Info結構體
nmea_parser_init(&parser); // 初始化Parser
InitLCD(); // 初始化LCD
ClearLCD(); // LCD清屏
RS232_Init(); // 初始化UART
EA = 1; // 全局中斷使能
while(1)
{
LCD_Cursor2yx(1,0); // 指定LCD顯示坐標
while(pWrite<200); // 等待接收數據
size = pWrite - pRead; // 計算Buffer Size
nmea_parse(&parser, &_Buffer [0], size, &info); // 對Buffer進行解析
nmea_info2pos(&info, &dpos); // 獲得定位信息
LCD_Putstr("歡迎使用GPS定位"); // 顯示歡迎信息
LCD_Cursor2yx(2,0); // 指定LCD顯示坐標
LCD_mini_printf(
"%03d, Lat: %f, Lon: %f, Sig: %d, Fix: %d\n",
it++, dpos.lat, dpos.lon, info.sig, info.fix
); // 在LCD液晶屏上顯示定位數據
nmea_parser_destroy(&parser);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -