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

📄 basec8051f040easygpssrc.txt

📁 基于C8051F040简易GPS导航仪源代码,应用于嵌入系统中
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	a.x=107;
	a.y=0;
	b.x=107;
	b.y=320;
	
	config();//初始化
	EMI_ini();
	uart0_ini();
	t2_baud(baud_rate);
	para_clear();

    Draw_LCD(); //初始化LCD屏上的电子地图

		while(1)
	{	
		if(is_end==1) 
		  {
			GPS_div();
			GPS_out();
			GGA_deal();
			GPS_cau();
			is_end=0;
			para_clear();
		  }
    }

}

/********************串口中断服务子程序********************/
void COMM()	interrupt 4
{
	if(RI0==1)
	{
		GPS_buff[i]=SBUF0;        
		RI0=0;            
        if (GPS_buff[0]=='$') i++;//判断首位是否为$
		else para_clear();
		if ((GPS_buff[i-2]=='?') && (GPS_buff[i-1]=='/'))//判断是否为报尾,暂用?/代替0x0D 0x0A
		  { 
		     is_end=1;
			 length=i-1;
			 for (j=0;j<=length;j++) GPS_infor[j]=GPS_buff[j];//建立缓冲区
		  }
		if (i==100) i=0;//避免数组溢出
	}
}

/********************延时子程序********************/
void delay1ms(uint time){
	for (i=0;i<time;i++){
		for(j=0;j<1000;j++);
	}
}

/********************基本指令集清屏子程序********************/
void Clearlcd(uchar color,uchar ppage)
{
	uchar data k=0x00;
	clcd3=ppage;		/*设定显示页和操作页*/
	for(i=0;i<234;i++)
	{ 
		clcd1=i;		/*设定行地址*/
		clcd2=0x00;
		clcd2=0x00;		/*设定列地址*/
		for(j=0;j<80;j++)
		{
			dlcd=color;	/*写颜色数据*/
			dlcd=color;
			dlcd=color;
			dlcd=color;
		}
		k=k+0x01;
	}
}

/*******************画点子程序********************/
void Draw_point(uint x,uint y,uchar point_color)
{
	uchar high,low;

	high = (y&0xff00)>>8;
	low = y&0xff;

	clcd3=0x00;	//设定操作页和显示页	
	clcd1=x;	/*设定行地址*/
	clcd2=high;		/*设定列地址*/
	clcd2=low;
		
	dlcd=point_color;	/*写显示数据*/			
}

/************************画线子程序**************************/
void Draw_line(point point_a,point point_b,uchar line_color)
{
	int i=0,temp=0;
	int dis_row=0,dis_col=0;
	int min_row=0,min_col=0,max_row=0,max_col=0;

	max_row=max(point_a.x,point_b.x);/*行最大值*/
	min_row=min(point_a.x,point_b.x);/*行最小值*/

	max_col=max(point_a.y,point_b.y);/*列最大值*/
	min_col=min(point_a.y,point_b.y);/*列最小值*/

	if ((max_row-min_row)>(max_col-min_col))//横向距离大于纵向距离,以横向基准画线
	{
		if (max_col==min_col)			//要求线段为垂线
		{
			for(i=min_row;i<=max_row;i++)
				Draw_point(i,min_col,line_color);
		}
		else
		{
			for(i=min_row;i<=max_row;i++)
			{
				temp=(int)((float)((float)point_b.y-point_a.y)/(float)((float)point_b.x-point_a.x)*
									((float)i-point_a.x)+point_a.y);//两点法直线描述纵坐标计算公式
				Draw_point(i,temp,line_color);
			}
		}
	}
	else 								//纵向距离大于横向距离,以纵向基准画线
	{
		if (max_row==min_row)
		{
			for(i=min_col;i<=max_col;i++)	//要求线段为水平线
				Draw_point(min_row,i,line_color);
		}
		else
		{
			for(i=min_col;i<=max_col;i++)
			{
				temp=(int)((float)((float)point_b.x-point_a.x)/(float)((float)point_b.y-point_a.y)*
									((float)i-point_a.y)+point_a.x);//两点法直线描述横坐标计算公式
				Draw_point(temp,i,line_color);
			}
		}
	}
	
}

/*****************************************************************
** Function name:			Fill_in
**
** Descriptions:			填充一个多边行区域
**
** input parameters:		peak:多边形的顶点坐标,顶点坐标必须按顺序给出
							num:顶点个数
							fill_color:填充颜色
**
** Returned value:			none
**         
** Created by:				qin
** Created Date:			2006/12/12
******************************************************************/
void Fill_in(point *peak,int num,uchar fill_color)
{
	int i1=0,j1=0,node_num=0;
	int xdata max_row,min_row;

	for(i1=0;i1<num;i1++)
	{
		j1=(i1+1)%num;
		Draw_line(*(peak+i1),*(peak+j1),fill_color);
	}

	max_row=peak->x;
	min_row=peak->x;
	for(i1=0;i1<num;i1++)	//得到所有顶点中,行最大值,行最小值
	{
		if((peak+i1)->x>max_row)
			max_row=(peak+i1)->x;
		if((peak+i1)->x<min_row)
			min_row=(peak+i1)->x;
	}

	for(i1=min_row;i1<max_row;i1++)
	{
		node_num=node(peak,i1,num,fill_color);//行扫描填充,求得扫描线与轮廓外形的交点
		sort_data(data_col,node_num);		//交点按从小到大排序
		
		if((node_num%2)==1)
			node_num=drop_data(data_col,node_num);//交点为基数,去掉重复点
		
		for(j1=0;j1<node_num;j1=j1+2)
		{
			Draw_line2(i1,data_col[j1],data_col[j1+1],fill_color);//扫描区域水平线填充
		}		
	}
}

/*****************************************************************
** Function name:			node
**
** Descriptions:			求出扫描线与轮廓线的交点,交点值存放在全局变量data_col中
**
** input parameters:		peak:多边形顶点坐标
							row:扫描线的行值
							num:顶点的个数
							color:线段的颜色
**
** Returned value:			none
**         
** Created by:				qin
** Created Date:			2006/12/12
******************************************************************/
int node(point *peak,int row,int num,uchar color)
{
	int i2,j2,k=0;

	for(i2=0;i2<num;i2++)
	{
		j2=(i2+1)%num;
		if (((peak+j2)->x)!=((peak+i2)->x))
		{
			if((row>=min((peak+j2)->x,(peak+i2)->x))&&(row<=max((peak+j2)->x,(peak+i2)->x)))
			{
				data_col[k]=(int)((float)((float)(peak+j2)->y-(peak+i2)->y)/(float)((float)(peak+j2)->x-(peak+i2)->x)*
									((float)row-(peak+i2)->x)+(peak+i2)->y);
				k=k+1;
			}
		}
		else
		{
			if((peak+i2)->x==row)
				Draw_line(*(peak+i2),*(peak+j2),color);
		}
	}
	return k;
}

/*****************************************************************
** Function name:			sort_data
**
** Descriptions:			数组中值排序
**
** input parameters:		node_in:需要排序的数组指针
							num:数组中数据的个数
**
** Returned value:			none
**         
** Created by:				qin
** Created Date:			2006/12/12
******************************************************************/
void sort_data(int *node_in,int num)
{
	int temp,i3,j3;

	for(j3=num;j3>1;j3--)
	{
		for(i3=0;i3<j3-1;i3++)
		{
			if(node_in[i3]>node_in[i3+1])
			{
				temp=node_in[i3];
				node_in[i3]=node_in[i3+1];
				node_in[i3+1]=temp;
			}
		}
	}
}

/*****************************************************************
** Function name:			Draw_line2
**
** Descriptions:			画两点之间的水平线
**
** input parameters:		row:水平线所在的行
							col_s:起始列值
							col_f:结束列值
							color:线段的颜色
**
** Returned value:			none
**         
** Created by:				qin
** Created Date:			2006/12/12
******************************************************************/
void Draw_line2(uint row,uint col_s,uint col_f,uchar color)
{
	int i4=0;
	uchar high1,low1;

	high1 = (col_s&0xff00)>>8;
	low1 = col_s&0xff;

	clcd3=0x00;		
	clcd1=row;	/*设定行地址*/
	clcd2=high1;		/*设定列地址*/
	clcd2=low1;

	for(i4=col_s;i4<=col_f;i4++)		
	{
		dlcd=color;	/*写显示数据*/
	}		
}

/*****************************************************************
** Function name:			drop_data
**
** Descriptions:			去除重点
**
** input parameters:		node_in:需要去除重复点的数组指针
							num:数组中数据的个数
** Returned value:			去除重复点后节点的个数
**         
******************************************************************/
int drop_data(int *node_in,int num)
{
	int i5,j5,new_num=num;

	for(j5=0;j5<num;j5++)
	{
		if(node_in[j5]==node_in[j5+1])
		{
			for(i5=j5;i5<num-1;i5++)
				node_in[i5]=node_in[i5+1];
			num=num-1;
		}
	}
}

/******************************************************************
** Function name:			Draw_rectangle
**
** Descriptions:			画矩形子程序
**
** input parameters:		int x1,int y1,int x2,int y2 分别为矩形对角线两点坐标
**							
** Returned value:			去除重复点后节点的个数
**         
******************************************************************/
void Draw_rectangle(int x1,int y1,int x2,int y2,uchar color)
{
	int i6;
	int xdata max_x,min_x;

	max_x=max(x1,x2);
	min_x=min(x1,x2);

	for(i6=min_x;i6<max_x;i6++)
	{
		Draw_line2(i6,min(y1,y2),max(y1,y2),color);
	}
}


⌨️ 快捷键说明

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