⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpsall.c

📁 GPS接收机模块的解码,采用51系列单片机编程
💻 C
📖 第 1 页 / 共 3 页
字号:
		Datalcm = X;			/*命令输出到数据口 */
		Elcm = 1;_nop_();Elcm = 0;	/*读入到LCM*/
	}

/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态		*/
/********************************************************/
void lcdbusyL(void)
	{
        CS1LCM = 0;		/*CLR	CS1		*/
        CS2LCM = 0;		/*SETB	CS2		*/
       // CS3LCM = 1;		/*SETB	CS3		*/
	wtcom();		/* waitting for enable	*/
	}

void lcdbusyM(void)
	{
        CS1LCM = 1;		/*SETB	CS1		*/
        CS2LCM = 0;		/*CLR	CS2		*/
       // CS3LCM = 1;		/*SETB	CS3		*/
	wtcom();		/* waitting for enable	*/
	}

void lcdbusyR(void)
	{
        CS1LCM = 0;		/*SETB	CS1		*/
        CS2LCM = 1;		/*SETB	CS2		*/
       // CS3LCM = 0;		/*CLR	CS3		*/
	wtcom();		/* waitting for enable	*/
	}

void wtcom(void)
	{
	Dilcm = 0;		/*CLR	DI		*/
	Rwlcm = 1;		/*SETB	RW		*/
    Datalcm = 0xFF;		/*MOV	DATA_LCM,#0FFH  */
	Elcm  = 1;_nop_();		
    while(Datalcm & Lcdbusy);
      	Elcm  = 0;
	}

/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置	*/
/********************************************************/
void Locatexy(void)
	{
	unsigned char  x,y;
	switch (col&0xc0)		/*  col.and.0xC0	*/
		{			/*条件分支执行		*/
		case 0:		{lcdbusyL();break;}	/*左区	*/
		case 0x40:	{lcdbusyM();break;}	/*中区	*/
		case 0x80:	{lcdbusyR();break;}	/*右区	*/
		}
	x = col&0x3F|SETX;		/*  col.and.0x3f.or.setx	*/
	y = row&0x07|SETY;		/*  row.and.0x07.or.sety	*/
		wtcom();		/*  waitting for enable		*/
		Dilcm = 0;			/*CLR	DI	*/
		Rwlcm = 0;			/*CLR	RW	*/
		Datalcm = y;			/*MOV	P0,Y	*/
		Elcm = 1;_nop_();Elcm = 0;
		wtcom();		/*  waitting for enable		*/
		Dilcm = 0;			/*CLR	DI	*/
		Rwlcm = 0;			/*CLR	RW	*/
		Datalcm = x;			/*MOV	P0,X	*/
		Elcm = 1;_nop_();Elcm = 0;
	}

/********************************/
/*液晶屏初始化			*/
/********************************/

void Lcminit(void)
	{
		cbyte = DISPOFF;	/*关闭显示屏	*/
		WrcmdL(cbyte);
		WrcmdM(cbyte);
		WrcmdR(cbyte);
		cbyte = DISPON;		/*打开显示屏	*/
		WrcmdL(cbyte);
		WrcmdM(cbyte);
		WrcmdR(cbyte);
		cbyte = DISPFIRST;	/*定义显示起始行为零	*/
		WrcmdL(cbyte);
		WrcmdM(cbyte);
		WrcmdR(cbyte);
		Lcmcls();
		col=0;		/*清屏		*/
		row=0;
		Locatexy();
		L_RSET = 1;
	}
/********************************/
/* 延时				*/
/********************************/
void Delay(uchar MS)
	{
		uchar us,usn;
		while(MS!=0)
			{ usn = 4;
				while(usn!=0)
					{
						us=0xf0;
						while (us!=0){us--;};
						usn--;
					}
				MS--;
			}
	}
/****************************************
 ---------  延时函数 ,大约1MS.-----------
 ****************************************
void DELAY(uint z)
{
    uchar data l;
    while((z--)>0)
    {
       for(l=0;l<31;l++)    RestWatchdog();   //125 _nop_(); 
    }
}	*/

/**************************************************************
 ---------------键盘扫描程序,返回按下的键值代码----------------
 -- 有键按下返回键值代码,无键按下返回0,有键但没松开返回0XFF --
 **************************************************************/

uchar Key_Press(bit b) //按键扫描程序
 //b=0/没键按下跳出;b=1/等待按键
{
     uchar data i,key,j=1,d;
     //RetKey=0xff;
     key=0x3f;

A0:	 d=0xc0&P1;
	 P1=0x07|d;			//置三列为低,三行为高
     //P2=0;            // 查询有无按键按下   
     _nop_();
     _nop_();
     key=0x3f&P1;	   //屏蔽掉高两位
	 //key=P0;
     if(key==7 )
		{ 				 //  无键按下 
		   if(b==1)	goto A0;
KP:        RetKey=NoKeyPress; KeyStatus=Up;
           goto ENDKPONE;
     	}
     else
		{            
           for(d=0;d<250;d++)     RestWatchdog();   /*  254  */
           TR0=0;
           ET0=0;
           key=0x3f&P1;
           if(key==7)  goto KP;    /* 除去因抖动引起的错误按键信息  */
          	 		   
		   RetKey=ScanKey();    /*有键按下*/
	      }                
ENDKPONE:
     return(RetKey);
}

uchar   ScanKey(void)
{
      uchar data i,key,d,j=0,a[3]={0x37,0x2f,0x1f};
      //P1=0xf8;
      //key=P1;
           for(i=0;i<3;i++)
			{   d=0xc0&P1;		  // 扫描哪个按键按下
				P1=a[i]|d;	   	 // 列扫描
                key=7&P1;	  //屏蔽掉高五位
                if(key!=7)
					{
                      //j=i*3;   //j behalf column
                      for(i=0;i<3;i++)
						{  /*       行扫描   */                         
                           if(key%2==0) break;
                           key=key>>1;
                    	}
                    key=j+i*3;                 /*   按键的行列值之和  */
                	TranDataBy232(key);
					OpeningBeep(1);
					goto ENDKP1;
             	  }
		      j++;
		      RestWatchdog();
	     }
		
ENDKP1:  return(key);
}

void   RestWatchdog(void)
{
    _nop_();
    _nop_();
    _nop_();
}
/*======显示开机界面======================*/
void DispFirstmenu(void)
{
 	col=0;
	row=2;
	Putstr(STR1,10);	/*第二行字符输出,12字节	*/
	//Putstr(STR4,24);
	//col=0;
	//row=4;
	//Putstr(STR3,30);	/*第三行字符输出,24字节	*/
	col=0;
	row=6;
	Hzflag=1;
	Putstr(STR1,12);	/*第四行字符输出,12字节	*/
}
/*======显示主菜单======================*/
void DispMainmenu(void)
{
	Lcmcls();
	col=0;
	row=0;
	Putstr(STR2,24);     /*第一行字符输出,12字节	*/	
	col=0;
	row=2;
	Putstr(STR3,24);	/*第二行字符输出,12字节	*/
	col=0;
	row=4;
	Putstr(STR4,30);	/*第三行字符输出,24字节	*/
}
//======ready or return menu=========
void RdyorRetMenu(void)
{
    col=0;
	row=6;
	Putstr(STR7,24);     /*第四行字符输出,12字节	*/
}

//======显示单点测量界面=============
void DispPointMenu(void)
{
    col=0;
	row=0;
	Putstr(STR6,24);     /*第一行字符输出,12字节	*/
    RdyorRetMenu();

}
void PointMeasure(void)
{
	Lcmcls();
	DispPointMenu();
	RetKey=0xff;
	while(1)
	{
		FlashGreenled(1);
		Key_Press(0);
		if (RetKey==5)
			{
			 RecvToBuf();
			 col=2;
		  	 row=4;
			 Putstr(ComBuf,22);
			 RetKey=0xff;
			}
		if(RetKey==8)
		{RetKey=0xff; return;}
	}
}
//=====与OEM板通讯测试=============
void ComTest(void)
{
  Lcmcls();
  RdyorRetMenu();
  while(1)
	{
		FlashGreenled(1);
		Key_Press(0);
		if (RetKey==5)
			{
			 RecvToBuf();
			 col=0;
		  	 row=2;
			 if(uc0==Error)
			  Putstr(STR0,24);
			 else
			  Putstr(STR0,24);
			  RetKey=0xff;
			}
		if(RetKey==8)
		{RetKey=0xff; return;}
	}

}
void Mainmenu(void)
{
 	DispMainmenu();
	Putstr(STR5,24);	/*第四行字符输出,12字节	*/
	while(1)
	{
	 Lcmclsline(4);
	 Key_Press(0);
	 switch(RetKey){
         case Tab1:   			//Point Measurement
                PointMeasure();
				DispMainmenu();                                                                                                   
                break;
         case Tab2:   			//Length Measurement
                //LengthMeasure();
				DispMainmenu();  
                break;
         case Tab3:  			//Area Measurement
		        //AreaMeasure();
				DispMainmenu();
                break;
         case Tab4: 			 //Set
		        ComTest();
				DispMainmenu();
                break;
                   
         default: break;
					   
              }
	 col=0;
	 row=6;
	 Putstr(STR5,24);	/*第四行字符输出,12字节	*/
	}
}
/*****************************************************
 -------从串行端口发送一字节数据------
 *****************************************************/
void TranDataBy232(uchar d)
{
   SBUF=d;
   while(TI==0) RestWatchdog();
   TI=0;
}
/*****************************************************
 -------从串行端口接收一字节数据,并存入UC0变量中------
 *****************************************************/
void   RcvDataBy232(void)
{
    counter=0;
    do{
        counter++;
        RestWatchdog();
        if(counter>0x6ff)
        { 
			uc0=Error;
			goto rete1;}   // 1fff 
          RestWatchdog();
      }   while(RI==0);
    uc0=SBUF;
rete1:  RI=0;
}
/***********************************************************************
 -- 从机接收主机按如下命令格式发送来的信息,数据保存至UN.COMBUF缓冲区中:
 -- 包头(10):(1,$) + G(1) + P(1) + R(1) +M(1) +C(1)+, + 数据 +*(1) + Checksum(2)
 -- 数据(56):UTC(6)+,(1)+VorA(1)+,(1)+纬度(9)+,(1)+N(1)+,(1)+经度(10)+,(1)+E(1)+,(1)+其它(22);
 ***********************************************************************/
void RecvToBuf(void)
{
    uchar data i;
    uint  data pp,tempint;
    RcvDataBy232();
    if(uc0!=0x24)
		{  uc0=0xff;  goto ret1; }        /* 不是包头$ */
    RcvDataBy232();
	if(uc0!=0x47)
		{  uc0=0xff;  goto ret1; }        /* 识别G */
    RcvDataBy232();
	if(uc0!=0x50)
		{  uc0=0xff;  goto ret1; }        /* 识别P */
    RcvDataBy232();
	if(uc0!='R')
		{  uc0=0xff;  goto ret1; }        /* 识别R */
    RcvDataBy232();
	if(uc0!='M')
		{  uc0=0xff;  goto ret1; }        /* 识别M */
    RcvDataBy232();
	if(uc0!='C')
		{  uc0=0xff;  goto ret1; }        /* 识别C */
	for (i=0;i<8;i++)
		 RcvDataBy232();				 //接收UTC时间和2个,号
	//pp=0xaa;                          /* 清校验和 */
    RcvDataBy232();
    if(uc0!='A')
		{  uc0=0xff;  goto ret1; }  //接收拉收机状态标志位 A:有效定位V:无效   
	//pp=pp+uc0;
    RcvDataBy232(); //接收","
	//pp=pp+uc0;
    //RcvDataBy232(); pp=pp+uc0;
    //Slen=uc0;
    for(i=0;i<22;i++){		 //接收纬度和经度
        RcvDataBy232();
        ComBuf[i]=uc0;	  //将ASCII转换成DEC
	   //pp+=uc0;                  
    }

	RcvDataBy232();                   /*  接收校验和 */
    tempint=0;
    tempint=(uint)(uc0*256);
    RcvDataBy232();
    tempint=tempint+uc0;

    if(tempint==pp){                  /*  效验和相同 */
//        SBUF=OK;
        //TranDataBy232();
        //fini=1;
    }
    else{                             /*  如果接收效验和不相同,则回送失败信息给主机  */
        SBUF=Error;
       // TranDataBy232();
        //fini=0;
    }
ret1: _nop_();
}
/***********************************************************************
 -- 从机向主机发送数据,数据已存在UN.COMBUF缓冲区中:
 -- 包头(1,0xAA) + 命令(1) + 长度(1) + 数据 + Checksum(1)
 ***********************************************************************/
void SendBuf(uchar order,uchar len) 
{
  uchar data i;
  uint  data CheSum;
  ulong l=0;
  do{
        do{
            SBUF=0xaa;
            //TranDataBy232();
            RcvDataBy232();
        } while(uc0!=0xbb);     /*  等待主机回送准备好 0XBB  */
        SBUF=order;             /*  发送命令句柄  */
       // TranDataBy232();
        CheSum=order;           /*  初始化校验和  */
        SBUF=len;               /*  发送数据长度  */
        //TranDataBy232();
        CheSum+=len;
        for(i=0;i<len;i++){     /*  发送数据  */
//            SBUF=Un.ComBuf[i];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -