#include

#define uchar unsigned char

#define uint unsigned int

sbit duan=P2^6;

sbit wei=P2^7;

sbit A=P1^0;

sbit lcd_en=P2^7;

sbit lcd_rs=P2^6;

sbit lcd_rw=P2^5;

sbit lcd_psb=P3^2;

uchar a,b,c,d,i,flag,temp;

uchar table0[64];

void delay(uint z);

void write_com(uchar com);

void write_date(uchar date);

void init();

void main()

{

init();

write_com(0x90);

for(a=0;a<17;a++)//局部定义数组并写入液晶(局部定义极大的节省RAM)

{

uchar table[]="51黑单片机";

write_date(table[a]);

}

delay(5000);

write_com(0x01);//清屏

write_com(0x90);//局部定义数组并写入液晶

for(a=0;a<16;a++)

{

uchar table1[]="GPS 信号接收中";

write_date(table1[a]);

}

write_com(0x8b);//局部定义数组并写入液晶

for(a=0;a<10;a++)

{

uchar table2[]={"请稍后…………"};

write_date(table2[a]);

}

delay(6000);

ES=1;

while(1)

{

if(flag==1)

{

if(table0[4]=='M')//确定是否收到"GPGGA"这一帧数据

{

d++;

if((d>=0)&&(d<=15))//前15秒显示经纬度

{

//以下给液晶写经纬度内容

uchar table3[]="纬度:";

uchar table4[]="经度:";

if(d==1)

write_com(0x01);//显示之前清屏

write_com(0x80);

for(a=0;a<7;a++)

write_date(table3[a]);

write_com(0x88);

for(a=0;a<7;a++)

write_date(table4[a]);

write_com(0x92);

for(a=0;a<11;a++)

write_date(table0[a+18]);

write_com(0x9a);

for(a=0;a<12;a++)

write_date(table0[a+30]);

ES=1;

flag=0;

}

if((d>=16)&&(d<=30))//后15秒显示时间和高度

{

uchar temp1,temp2,shi_1,shi_2,i,j,k;

uchar code sj[]="0123456789";

uchar table5[]="时间:";

uchar table6[]="日期:";

uchar table7[]="年";

uchar table8[]="月";

uchar table9[]="日";

uchar GD[8];

a=0;

for(b=0;b<64;b++)//这里完成日期数据分离

{

if(table0[b]==',')

{

a++;

if(a==9)

{

for(c=0;c<6;c++)

{

GD[c]=table0[b+c+1];//将分离的日期内容写入高度数组

}

}

}

}

if(d==30)

d=0;

if(d==16)

write_com(0x01);//显示之前清屏

//以下给液晶写高度内容

write_com(0x80);

for(a=0;a<6;a++)

write_date(table5[a]);   //发送时间到12864上显示

write_com(0x88);

for(a=0;a<6;a++)

write_date(table6[a]);    //发送日期到12864上显示

write_com(0x98+2);

for(a=0;a<8;a++)

{

for(i=4;i<6;i++)

{

write_date(GD[i]);

}

write_com(0x9B);

for(i=0;i<2;i++)

{

write_date(table7[i]);

}

for(j=2;j<4;j++)

{

write_date(GD[j]);

}

write_com(0x9D);

for(j=0;j<2;j++)

{

write_date(table8[j]);

}

for(k=0;k<2;k++)

{

write_date(GD[k]);

}

write_com(0x9F);

for(k=0;k<8;k++)

{

write_date(table9[k]);

}

//                                                 if(GD[a]==',')

//                                                 {

//                                                        a=9;

//                                                        write_date('M');//无数据提前退出写入同时结尾补写单位'M'

//                                                 }

//                                                 else

//                                                        write_date(GD[a]);

}

switch(table0[7])//分离字符串

{

case '0':

temp1=0;

break;

case '1':

temp1=1;

break;

case '2':

temp1=2;

break;

}

switch(table0[8])//分离字符串

{

case '0':

temp2=0;

break;

case '1':

temp2=1;

break;

case '2':

temp2=2;

break;

case '3':

temp2=3;

break;

case '4':

temp2=4;

break;

case '5':

temp2=5;

break;

case '6':

temp2=6;

break;

case '7':

temp2=7;

break;

case '8':

temp2=8;

break;

case '9':

temp2=9;

break;

}

c=temp1*10+temp2;//时差转换(即转换为北京时间)

if(c>=16,c<=23)

{

shi_1=0;

shi_2=c-16;

}

if(c>=2,c<=15)

{

c+=8;

shi_1=c/10;

//shi_2=c;

shi_2=c%10;

}

if(c>=0,c<=1)

{

shi_1=0;

shi_2=c+8;

}

//以下给液晶写时间内容

write_com(0x90);

write_date(sj[shi_1]);

write_com(0x90+1);

write_date(sj[shi_2]);

write_com(0x90+2);

write_date(':');

write_com(0x90+3);

write_date(table0[9]);

write_com(0x90+4);

write_date(table0[10]);

write_com(0x90+5);

write_date(':');

write_com(0x90+6);

write_date(table0[11]);

write_com(0x90+7);

write_date(table0[12]);

ES=1;

flag=0;

}

}

else

ES=1;

flag=0;

}

}

}

void write_com(uchar com)//写指令函数

{

lcd_rs=0;

lcd_rw=0;

lcd_en=0;

P0=com;

delay(5);

lcd_en=1;

delay(5);

lcd_en=0;

}

void write_date(uchar date)//写数据函数

{

lcd_rs=1;

lcd_rw=0;

lcd_en=0;

P0=date;

delay(5);

lcd_en=1;

delay(5);

lcd_en=0;

}

void init()//初始化液晶、接收中断方式

{

duan=0;

wei=0;

i=0;

lcd_psb=1;

write_com(0x30);

delay(5);

write_com(0x0c);

delay(5);

write_com(0x01);

delay(5);

TMOD=0x20;

TH1=0xFD;

TL1=0xFD;

SM0=0;

SM1=1;

REN=1;

EA=1;

TR1=1;

}

void delay(uint z)//延时函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void ser()interrupt 4//串口中断、初次分离'特殊符号无法显示'开头的字符串,并写入接收数组

{

uchar ok=1;

RI=0;

temp=SBUF;

table0[i++]=temp;

SBUF=temp;

while(!TI);TI=0;

if(table0[0] == '特殊符号无法显示见附件' )//如果是此字符;马上接收数据

{

//               table0[i++]=temp;

if(i==64)

{

i=0;

flag=1;

ES=0;

A=0;

}

}

else

i=0;

}

更多推荐