📄 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)
{
uint32_t vtemp;
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 + -