📄 main.c
字号:
/*==================================================================
GPS软件设计,外部设备为上海麦宏公司的GM-309GPS接收模块,以UART格式
进行数据传输,数据遵循MNEA-0183协议。本程序仅提取其中的$GPRMC,加以
处理,最后在液晶模块上显示出,时间、日期、经度和纬度四种参数。
程序还存在显示切换过程中,先前的显示无法清除,使得切换后出现混乱的数据
===================================================================*/
#include"SPCE061A.h"
#include"SPLC501User.h"
#include"jingwei.h"
unsigned int *ShowData[10]={encoding_0a,encoding_0b,encoding_0c,encoding_0d,encoding_0e,
encoding_0f,encoding_10,encoding_11,encoding_12,encoding_13};
char gpsdata[50]; //用于存放GPS数据
unsigned int i,flag=1,key=0,j;
char Recieve; //串行接收
void displaytime(); //显示时间
void displaydate(); //显示日期
void displayweidu(); //显示纬度
void displayjingdu(); //显示经度
void main()
{
*P_IOA_Dir=0xffff; //IOA0~IOA7初始化为输出
*P_IOA_Attrib=0xffff;
*P_IOA_Data=0x00;
*P_IOB_Dir=0xff7b; //IOB2、IOB7设为输入,IOB10设为输出
*P_IOB_Attrib=0x0;
*P_IOB_Data=0x0004; //外部中断1下拉接收
*P_UART_Command1=0x20; //Uart内部复位
*P_UART_Command1=0x00;
*P_UART_BaudScalarLow=0x00;
*P_UART_BaudScalarHigh=0x0a; //波特率设置为4800bps
*P_UART_Command1=0x80; //允许接收中断
*P_UART_Command2=0xC0;
*P_INT_Ctrl=C_IRQ3_EXT1; //打开外部中断1
LCD501_Init(0x00);
__asm("INT IRQ");
LCD501_ClrScreen(0);
while(1)
{
while(key==1)
{
displaytime(); //显示时间
*P_Watchdog_Clear=1;
displaydate();
*P_Watchdog_Clear=1;
}
while(key==0)
{
displayweidu(); //显示纬度
*P_Watchdog_Clear=1;
displayjingdu(); //显示经度
*P_Watchdog_Clear=1;
}
*P_Watchdog_Clear=1;
}
}
void IRQ3(void) __attribute__ ((ISR)); //外部中断
void IRQ3(void)
{
if(*P_INT_Ctrl&C_IRQ3_EXT1)
{
for(j=0;j<1000;j++)*P_Watchdog_Clear=1;//延时去抖
if(*P_INT_Ctrl&C_IRQ3_EXT1)
{
LCD501_ClrScreen(0);
key++;
if(key>1)key=0;
*P_INT_Clear=C_IRQ3_EXT1;
}
}
}
void IRQ7(void)__attribute__((ISR)); //中断接收
void IRQ7(void)
{
if((*P_UART_Command2&0x80)==0x80) //确认是接收中断
{
if(flag==1)
{
Recieve=*P_UART_Data; //接收数据
if(Recieve=='$')flag=2; //确认是GPS数据
}
if(flag==2) //确认是GPRMC格式
{
Recieve=*P_UART_Data;
if(Recieve=='C')flag=3;
}
if(flag==3)
{
Recieve=*P_UART_Data;
if((Recieve>0x2f)&&(Recieve<0x39))flag=4;//逗号
}
if(flag==4) //接收数据
{
*P_Watchdog_Clear=1;
gpsdata[i]=*P_UART_Data;
i++;
if(i==50)
{
flag=1;
i=0;
}
}
}
}
void displaytime()
{
unsigned int a,a1,a2;
a=(gpsdata[0]-0x30)*10+gpsdata[1]-0x30+8;
if(a>=24)a=a-24;
a1=a/10;
a2=a%10;
LCD501_Bitmap(30,4,(unsigned int *)encoding_03); //时
LCD501_Bitmap(48,4,(unsigned int *)encoding_04); //间
LCD501_Bitmap(5,16,(unsigned int *)ShowData[a1]);
LCD501_Bitmap(15,16,(unsigned int *)ShowData[a2]);
LCD501_Bitmap(25,16,(unsigned int *)encoding_09); //:
LCD501_Bitmap(37,16,(unsigned int *)ShowData[gpsdata[2]-0x30]);
LCD501_Bitmap(47,16,(unsigned int *)ShowData[gpsdata[3]-0x30]);
LCD501_Bitmap(57,16,(unsigned int *)encoding_09); //:
LCD501_Bitmap(69,16,(unsigned int *)ShowData[gpsdata[4]-0x30]);
LCD501_Bitmap(79,16,(unsigned int *)ShowData[gpsdata[5]-0x30]);
LCD501_PutString(96,16," ");
}
void displaydate()
{
LCD501_Bitmap(30,30,(unsigned int *)encoding_07); //日
LCD501_Bitmap(48,30,(unsigned int *)encoding_08); //期
LCD501_Bitmap(5,42,(unsigned int *)ShowData[gpsdata[43]-0x30]);
LCD501_Bitmap(15,42,(unsigned int *)ShowData[gpsdata[44]-0x30]);
LCD501_Bitmap(27,42,(unsigned int *)encoding_1b); //年
LCD501_Bitmap(39,42,(unsigned int *)ShowData[gpsdata[41]-0x30]);
LCD501_Bitmap(49,42,(unsigned int *)ShowData[gpsdata[42]-0x30]);
LCD501_Bitmap(61,42,(unsigned int *)encoding_1c); //月
LCD501_Bitmap(73,42,(unsigned int *)ShowData[gpsdata[39]-0x30]);
LCD501_Bitmap(83,42,(unsigned int *)ShowData[gpsdata[40]-0x30]);
LCD501_Bitmap(95,42,(unsigned int *)encoding_1d); //日
LCD501_PutString(108,42," ");
}
void displayweidu()
{
LCD501_Bitmap(30,4,(unsigned int *)encoding_02); //纬
LCD501_Bitmap(48,4,(unsigned int *)encoding_01); //度
LCD501_Bitmap(0,16,(unsigned int *)ShowData[gpsdata[12]-0x30]);
LCD501_Bitmap(10,16,(unsigned int *)ShowData[gpsdata[13]-0x30]);
LCD501_Bitmap(22,16,(unsigned int *)encoding_18); //“°”
LCD501_Bitmap(27,16,(unsigned int *)ShowData[gpsdata[14]-0x30]);
LCD501_Bitmap(37,16,(unsigned int *)ShowData[gpsdata[15]-0x30]);
LCD501_Bitmap(47,16,(unsigned int *)encoding_1a); //.
LCD501_Bitmap(53,16,(unsigned int *)ShowData[gpsdata[17]-0x30]);
LCD501_Bitmap(63,16,(unsigned int *)ShowData[gpsdata[18]-0x30]);
LCD501_Bitmap(73,16,(unsigned int *)ShowData[gpsdata[19]-0x30]);
LCD501_Bitmap(83,16,(unsigned int *)ShowData[gpsdata[20]-0x30]);
LCD501_Bitmap(93,16,(unsigned int *)encoding_19); //'
if(gpsdata[22]=='N')LCD501_Bitmap(108,16,(unsigned int *)encoding_14); //N
if(gpsdata[22]=='S')LCD501_Bitmap(108,16,(unsigned int *)encoding_15); //S
}
void displayjingdu()
{
LCD501_Bitmap(30,30,(unsigned int *)encoding_00); //经
LCD501_Bitmap(48,30,(unsigned int *)encoding_01); //度
LCD501_Bitmap(0,42,(unsigned int *)ShowData[gpsdata[24]-0x30]);
LCD501_Bitmap(10,42,(unsigned int *)ShowData[gpsdata[25]-0x30]);
LCD501_Bitmap(20,42,(unsigned int *)ShowData[gpsdata[26]-0x30]);
LCD501_Bitmap(30,42,(unsigned int *)encoding_18); //“°”
LCD501_Bitmap(35,42,(unsigned int *)ShowData[gpsdata[27]-0x30]);
LCD501_Bitmap(45,42,(unsigned int *)ShowData[gpsdata[28]-0x30]);
LCD501_Bitmap(55,42,(unsigned int *)encoding_1a); //.
LCD501_Bitmap(61,42,(unsigned int *)ShowData[gpsdata[30]-0x30]);
LCD501_Bitmap(71,42,(unsigned int *)ShowData[gpsdata[31]-0x30]);
LCD501_Bitmap(83,42,(unsigned int *)ShowData[gpsdata[32]-0x30]);
LCD501_Bitmap(93,42,(unsigned int *)ShowData[gpsdata[33]-0x30]);
LCD501_Bitmap(103,42,(unsigned int *)encoding_19); //.
if(gpsdata[35]=='E')LCD501_Bitmap(110,42,(unsigned int *)encoding_16);//E
if(gpsdata[35]=='W')LCD501_Bitmap(110,42,(unsigned int *)encoding_17);//W
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -