kenny880629 发表于 2011-5-24 18:17:55

我的370C模块正常,用12864液晶显示的程序问题,希望大侠帮帮忙看看

我的12864液晶是串行口自带字库,3根线就可以控制,GPS模块是在阿莫买的370C,在论坛上参考了很多大侠们写的程序,但就是不能在我的液晶上正常运行,希望大家帮忙看看,这是我在网上以及论坛上找的程序(液晶驱动没写上来):

(我用的12M的晶振)

//GPS数据存储数组
uchar jd={"-----.----"}; //经度
uchar jd_fx='-';                             //经度方向
uchar wd={"----.----"};       //纬度
uchar wd_fx='-';           //纬度方向
unsigned char time;      //时间
unsigned char date;      //日期
uchar state;            //定位状态

//串口中断需要的变量
uchar seg_count;      //逗号计数器
uchar dot_count;      //小数点计数器
uchar byte_count;      //位数计数器
uchar cmd_number;      //命令类型
uchar mode;                //0:结束模式,1:命令模式,2:数据模式
uchar buf_full=0;            //1:整句接收完成,相应数据有效。0:缓存数据无效。
uchar cmd;            //命令类型存储数组

//显示需要的变量
unsigned int dsp_count;      //刷新次数计数器
void sys_init(void)             //系统初始化
{
   
    SCON = 0x50;                      //SCON: mode 1, 8-bit UART, enable rcvr
    TMOD |= 0x21;                   //TMOD: timer 1, mode 2, 8-bit reload
    TH1 =0xf4;                      // TH1: reload value for 4800 baud @ 11.059MHz
    TR1 = 1;                         // TR1: timer 1 run
    PCON=0x00 ;
        LCD_Init();                                //LCD初始化
        FontSet_cn(0,1);                        //设置汉字字体大小和颜色
        FontSet(0,1);                           //设置字符字体大小和颜色
        PutString_cn(0x00,0x00,"GPS自动定位系统");
        SetBackLight(100);
        TimeDelay(500);                  【程序运行到这好像就没往下运行了,因为显示“GPS自动定位系统”几秒后就清屏什么都没有显示了,自己怀疑是串口接收中断函数哪里出错了,但研究了3天一直没找出来,我的GPS设置的是4800bps,所以单片机波特率也设置4800bps。希望大家帮忙看看我的初始化程序和中断接收程序,中断接收程序相信大家很熟悉,不是我自己写的,但自己研究了没有任何问题,但就是在液晶上不能按照程序所写的那样显示。】
    ClrScreen();
    IE|=0x90;                    //开总中断、串口中断

}


void uart(void) interrupt 4                                  //串口接收中断
{
    uchar tmp;
        //RI=0;
    if(RI)
            {
      tmp=SBUF;
      switch(tmp)
      {
            case '$':
                cmd_number=0;              //命令类型清空
                mode=1;                        //接收命令模式
                byte_count=0;              //接收位数清空
                break;
            case ',':
                seg_count++;              //逗号计数加1
                byte_count=0;
                break;
            case '*':
                switch(cmd_number)
                {
                case 1:
                                        buf_full|=0x01; //GPGGA
                                        break;
                                case 2:
                                        buf_full|=0x02; //GPGSV
                                        break;
                                case 3:
                                        buf_full|=0x04; //GPGSA
                                        break;
                                case 4:
                                        buf_full|=0x08; //GPRMC
                                        break;
                }
                mode=0;
                break;
         default:
                if(mode==1)
                        {
                  //命令种类判断
                  cmd=tmp;            //接收字符放入类型缓存
                  if(byte_count>=4)
                          {                //如果类型数据接收完毕,判断类型
                        if(cmd=='G')
                                {
                            if(cmd=='P')
                                    {
                              if(cmd=='R')
                                      {
                                    if(cmd=='M')
                                            {
                                        if(cmd=='C')
                                                {
                                          cmd_number=4;
                                          mode=2;
                                          seg_count=0;
                                          byte_count=0;
                                                }
                                            }
                           
                                      }
                              
                                     
                            }
                        }
                  }
                }
                else if(mode==2)
                        {
                  //接收数据处理
                  switch (cmd_number)
                  {
                        
                        case 4:                //类型3数据接收。GPRMC
                            switch(seg_count)
                            {
                              case 1:
                                    if(byte_count<6)
                                            {                //时间处理
                                        time=tmp;   
                                            }
                                      break;
                                                                case 2:                              //定位判断A or V
                                    if(byte_count<1)
                                            {
                                        state=tmp;
                                            }
                                                                case 3:                              //纬度处理
                                    if(byte_count<9)
                                            {
                                        wd=tmp;
                                            }
                                    break;
                                                                case 4:                              //纬度方向处理
                                    if(byte_count<1)
                                            {
                                        wd_fx=tmp;
                                            }
                                    break;
                                                                case 5:                              //经度处理
                                    if(byte_count<10)
                                            {
                                        jd=tmp;
                                            }
                                    break;
                                                                case 6:                              //经度方向处理
                                    if(byte_count<1)
                                            {
                                        jd_fx=tmp;
                                            }
                                    break;
                                                                case 9:                              //日期处理
                                    
                                   if(byte_count<6)
                                            {
                                     date=tmp;
                                            }        }
                            break;
                  }
                }
                byte_count++;      //接收数位加1
                break;
      }
    }
    //RI=0;
}

void main(void)
{
    uchar i;
    char Bhour;
    sys_init();
    while(1)
    {
         if(buf_full==0)                //无GPS信号时
      {
            dsp_count++;
            if(dsp_count>=65000)       //等待30秒无信号 显示
                    {
                ClrScreen();            //清屏
                PutString(0x00,0x00,"No GPS connect..");【如果没有GPS信号应该显示那串英文字符串,但我的液晶上什么也不显示,就只有背光亮着,所以下面的程序液晶也是更没能显示。希望大侠帮帮忙研究下。】
                while(buf_full==0);
                ClrScreen();   
                dsp_count=0;
                    }
      }
      else if(state=='V')                           //GPRMC语句
            {                                  //如果未定位
                                       ClrScreen();
                   PutString(0x10,0x00,"No Positioning");
                   //ClrScreen();                  
            }
            else
            {                            //如果已定位
                   if(jd_fx=='E')
                                  {
                                   PutString_cn(0x00,0x20,"东经");
                                  }
                                   else if(wd_fx=='W')
                                  {
                                   PutString_cn(0x00,0x20,"西经");         //第三行显示经度信息
                                  }
                   for(i=0;i<3;i++)
                   {
                   PutChar(0x20+(i*8),0x20,jd);
                   }
                   PutChar(0x38,0x20,'.');
                   for(i=3;i<10;i++)
                   {
                   PutChar(0x40+(i*8),0x20,jd);
                   }
                                   if(wd_fx=='N')
                                  {
                                   PutString_cn(0x00,0x30,"北纬");         //第四行显示纬度信息
                                  }
                                   else if(wd_fx=='S')
                                  {
                                   PutString_cn(0x00,0x30,"南纬");
                                  }
                   for(i=0;i<2;i++)
                   {
                   PutChar(0x30+(i*8),0x30,wd);
                   }            
                   PutChar(0x40,0x30,'.');
                   for(i=2;i<9;i++)
                   {
                   PutChar(0x50+(i*8),0x30,wd);
                   }
                   PutString_cn(0x00,0x00,"日期");      //日期2011-05-24
                   PutString_cn(0x30,0x00,"20");
                                   PutChar(0x40,0x00,date);
                                   PutChar(0x48,0x00,date);
                                   PutChar(0x50,0x00,'-');
                   PutChar(0x58,0x00,date);
                   PutChar(0x60,0x00,date);
                                   PutChar(0x68,0x00,'-');
                                   PutChar(0x70,0x00,date);
                                   PutChar(0x78,0x00,date);
                                  
                                   Bhour=((time-0x30)*10+time-0x30)+TIME_AREA;
                  if(Bhour>=24)
                  {
                        Bhour-=24;
                  }
                  else if(Bhour<0)
                  {
                        Bhour+=24;
                  }
                  PutString_cn(0x00,0x10,"时间");      
                  PutChar(0x20,0x10,Bhour/10+0x30);
                  PutChar(0x28,0x10,Bhour%10+0x30);
                  PutChar(0x30,0x10,':');
                  PutChar(0x38,0x10,time);
                  PutChar(0x40,0x10,time);
                  PutChar(0x48,0x10,':');
                  PutChar(0x50,0x10,time);
                  PutChar(0x58,0x10,time);

                }
                  
                  
            dsp_count=0;
         }
}







程序我自己又检查了遍,,改动了点地方,已经没什么大问题,,但最关键的是在我的液晶上显示一条条的波纹,内容什么都没有,,不知道这跟液晶有什么关系,,对液晶有什么要求,希望明白的回个贴。
页: [1]
查看完整版本: 我的370C模块正常,用12864液晶显示的程序问题,希望大侠帮帮忙看看