原创 GPS定位液晶显示器的设计

2008-12-5 17:51 3151 13 13 分类: MCU/ 嵌入式

          以前我的一个帖子介绍GPS+AT89S52+LCD1602显示,见下面链接内容 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


http://bbs.ednchina.com/showtopic.aspx?id=42543。很多网友问有没有c


本的,现在提供一个基于51系列 lcd128*64 显示的GPS接收机。


1.GPS模块


GPS模块选用常用的GARMIN GPS25-LPGPS-OEM板。b801c20c-a963-482b-9a28-216261802945.jpg


     图1.1


其管脚功能如下:


  引脚1: 串行口2数据的输出端。


  引脚2: 串行口2数据的输入端。


  引脚3: 秒脉冲输出端,精度为±1us


  引脚4:  串行口1数据的输出端。


 引脚5: 串行口1数据的输入端。


  引脚6: 掉电模式控制端。


  引脚7: 外部备用电源输入端。


  引脚8GND接地端。


  引脚9 Vin输入端


引脚10:电源输入端,与9脚相连。


引脚11:空脚NC


引脚12NMEA(美国海洋电子协会)0183Ver1.5格式语句输出端。


注意:


本人使用的是LVS版本的GARMIN25-LP型。串口是232电平。与


计算机连接的串口2无需电平转换。而与单片机连接的串口1要进行电平转换。


切记--(^_^)


点击看大图


                           图1.2


2. LCD128*64液晶


选用带字库的ST7920控制器的JHD<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />529M112864液晶作为显示器,采用串行接


口,简单方便。




管脚号


管脚名称


电平


管脚功能描述


 

1


VSS


0V


电源地


 

2


VCC


3.0+5V


电源正


 

3


V0


-


对比度(亮度)调整


 

4


RS(CS


H/L


RS=“H”,表示DB7——DB0为显示数据


 

RS=“L”,表示DB7——DB0为显示指令数据


 

5


R/W(SID)


H/L


R/W=“H”,E=“H”,数据被读到DB7——DB0


 

R/W=“L”,E=“H→L”, DB7——DB0的数据被写


 


IRDR


 

6


E(SCLK)


H/L


使能信号


 

7


DB0


H/L


三态数据线


 

8


DB1


H/L


三态数据线


 

9


DB2


H/L


三态数据线


 

10


DB3


H/L


三态数据线


 

11


DB4


H/L


三态数据线


 

12


DB5


H/L


三态数据线


 

13


DB6


H/L


三态数据线


 

14


DB7


H/L


三态数据线


 

15


PSB


H/L


H8位或4位并口方式,L:串口方式(见注释1


 

16


NC


-


空脚


 


 

17


/RESET


H/L


复位端,低电平有效(见注释2


 

18


VOUT


-


LCD驱动电压输出端


 

19


A


VDD


背光源正端(+5V)(见注释3


 

20


K


VSS


背光源负端(见注释3


 


*注释1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可


 

 


以将模块上的J8和“VCC”用焊锡短接。


 

 


*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端


 


悬空。  


 


*注释3:如背光和模块共用一个电源,可以将模块上的JAJK用焊锡短接。


 


3.电源


 

 


电源部分可以采用市电变压供电也可以采用7~9电源器供电。


 


 


部分程序:


 


1.串行口中断函数,用于语句'$GPGGA'判断和此语句的接收。



void serial() interrupt 4 using 2
{
 uchar pp;
 RI=0;      
 pp=SBUF;
 if(ENflag==1)    //串口接收完毕,可以用来显示,清标志位重新开始
    {
      disp_flag=1;
      serial_byte = 0;    
     }
 else if(DFflag==1)   //'$GPGGA'头判断完毕,开始接收$GPGGA,语句的数据
       {
               if(pp==42)   
                    ENflag="1";   //等待收到'*'结束接收
        else 
           {
             serial_buff[serial_counter]=pp; //没收到'*',继续接收,数据放入串口缓冲
             serial_counter++; 
           }        
       } 
 else if(Aflag==1)   //第六个为'A',判断第七个是不是','
        {
          if(pp==44)
               DFflag="1";   //第七个个是','开始接收$GPGGA,语句的数据
          else
               serial_byte = 0;     //不是',',清标志位
        }
 else if(G3flag==1)   //第五个为'G',判断第六个是不是'A'
        {
          if(pp==65)
               Aflag="1";   //第六个是'A'判断下一个是不是','
          else
               serial_byte = 0;     //不是'A',清标志位
         }
 else if(G2flag==1)   //第四个为'G',判断第五个是不是'G'
         {
           if(pp==71)
                G3flag=1;  //第五个是'G'判断下一个是不是'A'
           else
                serial_byte = 0;     //不是'G',清标志位
               }
 else if(Pflag==1)   //第三个为'P',判断第四个是不是'G'
         {
           if(pp==71)
                G2flag=1;  //第四个是'G'判断下一个是不是'G'
           else
                serial_byte = 0;     //不是'G',清标志位
                    }
 else if(G1flag==1)   //第二个为'G',判断第三个是不是'P'
          {
            if(pp==80)
                  Pflag="1";  //第三个是'P'判断下一个是不是'G'
            else
                  serial_byte = 0; //不是'P',清标志位
          }
  else if(Sflag==1)   //第一个为'$',判断第二个是不是'G'
          {
            if(pp==71)
                   G1flag=1;  //第二个是'G'判断下一个是不是'P'
            else
                   serial_byte = 0;  //不是'G',清标志位
          } 
  else if(pp==0x24)   //判断第一个是不是$
          {
      Sflag="1";   //第一个为$,判断下一个是不是G
      serial_counter=0;  //串行计数器清零
           }
}


 


2.LCD 写函数


 


void wr_lcd (uchar dat_comm,uchar content)
{
  uchar a,i,j;
  delay (50);
  a="content";
  cs="1";
  sclk="0";
  std="1";
  for(i=0;i<5;i++)
  {
    sclk="1";
    sclk="0";
  }
  std="0";
  sclk="1";
  sclk="0";
  if(dat_comm)
    std="1";   //data
  else
    std="0";   //command
  sclk="1";
  sclk="0";
  std="0";
  sclk="1";
  sclk="0";
  for(j=0;j<2;j++)
  {
    for(i=0;i<4;i++)
    {
      a="a"<<1;
      std="CY";
      sclk="1";
      sclk="0";
    }
    std="0";
    for(i=0;i<4;i++)
    {
      sclk="1";
      sclk="0";
    }
  }
}


 


 


---------------------------------zjw500 写于17:49.


 


 


 


 


 

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /2 下一条