- #include"reg51.h"
- #include "stdio.h"
- #include "intrins.h"
- #include"System.h"
- #define FALSE 0
- #define TRUE 1
- sbit SCLK = P1^7;
- sbit MISO = P1^6;
- sbit MOSI = P1^5;
- sbit LCD_SH = P1^2;
- sbit LCD_CS = P1^1;
- #define LCD_SCLK SCLK
- #define LCD_MISO MISO
- #define LCD_MOSI MOSI
- #define LCD_16dot_mode 1
- #define LCD_12dot_mode 2
- #define LCD_DRAW_mode 3
- #define LCD_FD_DRAW_mode 4
- #define LCD_FD_DATA 1
- #define LCD_FD_ADDR 0
- #define LCD_FD_CMD 0
- //LCD命令及参数定义
- #define LCD_CMD_HEAD 0x80
- #define LCD_CMD_END 0x93
- #define LCD_16DOT_MODE_CMD 0x81
- #define LCD_12DOT_MODE_CMD 0x82
- #define LCD_DRAW_MODE_CMD 0X83
- #define LCD_FD_MODE_CMD 0x84
- #define LCD_SET_CONTRAST_CMD 0x85
- #define LCD_SET_BK_LCD_CMD 0x86
- #define LCD_CLR_CMD 0x88
- #define LCD_SLEEP_CMD 0x89
- #define LCD_Cursor_CMD 0x8B
- #define LCD_Hilight_CMD 0x8C
- #define LCD_BK_Light_Ctl_Cmd 0x8d
- #define LCD_ALL_Hilight 0
- #define LCD_TXT_Hilight 1
- #define LCD_DRAW_PIC_CMD 0x90
- //命令画图模式下的画图模式设置
- #define LCD_DRAW_WHOLE_PIC 0x01
- #define LCD_DRAW_SPECIAL_ICON 0x02
- #define LCD_DRAW_PROGRESS 0x03
- #define LCD_EXIT_SLEEP_STA 0x9F
- #define LCD_SET_NEW_POS_WORD 0x20
- #define LCD_SET_DEF_POS_WORD 0x00
- #define LCD_BK_ON 0x01
- #define LCD_BK_OFF 0x00
- #define LCD_START_ADC_CMD 0x87
- #define LCD_READ_CMD 0x00
- unsigned char idata temp_bu[20];
- unsigned char idata temp_buf[20];
- unsigned char idata gps_time1[12];
- unsigned char idata gps_mode[3];
- unsigned char idata gps_longitude[15];
- unsigned char idata gps_longitude_dir[3];
- unsigned char idata gps_latitude[15];
- unsigned char idata gps_latitude_dir[3];
- unsigned char idata gps_speed[8];
- unsigned char idata gps_speed_dir[8];
- unsigned char idata gps_time2[10];
- unsigned char gps_data_ok_flag;
- unsigned char idata gps_height[10];
- unsigned char rx_height_mode;
- unsigned char rx_height_count;
- #define MAX_RX_BUF 12
- unsigned char gps_rx_mode;
- unsigned char rx_pointer;
- unsigned char com_rx_buf[MAX_RX_BUF+1];
- void cal_position_disp_datalatitude(void);
- void cal_position_disp_datalongitude(void);
- void TR_LCD_SPI_BYTE_FD(unsigned char dat,mode);
- unsigned char TR_LCD_SPI_BYTE(unsigned char dat);
- void Change_lcd_mode(unsigned char LCD_mode);
- void LCD_Send_CMD_END(void);
- void SET_LCD_POS(unsigned char mode ,Y,X);
- void LCD_print_char(unsigned char Y,X,unsigned char *char_ptr,unsigned char End_flag);
- void LCD_print_Curr_char(unsigned char *char_ptr,unsigned char End_flag);
- void Send_LCD_string(unsigned char *char_ptr);
- void Draw_lcd_whole_PIC(unsigned char ST_PIC,END_PIC,time);
- void Draw_LCD_Specail_ICON(unsigned char mode,Y,X,height,width,unsigned char *data_ptr);
- void Draw_LCD_Srepress(unsigned char Y,X,mode,width,curr_POS);
- void Set_LCD_contrast(unsigned char CON_dat);
- void Set_LCD_BK(unsigned char BKL_dat);
- unsigned char Read_LCD_ADC(void);
- unsigned char Check_LCD_Busy(unsigned char mode);
- void Draw_LCD_Big_PIC(unsigned char Y,X,height,width,unsigned char *PIC_ptr);
- void LCD_Exit_FD_DRAW_MODE(unsigned char new_mode);
- void SET_LCD_SLEEP_MODE(void);
- unsigned char SET_LCD_Exit_SLEEP(void);
- void LCD_CLR_ALL(unsigned char At_once );
- void LCD_Open_Cursor(unsigned char Cursor_width);
- void LCD_Close_Cursor(void);
- void LCD_Open_hilight(unsigned char Hilight_mode);
- void LCD_Close_hilight(unsigned char Hilight_mode);
- void LCD_BK_Light_SET(unsigned char Light_MODE);
- void Init_LCD(void);
- void Init_GPS_module(void);
- unsigned char Cal_gas_data_to_disp(void);
- void rx_gps_data(unsigned char com_rx_byte);
- void delay_time(unsigned short t)
- {
- unsigned short n,m;
- for(n=0;n<t;n++)
- {
- for(m=0;m<1000;m++)
- {;}
- }
- }
- void main(void)
- {
- unsigned char i;
- Init_GPS_module();
- Init_LCD();
- EA=1;
- while(1)
- {
- LCD_BK_Light_SET(TRUE);
- Set_LCD_BK(1);
- LCD_Open_Cursor(1);
- LCD_Send_CMD_END();
- delay_time(20);
- LCD_Open_hilight(LCD_ALL_Hilight);
- LCD_Send_CMD_END();
- delay_time(500);
- LCD_CLR_ALL(TRUE);
- if(gps_data_ok_flag)
- {
- i=Cal_gas_data_to_disp();
- if(i==1)
- {
- LCD_print_char(0, 0, "该地时间为~", FALSE);
- LCD_Open_Cursor(0);
- LCD_print_Curr_char(gps_time1,TRUE);
- delay_time(200);
- LCD_Open_Cursor(1);
- LCD_print_char(1, 0, "该地经度为~", FALSE);
- LCD_Open_Cursor(0);
- LCD_print_Curr_char(temp_bu , TRUE);
- delay_time(200);
- LCD_Open_Cursor(0);
- LCD_print_char(3, 0, "该地纬度为~", FALSE);
- LCD_Open_Cursor(0);
- LCD_print_Curr_char(temp_buf ,TRUE);
- }
- }
- delay_time(20000);
- }
- }
- void Delay_3US(void)
- {
- unsigned char t;
- for(t=0;t<10;t++) //----
- {
- _nop_();
- }
- }
- #ifdef HARD_SPI
- unsigned char TR_LCD_SPI_BYTE(unsigned char dat)
- {
- while(!LCD_SH);
- LCD_CS=0;
- SPDAT=dat;
- while(!(SPSTAT&0x80));
- SPSTAT=0xc0;
- LCD_CS=1;
- return SPDAT;
- }
- #else
- unsigned char TR_LCD_SPI_BYTE(unsigned char dat)
- {
- unsigned char temp_data,i;
- while(!LCD_SH);
- LCD_SCLK=0;
- temp_data=dat;
- LCD_CS=0;
- MOSI=0;
- for(i=0;i<8;i++)
- {
- if(temp_data&0x80)
- LCD_MOSI=1;
- else
- LCD_MOSI=0;
- temp_data<<=1;
- LCD_SCLK=1;
- if(LCD_MISO)
- temp_data|=0x01;
- //_nop_();
- LCD_SCLK=0;
- //_nop_();
- }
- LCD_CS=1;
- return temp_data;
- }
- #endif
- void Change_lcd_mode(unsigned char LCD_mode)
- {
- unsigned char temp_data;
- if(LCD_mode)
- {
- if(LCD_mode<=LCD_FD_DRAW_mode)
- {
- temp_data=0x80+LCD_mode;
- TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
- TR_LCD_SPI_BYTE(temp_data);
- //LCD_Send_CMD_END();
- }
- }
- }
- void LCD_Send_CMD_END(void)
- {
- TR_LCD_SPI_BYTE(LCD_CMD_END);
- Delay_3US();
- Delay_3US();
- }
- void SET_LCD_POS(unsigned char mode ,Y,X)
- {
- unsigned char temp_data;
- TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
- if(mode)
- {
- temp_data=Y;
- temp_data&=0x0f;
- temp_data|=LCD_SET_NEW_POS_WORD;
- }
- else
- temp_data=LCD_SET_DEF_POS_WORD;
- TR_LCD_SPI_BYTE(temp_data);
- if(mode)
- TR_LCD_SPI_BYTE(X);
- }
- void LCD_print_char(unsigned char Y,X,unsigned char *char_ptr,unsigned char End_flag)
- {
- SET_LCD_POS(TRUE, Y, X);
- Send_LCD_string(char_ptr);
- if(End_flag)
- LCD_Send_CMD_END();
- }
- void LCD_print_Curr_char(unsigned char *char_ptr,unsigned char End_flag)
- {
- SET_LCD_POS(FALSE, 0, 0);
- Send_LCD_string(char_ptr);
- if(End_flag)
- LCD_Send_CMD_END();
- }
- void Send_LCD_string(unsigned char *char_ptr)
- {
- while(*char_ptr!='~')
- {
- TR_LCD_SPI_BYTE(*char_ptr);
- char_ptr++;
- }
- }
- void Set_LCD_BK(unsigned char BKL_dat)
- {
- TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
- TR_LCD_SPI_BYTE(LCD_SET_BK_LCD_CMD);
- TR_LCD_SPI_BYTE(BKL_dat);
- }
- void LCD_CLR_ALL(unsigned char At_once )
- {
- TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
- TR_LCD_SPI_BYTE(LCD_CLR_CMD);
- if(At_once)
- LCD_Send_CMD_END();
- }
- void LCD_Open_Cursor(unsigned char Cursor_width)
- {
- TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
- TR_LCD_SPI_BYTE(LCD_Cursor_CMD);
- TR_LCD_SPI_BYTE(0x01);
- TR_LCD_SPI_BYTE(Cursor_width);
- }
- void LCD_Open_hilight(unsigned char Hilight_mode)
- {
- TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
- TR_LCD_SPI_BYTE(LCD_Hilight_CMD);
- TR_LCD_SPI_BYTE(Hilight_mode);
- TR_LCD_SPI_BYTE(0x01);
- }
- void LCD_BK_Light_SET(unsigned char Light_MODE)
- {
- TR_LCD_SPI_BYTE(LCD_CMD_HEAD);
- TR_LCD_SPI_BYTE(LCD_BK_Light_Ctl_Cmd );
- TR_LCD_SPI_BYTE(Light_MODE);
- }
- void Init_LCD(void)
- {
- unsigned char i;
- for(i=0;i<250;i++)
- Delay_3US();
- LCD_SH=1;
- while(!LCD_SH);
- }
- void Init_GPS_module(void)
- {
- rx_pointer=0;
- gps_rx_mode=0;
- gps_data_ok_flag=0;
- RI=0;
- TI=0;
- SCON=0x40;
- PCON=0x00;
- TMOD=0x20;
- TH1=0xFD;
- TL1=0xFD;
- TR1=1;
- REN=1;
- ES=1;
- }
- void Uart_Isr(void) interrupt 4
- {
- if(RI)
- {
- rx_gps_data(SBUF);
- }
- if(TI)
- {
- ;
- }
- RI=0;
- TI=0;
- }
- void rx_gps_data(unsigned char com_rx_byte)
- {
- unsigned char i;
- if(com_rx_byte==')
- {
- gps_rx_mode=0;
- rx_pointer=0;
- for(i=0;i<5;i++)
- com_rx_buf[i]=0;
- }
- else
- {
- if(rx_pointer<MAX_RX_BUF)
- com_rx_buf[rx_pointer++]=com_rx_byte;
- }
- switch(gps_rx_mode)
- {
- case 0:
- if(com_rx_byte==',')
- {
- if((com_rx_buf[0]=='G')&&(com_rx_buf[1]=='P')&&(com_rx_buf[2]=='R')&&
- (com_rx_buf[3]=='M')&&(com_rx_buf[4]=='C'))
- {
- gps_rx_mode=1;
- }
- else if((com_rx_buf[0]=='G')&&(com_rx_buf[1]=='P')&&(com_rx_buf[2]=='G')&&
- (com_rx_buf[3]=='G')&&(com_rx_buf[4]=='A'))
- {
- rx_height_count=0;
- rx_height_mode=0;
- gps_rx_mode=12;
- }
- rx_pointer=0;
- }
- break;
- case 1:
- if(com_rx_byte==',')
- {
- for(i=0;i<rx_pointer;i++)
- {
- gps_time1[i]=com_rx_buf[i];
- }
- //gps_time1[i]='|';
- gps_rx_mode=2;
- rx_pointer=0;
- }
- break;
- case 2:
- if(com_rx_byte==',')
- {
- for(i=0;i<rx_pointer;i++)
- {
- gps_mode[i]=com_rx_buf[i];
- }
- //gps_mode[i]='|';
- gps_rx_mode=3;
- rx_pointer=0;
- }
- break;
- case 3:
- if(com_rx_byte==',')
- {
- for(i=0;i<rx_pointer;i++)
- {
- gps_latitude[i]=com_rx_buf[i];
- }
- //gps_longitude[i]='|';
- gps_rx_mode=4;
- rx_pointer=0;
- }
- break;
- case 4:
- if(com_rx_byte==',')
- {
- for(i=0;i<rx_pointer;i++)
- {
- gps_latitude_dir[i]=com_rx_buf[i];
- }
- //gps_longitude_dir[i]='|';
- gps_rx_mode=5;
- rx_pointer=0;
- }
- break;
- case 5:
- if(com_rx_byte==',')
- {
- for(i=0;i<rx_pointer;i++)
- {
- gps_longitude[i]=com_rx_buf[i];
- }
- //gps_latitude[i]='|';
- gps_rx_mode=6;
- rx_pointer=0;
- }
- break;
- case 6:
- if(com_rx_byte==',')
- {
- for(i=0;i<rx_pointer;i++)
- {
- gps_longitude_dir[i]=com_rx_buf[i];
- }
- //gps_latitude_dir[i]='|';
- gps_rx_mode=7;
- rx_pointer=0;
- }
- break;
- case 7:
- if(com_rx_byte==',')
- {
- for(i=0;i<rx_pointer;i++)
- {
- gps_speed[i]=com_rx_buf[i];
- }
- gps_rx_mode=8;
- rx_pointer=0;
- }
- break;
- case 8:
- if(com_rx_byte==',')
- {
- for(i=0;i<rx_pointer;i++)
- {
- gps_speed_dir[i]=com_rx_buf[i];
- }
- gps_rx_mode=9;
- rx_pointer=0;
- }
- break;
- case 9:
- if(com_rx_byte==',')
- {
- for(i=0;i<rx_pointer;i++)
- {
- gps_time2[i]=com_rx_buf[i];
- }
- gps_rx_mode=10;
- rx_pointer=0;
- }
- break;
- case 10:
- if(com_rx_byte==',')
- {
- gps_rx_mode=11;
- rx_pointer=0;
- }
- break;
- case 11:
- if(com_rx_byte==',')
- {
- gps_data_ok_flag=1;
- gps_rx_mode=0;
- rx_pointer=0;
- }
- break;
- case 12: //接收海拔高度数据
- if(com_rx_byte==',')
- {
- if(rx_height_mode==0)
- {
- rx_height_count++;
- if(rx_height_count==8)
- {
- rx_height_mode=1;
- rx_pointer=0;
- }
- }
- else
- {
- for(i=0;i<rx_pointer;i++)
- {
- gps_height[i]=com_rx_buf[i];
- }
- gps_rx_mode=0;
- rx_pointer=0;
- // rx_height_mode=1;
- // rx_pointer=0;
- }
- }
- break;
- default:
- gps_rx_mode=0;
- rx_pointer=0;
- break;
- }
- com_rx_byte=0xff;
- }
- unsigned char cal_data_len(unsigned char *str)
- {
- unsigned char i=0;
- while(*str!=',')
- {
- i++;
- str++;
- }
- *str='~';
- return i;
- }
- void Cal_gps_height(void)
- {
- unsigned char i;
- i= cal_data_len(gps_height);
- gps_height[i]='m';
- gps_height[i+1]='~';
- }
- void Cal_gps_time(void)
- {
- unsigned char hh;
- unsigned char i,temp_buff[10];
- if(cal_data_len(gps_time1)!=0)
- {
- hh=(gps_time1[0]-'0')*10+(gps_time1[1]-'0');
- hh+=8;
- if(hh>=24)
- hh-=24;
- temp_buff[0]=hh/10+'0';
- temp_buff[1]=hh%10+'0';
- temp_buff[2]=':';
- temp_buff[3]=gps_time1[2];
- temp_buff[4]=gps_time1[3];
- temp_buff[5]=':';
- temp_buff[6]=gps_time1[4];
- temp_buff[7]=gps_time1[5];
- temp_buff[8]='~';
- for(i=0;i<9;i++)
- gps_time1[i]=temp_buff[i];
- }
- }
- unsigned char Cal_gas_data_to_disp(void)
- {
- Cal_gps_height();
- Cal_gps_time();
- cal_position_disp_datalatitude();
- cal_position_disp_datalongitude();
- if(gps_mode[0]=='A')
- return 1;
- else
- return 0;
- }
- void cal_position_disp_datalatitude(void)
- {
- unsigned int hen;
- if(cal_data_len(gps_latitude)!=0)
- {
- hen=(gps_latitude[5]-'0')*1000+( gps_latitude[6]-'0')*100+( gps_latitude[7]-'0')*10+( gps_latitude[8]-'0');
- hen=hen*60;
- temp_buf[0]=gps_latitude_dir[0];
- temp_buf[1]=gps_latitude[0];
- temp_buf[2]=gps_latitude[1];
- temp_buf[3]='d';
- temp_buf[4]=gps_latitude[2];
- temp_buf[5]=gps_latitude[3];
- temp_buf[6]='m';
- temp_buf[7]=hen/100000+'0';
- temp_buf[8]=hen/10000%10+'0';
- temp_buf[9]='.';
- temp_buf[10]=hen%1000/100+'0';
- temp_buf[11]=hen%100/10+'0';
- temp_buf[12]=hen%10+'0';
- temp_buf[13]='s';
- temp_buf[14]='~';
- }
- }
- void cal_position_disp_datalongitude(void)
- {
- unsigned int hen;
- if(cal_data_len(gps_longitude)!=0)
- {
- hen=(gps_longitude[6]-'0')*1000+(gps_longitude[7]-'0')*100+(gps_longitude[8]-'0')*10+( gps_longitude [9]-'0');
- hen=hen*60;
- temp_bu[0]= gps_longitude_dir[0];
- temp_bu[1]= gps_longitude[0];
- temp_bu[2]= gps_longitude[1];
- temp_bu[3]= gps_longitude[2];
- temp_bu[4]='d';
- temp_bu[5]= gps_longitude[3];
- temp_bu[6]= gps_longitude[4];
- temp_bu[7]='m';
- temp_bu[8]=hen/100000+'0';
- temp_bu[9]=hen/10000%10+'0';
- temp_bu[10]='.';
- temp_bu[11]=hen%1000/100+'0';
- temp_bu[12]=hen%100/10+'0';
- temp_bu[13]=hen%10+'0';
- temp_bu[14]='s';
- temp_bu[15]='~';
- }
- }
复制代码 |