📄 basec8051f040easygpssrc.txt
字号:
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 + -