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

📄 main.c

📁 LPC1114_例程和教程
💻 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 + -