?? main.c
字號:
/****************************************************
*名 稱: LCD *
*功 能: *
*備 注: 2011.1.9
貞明電子:http://shop58972409.taobao.com *
*****************************************************/
/**************** 頭文件調用&&宏定義 ****************/
#include "LPC11xx.h"
#include <string.h>
#include "GPIO.H"
#include "UART.h"
#define uchar unsigned char
#define uint unsigned int
#include "hx16.h"
#include "LCD.h"
/******************* 全局變量定義 *******************/
uint8_t array_status[8];
#define BUFSIZE 0x40
extern volatile uint32_t UARTCount; //定義串口發送緩沖大小
extern volatile uint8_t UARTBuffer[BUFSIZE]; //定義串口發送緩沖
//extern volatile uint8_t UARTRsv[UART_BUFSIZE];
volatile uint8_t ch;
uint8_t Header[5];
uint8_t Pass[5];
uint8_t dataflag; //數據有效標志
static struct DISPLAY
{
uint8_t Date[8]; //11-01-02
uint8_t a;
uint8_t Time[8]; //18:24:04
uint8_t b;
uint8_t Longitude[10]; //經度
uint8_t c;
uint8_t Latitude[10]; //緯度
uint8_t d;
uint8_t Speed[9];
uint8_t e;
}myGPS;
static struct GPS
{
uint8_t UTCtime[12]; //忽略小數點后的
uint8_t Status; //A or V
uint8_t Longitude[10]; //Longitude 緯度
uint8_t Latitude[10]; //Latitude 經度
uint8_t Jing;
uint8_t Speed[5]; //速度
uint8_t Dir[5]; //航向
uint8_t UTCdate[6]; //UTCdata
}GPRMC;
uint8_t cnt; //定義串口接收緩沖計數
/********************** 函數聲明 ********************/
void Delay1ms(uint32_t a);
void Inttochar(unsigned int num);
uint8_t UARTReceiveByte(void);
void UARTReceive(uint8_t *BufferPtr, uint32_t Length);
void GPSReceive(uint8_t *BufferPtr);
void itoa(int n, uint8_t *s);
void Timetr(void);
void Longitudetr(void);
void Latitudetr(void);
void Speedtr(void);
/********************** 主函數 **********************/
int main(void)
{
uint32_t i;
SystemInit(); //系統初始化,包括使能時鐘
UARTInit(9600); //初始化波特率為115200
LPC_UART->IER = IER_THRE | IER_RLS; // 設置中斷使能寄存器
// LPC_UART->IER = IER_THRE | IER_RLS | IER_RBR; // Re-enable RBR
GPIOInit(); //GPIO初始化,使能GPIO模塊時鐘
LPC_GPIO2->DIR=(1<<csx)|(1<<sclk)|(1<<sdata)|(1<<dc)|(1<<res); //LCD PIN OUT
GPIOSetDir(2,8,1); //設置P2.8為輸出,LED1
GPIOSetDir(2,9,1); //設置P2.9為輸出,LED2
GPIOSetDir(3,4,1); //設置P3.4為輸出,LED3
//調用頭文件中函數輸出方法
GPIOSetValue(PORT2,8,0); //設置P2.8輸出0,點亮LED1
GPIOSetValue(PORT2,9,0); //設置P2.9輸出0,點亮LED2
GPIOSetValue(PORT3,4,0); //設置P3.4輸出0,點亮LED3
Delay1ms(500);
//直接使用寄存器
LPC_GPIO2->DATA|=(((1<<8)|(1<<9))); //P2.8,P2.9輸出1,LED1,LED2滅
LPC_GPIO3->DATA|=(1<<4); //LED3滅
Delay1ms(500);
Reset1();
Delay1ms(1);
Reset0();
Delay1ms(1);
Reset1();
Delay1ms(1);
LDS183SleepIn();
LDS183SleepOut();
Delay1ms(10);
send_command(ALL_PIXELS_OFF);
Delay1ms(500);
send_command(ALL_PIXELS_ON);
Delay1ms(500);
Initial();
Delay1ms(500);
White();
Delay1ms(500);
//畫豎線
Yline(7,9,110,BLACK);
Yline(48,9,110,BLACK);
Yline(121,9,110,BLACK);
//畫橫線和漢字
Xline(7,9,114,BLACK);
writeString("日期",10,12,BLUE);
Xline(7,31,114,BLACK);
writeString("時間",10,34,BLUE);
Xline(7,53,114,BLACK);
writeString("緯度",10,56,BLUE);
Xline(7,75,114,BLACK);
writeString("經度",10,78,BLUE);
Xline(7,97,114,BLACK);
writeString("速度",10,100,BLUE);
Xline(7,119,114,BLACK);
while(1)
{
ch=UARTReceiveByte();
if(ch=='$')
{
for(i=0;i<5;i++)
{
ch=UARTReceiveByte();
Header[i]=ch;
}
ch=UARTReceiveByte(); //得到字符','
if(!strcmp(&Header[0],"GPRMC")) //判斷是否等于字符串GPRMC
{
GPSReceive(GPRMC.UTCtime);
UARTReceiveByte();
UARTReceiveByte();
GPSReceive(GPRMC.Longitude);
UARTReceiveByte();
UARTReceiveByte();
GPSReceive(GPRMC.Latitude);
UARTReceiveByte();
UARTReceiveByte();
GPSReceive(GPRMC.Speed);
GPSReceive(GPRMC.Dir);
GPSReceive(GPRMC.UTCdate);
/* UARTReceive(GPRMC.UTCtime,10);
UARTReceiveByte();
GPRMC.Status=UARTReceiveByte();
UARTReceiveByte();
UARTReceive(GPRMC.Longitude,9);
UARTReceiveByte();
UARTReceiveByte();
UARTReceiveByte();
UARTReceive(GPRMC.Latitude,10);
UARTReceiveByte();
UARTReceiveByte();
UARTReceiveByte();
UARTReceive(GPRMC.Speed,3);
UARTReceiveByte();
UARTReceiveByte();
UARTReceive(GPRMC.UTCdate,6); */
/* cnt=0; //設置緩沖計數為0
while((ch=UARTReceiveByte())!=',') //獲取時間,如果不等于','循環
{
GPRMC.UTCtime[cnt]=ch; //將接收字符放入時間緩沖
cnt++; //緩沖計數累加
if((cnt==2)|(cnt==5))
{
GPRMC.UTCtime[cnt]=':';
cnt++;
}
}
cnt=0;
while((ch=UARTReceiveByte())!=',') //獲取有效狀態
{
// GPRMC.Status=ch;
if(ch=='A') //數據有效
{
dataflag=1; //標志置1
GPIOSetValue(PORT2,8,0); //設置P2.8輸出0,點亮LED1
}
else //否則
{
dataflag=0; //標志清0
GPIOSetValue(PORT2,8,1); //設置P2.8輸出1,滅LED1
}
}
cnt=0;
while((ch=UARTReceiveByte())!=',') //獲取緯度
{
GPRMC.Longitude[cnt]=ch; //將接收字符放入緯度緩沖
cnt++; //緩沖計數累加
}
cnt=0;
while(UARTReceiveByte()!=','); //放棄數據
cnt=0;
while((ch=UARTReceiveByte())!=',') //獲取經度
{
GPRMC.Latitude[cnt]=ch; //將接收字符放入經度緩沖
cnt++; //緩沖計數累加
}
cnt=0;
while(UARTReceiveByte()!=','); //放棄數據
cnt=0;
while((ch=UARTReceiveByte())!=',') //獲取速度
{
GPRMC.Speed[cnt]=ch; //將接收字符放入速度緩沖
cnt++; //緩沖計數累加
}
cnt=0;
while((ch=UARTReceiveByte())!=',') //獲取日期
{
GPRMC.UTCdate[cnt]=ch; //將接收字符放入日期緩沖
cnt++; //緩沖計數累加
}
cnt=0;
while(UARTReceiveByte()!=','); //放棄數據
while(UARTReceiveByte()!=','); //放棄數據 */
Timetr();
Longitudetr();
Latitudetr();
Speedtr();
writeString(myGPS.Date,52,12,RED);
writeString(myGPS.Time,52,34,RED);
writeString(myGPS.Longitude,52,56,RED);
writeString(myGPS.Latitude,52,78,RED);
writeString(GPRMC.Speed,52,100,RED);
}
}
// */
}
}
/********************** 函數定義 ********************/
/****************************************************
*名 稱: 延時函數 *
*參 數: 延時時間 *
*備 注: 內聯函數 *
*****************************************************/
void Delay1ms(uint32_t a) //1ms延時函數
{
uint32_t i;
while( --a != 0){
for(i = 0; i<5500; i++);
}
}
void Inttochar(unsigned int num)
{
if (num<10)
{
array_status[0]=num+0x30;
array_status[1]=0x00;
return;
}
if (num<100)
{
array_status[0]=num/10+0x30;
array_status[1]=num%10+0x30;
array_status[2]=0x00;
return;
}
if (num<1000)
{
array_status[0]=num/100+0x30;
array_status[1]=num%100/10+0x30;
array_status[2]=num%10+0x30;
array_status[3]=0x00;
return;
}
if (num<10000)
{
array_status[0]=num/1000+0x30;
array_status[1]=num%1000/100+0x30;
array_status[2]=num%100/10+0x30;
array_status[3]=num%10+0x30;
array_status[4]=0x00;
return;
}
else
{
array_status[0]=num/10000+0x30;
array_status[1]=num%10000/1000+0x30;
array_status[2]=num%1000/100+0x30;
array_status[3]=num%100/10+0x30;
array_status[4]=num%10+0x30;
array_status[5]=0x00;
return;
}
}
/****************************************************
*名 稱: itoa *
*參 數: 整形數 *
*備 注: 將數值轉換為字符串 *
*****************************************************/
void itoa(int n, uint8_t *s)
{
char i;
int n1;
if (n<0)
{
n=-n;
*s++='-';
}
do
{
n1=n;
i=0;
while (1)
{
if (n1<=9)
{
*s++=n1+'0';
break;
}
n1=n1/10;
i++;
}
while (i)
{
i--;
n1=n1*10;
}
n-=n1;
}
while (n);
*s++=0;
}
void Timetr(void)
{
uint32_t vtemp;
vtemp=(GPRMC.UTCtime[0]-'0')*10+(GPRMC.UTCtime[1]-'0')+8;
if((vtemp>24)||(vtemp==24))
{
vtemp=vtemp-24;
GPRMC.UTCdate[1]+=1;
}
myGPS.Time[0]=vtemp/10+'0';
myGPS.Time[1]=vtemp%10+'0';
myGPS.Time[2]=':';
myGPS.Time[3]=GPRMC.UTCtime[2];
myGPS.Time[4]=GPRMC.UTCtime[3];
myGPS.Time[5]=':';
myGPS.Time[6]=GPRMC.UTCtime[4];
myGPS.Time[7]=GPRMC.UTCtime[5];
myGPS.Date[0]=GPRMC.UTCdate[0];
myGPS.Date[1]=GPRMC.UTCdate[1];
myGPS.Date[2]='-';
myGPS.Date[3]=GPRMC.UTCdate[2];
myGPS.Date[4]=GPRMC.UTCdate[3];
myGPS.Date[5]='-';
myGPS.Date[6]=GPRMC.UTCdate[4];
myGPS.Date[7]=GPRMC.UTCdate[5];
}
void Longitudetr(void)
{
uint32_t vtemp;
myGPS.Longitude[0]=GPRMC.Longitude[0];
myGPS.Longitude[1]=GPRMC.Longitude[1];
if(GPRMC.Longitude[4]=='.')
{
myGPS.Longitude[2]='.';
vtemp=((GPRMC.Longitude[2]-'0')*10+(GPRMC.Longitude[3]-'0'))*5/3;// *100/60
//轉換成60進制后取小數點后兩位
myGPS.Longitude[3]=vtemp/10+'0';
myGPS.Longitude[4]=vtemp%10+'0';
}
else
{
myGPS.Longitude[2]=GPRMC.Longitude[2];
myGPS.Longitude[3]='.';
vtemp=((GPRMC.Longitude[3]-'0')*10+(GPRMC.Longitude[4]-'0'))*5/3;// *100/60
//轉換成60進制后取小數點后兩位
myGPS.Longitude[4]=vtemp/10+'0';
myGPS.Longitude[5]=vtemp%10+'0';
}
}
void Latitudetr(void)
{
myGPS.Latitude[0]=GPRMC.Latitude[0];
myGPS.Latitude[1]=GPRMC.Latitude[1];
if(GPRMC.Latitude[4]=='.')
{
myGPS.Latitude[2]='.';
vtemp=((GPRMC.Latitude[2]-'0')*10+(GPRMC.Latitude[3]-'0'))*5/3;// *100/60
//轉換成60進制后取小數點后兩位
myGPS.Latitude[3]=vtemp/10+'0';
myGPS.Latitude[4]=vtemp%10+'0';
}
else
{
myGPS.Latitude[2]=GPRMC.Latitude[2];
myGPS.Latitude[3]='.';
vtemp=((GPRMC.Latitude[3]-'0')*10+(GPRMC.Latitude[4]-'0'))*5/3;// *100/60
//轉換成60進制后取小數點后兩位
myGPS.Latitude[4]=vtemp/10+'0';
myGPS.Latitude[5]=vtemp%10+'0';
}
}
void Speedtr(void)
{
uint32_t vtemp;
if(GPRMC.Speed[1]=='.')
{
vtemp=((GPRMC.Speed[0]-'0')*10+(GPRMC.Speed[2]-'0'))*1852; //海里單位轉換為km
itoa(vtemp,(uint8_t *)array_status);
myGPS.Speed[0]= array_status[0];
myGPS.Speed[1]= array_status[1];
myGPS.Speed[2]= '.';
myGPS.Speed[3]= array_status[2];
myGPS.Speed[4]= array_status[3];
myGPS.Speed[5]= array_status[4];
myGPS.Speed[6]= array_status[5];
}
if(GPRMC.Speed[2]=='.')
{
vtemp=((GPRMC.Speed[0]-'0')*100+(GPRMC.Speed[1]-'0')*10+(GPRMC.Speed[3]-'0'))*1852;
itoa(vtemp,(uint8_t *)array_status);
myGPS.Speed[0]= array_status[0];
myGPS.Speed[1]= array_status[1];
myGPS.Speed[2]= array_status[2];
myGPS.Speed[3]= '.';
myGPS.Speed[4]= array_status[3];
myGPS.Speed[5]= array_status[4];
myGPS.Speed[6]= array_status[5];
myGPS.Speed[7]= array_status[6];
}
}
// 接受字符函數
/*****************************************************************************
** Function name: UARTReceiveByte
**
** Descriptions: Receive a block of data to the UART 0 port based
** on the data Byte
**
** parameters: None
** Returned value: Byte
**
*****************************************************************************/
uint8_t UARTReceiveByte(void)
{
uint8_t rcvData;
while (!(LPC_UART->LSR & LSR_RDR))
{
; // 查詢數據是否接收完畢
}
rcvData = LPC_UART->RBR; // 接收數據
return (rcvData);
}
// 接收字符串函數
/*****************************************************************************
** Function name: UARTReceive
**
** Descriptions: Receive a block of data to the UART 0 port based
** on the data Length
**
** parameters: buffer pointer, and data length
** Returned value: Note
**
*****************************************************************************/
void UARTReceive(uint8_t *BufferPtr, uint32_t Length)
{
while (Length--)
{
*BufferPtr++ = UARTReceiveByte(); // 把數據放入緩沖
}
}
void GPSReceive(uint8_t *BufferPtr)
{
uint8_t chs;
while((chs=UARTReceiveByte())!=',')
{
*BufferPtr++ = chs; // 把數據放入緩沖
}
}
/****************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -