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

📄 picceeprom.c

📁 非常好的GPS数据接收程序
💻 C
📖 第 1 页 / 共 2 页
字号:
void interrupt HI_ISR(void)////高级中断服务。
{
	////////////////////////////////////////
	//USART 接收中断 接收GPS
	if(EEIE&&EEIF)
		{EEIF=0;EEIE=0;}
	if(RCIF&&RCIE) 
    {cont++;
        RCIF=0;
       if(len<6)   //先接收GPS信息的前端信息名称长度len=5
		 {
			temp=getch();
			if(temp&0x80) return;   //非ASCII码,接受出现错误,退出
			if(temp=='$')           //命令起始符'$'
		     {
				len=1;            //开始接受
				kind=0xFF;             //初始化命令种类
			  }
			else if(len>0)
			  {	
				Name[len-1]=temp;	
				len++;
			  }
			return;
		  }                            //end len if
		
		if(kind==0xFF)                 //还没有辨识信息种类
		{
			if(memcmp(Name,"GPGGA",5)==0) kind =0;
			else if(memcmp(Name,"PGRMF",5)==0) kind =3;
			else {len=0;}
			seg=1;
		}	                               //end kind if
		switch(kind)    //根据不同种类命令,分配到GPS结构体对象中
		{
		case 0:	getGPGGA();
			break;
		case 3: getPGRMF();
			break;
		default:len=0,seg=1;
		}	              //end swicth
	}                     //end RCIF if
 
}                         //end HI_IRS
///////////////////////////////////////////////////
//接收GPS命令GPGGA语句,
//典型语句 $GPGGA,133325,4544.6699,N,12637.6172,E,0,00,,,M,,M,,*5A
//    起始符 名称,时分秒 ,纬度     ,南北纬,   经度,东西经,GPS状态,正在使用卫星数,    
char getGPGGA(void)//读GPGGA命令语句。
 {
	uchar temp=0;
	temp=getch();
	if(temp&0x80) return -1;    //非ASCII码,接受出现错误,退出
	if (temp==',')              //分隔符','
	{
		switch(seg)             //不同段数
		{
			case 1:	pAdd=Time;
				break;
			case 2: pAdd=latitude;
				break;
			case 3: pAdd=NorS;
				break;
			case 4: pAdd=longitude;
				break;
			case 5: pAdd=EorW;
				break;
			case 6: pAdd=Status;
				break;
			case 7: pAdd=workNums;
				break;
			case 8: pAdd=HDOP;
				break;
			case 9: pAdd=Aultitude;
				break;
			case 10: pAdd=M1;
				break;
			case 11: pAdd=Heigth;
				break;
			case 12: pAdd=M2;
				break;
			case 13: pAdd=DifTime;
				break;
			case 14: pAdd=DifID;
				break;
				
			default:;
		}
		seg++;
		return 0;
	}
	else if(temp=='*')          //'*'结束符
	{
    	len=0;
		seg=2;
		flagGPS=1;	            //GPS信号1接收完毕	
        return 1;               //
	}
	else
	{
		*pAdd = temp;
		pAdd++;					//接收下一个。
	}
	return 0;                   
 }
 
 
char getPGRMF(void)
{
	uchar temp=0;
	temp=getch();
	if(temp&0x80) return -1;
	if (temp==',') 
	{
		switch(seg) 
		{
			case 1:	pAdd=NumWeeks;
				break;
			case 2: pAdd=NumSeconds;
				break;
			case 3: pAdd=Date;
				break;
			case 4: pAdd=Time;
				break;
			case 5: pAdd=GPSJunpSec;
				break;
			case 10: pAdd=Mode;
				break;
			case 11:pAdd=Status2;
				break;
			case 12: pAdd=Velocity;
				break;
			case 13: pAdd=Direction;
				break;
			case 14: pAdd=PDOP;
				break;
			case 15: pAdd=TDOP;
				break;
			default:;
		}
		seg++;
		return 0;
	}
	else if(temp=='*')
	{
    	len=0;
		flag_GPS2=1;	
		seg=1;
		return 1;
	}
	else
	{
		*pAdd = temp;
		pAdd++;
	}
	return 0;
}
unsigned long ReadEEPROM(char Addr)//读EEPROM并且将其转换成为浮点。
{
     uchar i;
    float b_1,b_2;
	unsigned long re_data_of_eeprom,a_1,a_2;
     for (i=0;i<=4;i++)
     {
       EEADR=Addr;
	   EEPGD=0;
	   RD=1;
       dist_read[i]=EEDATA;
       Addr++;
      }
re_data_of_eeprom=((unsigned long)(dist_read[4]))*100000000+
((unsigned long)(dist_read[3]))*1000000+((unsigned long)(dist_read[2]))*10000+
((unsigned long)(dist_read[1]))*100+((unsigned long)(dist_read[0]));
	b_1=(float)211234.5;
	a_1=(unsigned long)b_1;
	b_2=(float)a_1;
	a_2=(unsigned long)b_2;
	return re_data_of_eeprom; 
}
char WriteEEPROM(char Addr,uchar data)//写
{      EEADR=Addr;
       EEDATA=data;
	   EEIF=0; 	
	   EEIE=0;
	   EEPGD=0;
	   GIE=0;	
	   WREN=1;
	   EECON2=0x55;
	   EECON2=0xAA;
	   WR=1;
	   EEIE=1;
	   GIE=1;
		while(EEIE==1);
	   WREN=0;
	   EEIF=0;
    return 0; 
}
void display(void)//显示
{
				if(displayflag==2)
					{displaynum=length_display;//displayflag=2时显示单长,
					 mydisplay(displaynum);
					 RC0=LED_OFF;
					 RC1=LED_ON;}
				if(displayflag==0)
					{displaynum=all_length_display;//displayflag=0时显示总长
					 mydisplay(displaynum);
					 RC1=LED_OFF;
					 RC0=LED_ON;}
				if(displayflag==1)
				{displaynum=(long)(lat_2*10.0);
					displaynum=displaynum+10000*(lat1_flag-'0');
					mydisplay(displaynum);
					RC1=LED_ON;
					RC0=LED_ON;
				}
				if(displayflag==3)
				{	
					
					displaynum=(long)(lon_2*10.0);
				displaynum=displaynum+100000*(long_flag1-'0')+10000*(long_flag2-'0');
					mydisplay(displaynum);
					RC1=LED_OFF;
					RC0=LED_OFF;
				}
				if(displayflag==4)
				{
			displaynum=distanceofvelo_long/10+(unsigned long)(distanceofvelo/10.0);
					mydisplay(displaynum);
					RC1=!RC1;
				}
				
					
}
uchar led_case(uchar num)
{
	uchar led;
	switch(num)
	{
		case 0:
			{led=0x01;break;}
		case 1:
			{led=0x06;break;}
		case 2:
			{led=0x03;break;}
		case 3:
			{led=0x04;break;}
		case 4:
			{led=0x05;break;}
		default:
			{led=0x02;break;}
		
	}
	return led;
}
uchar N_case(uchar num)
{
	uchar disnum;
	switch (num)
		{case 0:
			{disnum=N_0;break;}
		 case 1:
		 	{disnum=N_1;break;}
		case 2:
			{disnum=N_2;break;}
		 case 3:
		 	{disnum=N_3;break;}
		case 4:
			{disnum=N_4;break;}
		 case 5:
		 	{disnum=N_5;break;}
		case 6:
			{disnum=N_6;break;}
		 case 7:
		 	{disnum=N_7;break;}
		case 8:
			{disnum=N_8;break;}
		 default:
		 	{disnum=N_9;break;}
	}
	return disnum;
}
void mydisplay(unsigned long num)
{
	uchar j,bitdata,zero_flag=0;
	uchar data;
	devide(num);
	for(j=0;j<=5;j++)
		{
			bitdata=displaybit[j];
			if(bitdata!=0||j>=4||zero_flag)
			{
			zero_flag=1;
			MAX_CS =LED_ON;
			SSPBUF=led_case(j);
			while(SSPIF==0);
			SSPIF=0;
			if(j==4)SSPBUF=N_case(bitdata)+0x20;
			else SSPBUF=N_case(bitdata);
			while(SSPIF==0);
			SSPIF=0;//是否传送完
    		MAX_CS =LED_OFF;
    		}
    		else 
    		{
	    	if(zero_flag==0&&j<4)
	    		{
	    		MAX_CS =LED_ON;
				SSPBUF=led_case(j);
				while(SSPIF==0);
				SSPIF=0;
				data=0x00;
				SSPBUF=data;
				while(SSPIF==0);
				SSPIF=0;//是否传送完
    			MAX_CS =LED_OFF;
    			}
    		}
			//Delay10TCYx(3);	//送数字给led个显示,显示data
		}
}
void change2long(void)//没用。
{
	length_display=(long)subdist;
	all_length_display=	(long)distance;
}
void devide(unsigned long num)//显示分开各位按十进制。
{
	displaybit[0]=num/100000;
	displaybit[1]=num%100000/10000;
	displaybit[2]=num%10000/1000;
	displaybit[3]=num%1000/100;
	displaybit[4]=num%100/10;
	displaybit[5]=num%10;
}

void mymode(void)//非译码模式
{		MAX_CS =LED_ON;
		SSPBUF=0x09;
		while(SSPIF==0);
		SSPIF=0;//是否传送完
		SSPBUF=0X00;
		while(SSPIF==0);
		SSPIF=0;//是否传送完
   		MAX_CS =LED_OFF;
}
void keyserve(void)
{	
	if(KEYUP&&KEYDOWN)
	   	{switch(KEY_NUM)
			{
				case KEY_UPDOWN:
				{
					if(displayflag==0)
					{all_length_display=0;
						distance=0;
						overflowdistance=0;
						scale=0;
						subdist_change_flag=1;break;
					}
				}
				case KEY_DOWN:
					{	
				if(displayflag==1){displayflag=0;break;}
				if(displayflag==0){displayflag=2;break;}
				if(displayflag==2){displayflag=3;break;}
				if(displayflag==3){displayflag=4;break;}
				if(displayflag==4){displayflag=1;break;}
			
					}		
				case KEY_UP:
					{	if(displayflag==2)
						{
						length_display=0;subdist=0;scale=0;
						subdist_change_flag=1;overflowsubdist=0;break;
						}
						if(displayflag==4)
						{
							distanceofvelo=0;
							distanceofvelo_long=0;
							subdist_change_flag=1;break;
						}
					}
				default:break;
			}
	KEYDOWN=0;	}
}
void test(void)//测试SPI和显示器,亮灭各两次。
{int var1;
	
	MAX_CS =LED_ON;//非测试状态正常。
			SSPBUF=0x0f;
			while(SSPIF==0);
			SSPIF=0;//是否传送完。
			SSPBUF=0x00;
			while(SSPIF==0);
			SSPIF=0;//是否传送完
    		MAX_CS =LED_OFF;
		for(var1=0;var1<=100;var1++);
		
			MAX_CS =LED_ON;//非关断方式正常状态。
			SSPBUF=0x0c;
			while(SSPIF==0);
			SSPIF=0;//是否传送完
			SSPBUF=0Xff;
			while(SSPIF==0);
			SSPIF=0;//是否传送完
    		MAX_CS =LED_OFF;
    	for(var1=0;var1<=100;var1++);
    	
    		MAX_CS =LED_ON;//译码方式。
		SSPBUF=0x09;
		while(SSPIF==0);
		SSPIF=0;//是否传送完
		SSPBUF=0X00;
		while(SSPIF==0);
		SSPIF=0;//是否传送完
   		MAX_CS =LED_OFF;
   		
   			MAX_CS =LED_ON;//六个显示,扫描范围。
			SSPBUF=0x0b;
			while(SSPIF==0);
			SSPIF=0;//是否传送完
			SSPBUF=0X05;
			while(SSPIF==0);
			SSPIF=0;//是否传送完
    		MAX_CS =LED_OFF;
		for(var1=0;var1<=100;var1++);
		
			MAX_CS =LED_ON;//亮度
			SSPBUF=0x0a;
			while(SSPIF==0);
			SSPIF=0;//是否传送完
			SSPBUF=0X08;
			while(SSPIF==0);
			SSPIF=0;//是否传送完
    		MAX_CS =LED_OFF;
		for(var1=0;var1<=100;var1++);
		
	
		

}

⌨️ 快捷键说明

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