×
单片机 > 单片机程序设计 > 详情

单片机GPS定位LCD1602液晶显示经纬度海拔及时间日期实物制作

发布时间:2021-05-12 发布时间:
|

制作出来的实物图如下:

单片机源程序如下:

#include "main.h"

#include "LCD1602.h"

#include "GPS.h"


//定义变量

unsigned char KEY_NUM = 0;

bit Page = 0;

unsigned char xdata Display_GPGGA_Buffer[68];

unsigned char xdata Display_GPRMC_Buffer[68];

bit Flag_OV = 0;

bit Flag_Calc_GPGGA_OK = 0;

bit Flag_Calc_GPRMC_OK = 0;


//****************************************************

//主函数

//****************************************************

void main()

{

        unsigned char i = 0;

        Init_LCD1602();

        LCD1602_write_com(0x80);                                                //指针设置

        LCD1602_write_word("Welcome to use!");


        Delay_ms(1000);



        Uart_Init();


        while(1)

        {

                Scan_Key();

                if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'G' && RX_Buffer[6] == ',' && RX_Buffer[13] == '.')                        //确定是否收到"GPGGA"这一帧数据

                {

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

                        {

                                Display_GPGGA_Buffer[i] = RX_Buffer[i];        

                        }

                        Hour = (Display_GPGGA_Buffer[7]-0x30)*10+(Display_GPGGA_Buffer[8]-0x30)+8;                        //UTC时间转换到北京时间                UTC+8

                                                                                                                                                                                                //0x30为ASCII转换为数字

                        if( Hour >= 24)                                //溢出

                        {

                                Hour %= 24;                                //获取当前Hour

                                Flag_OV = 1;                        //日期进位

                        }

                        else

                        {

                                Flag_OV = 0;

                        }


                        Min_High = Display_GPGGA_Buffer[9];

                        Min_Low = Display_GPGGA_Buffer[10];

        

                        Sec_High = Display_GPGGA_Buffer[11];

                        Sec_Low = Display_GPGGA_Buffer[12];


                        Flag_Calc_GPGGA_OK = 1;

                }


                if(Page == 0 && Flag_Calc_GPGGA_OK == 1)

                {

                        LED1 = ~LED1;

                        Flag_Calc_GPGGA_OK = 0;

                        LCD1602_write_com(0x80);                        //设置指针

                        LCD1602_write_data(Hour/10+0x30);

                        LCD1602_write_data(Hour%10+0x30);


                        LCD1602_write_data(':');


                        LCD1602_write_data(Min_High);

                        LCD1602_write_data(Min_Low);


                        LCD1602_write_data(':');

        

                        LCD1602_write_data(Sec_High);

                        LCD1602_write_data(Sec_Low);


                        LCD1602_write_word("  ");

                        

                        LCD1602_write_data(Display_GPGGA_Buffer[54]);        

                        LCD1602_write_data(Display_GPGGA_Buffer[55]);        

                        LCD1602_write_data(Display_GPGGA_Buffer[56]);        

                        LCD1602_write_data(Display_GPGGA_Buffer[57]);

                        LCD1602_write_word("m");

        

                        LCD1602_write_com(0x80+0x40);                        //设置指针

                        

                        LCD1602_write_data(Display_GPGGA_Buffer[28]);                        //N 或者 S


                        LCD1602_write_data(Display_GPGGA_Buffer[17]);                        //纬度

                        LCD1602_write_data(Display_GPGGA_Buffer[18]);                        //纬度

                        LCD1602_write_data(0xdf);                                                                //度

                        LCD1602_write_data(Display_GPGGA_Buffer[19]);                        //纬度

                        LCD1602_write_data(Display_GPGGA_Buffer[20]);                        //纬度

                        LCD1602_write_word("'");                                                                //秒

                        

                        LCD1602_write_data(Display_GPGGA_Buffer[42]);                        //E 或者 W


LCD1602_write_data(Display_GPGGA_Buffer[30]);



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR单片机中RC电容触摸的感应原理解析