基于C8051F040简易GPS导航仪的实现源程序
2012-06-02
标签: C8051F040 GPS

/*****************初始化LCD上的电子地图***********************/

void Draw_LCD()

{

point xdata aera_point[6]={{22,195},{40,195},{48,175},{48,127},{40,107},{22,107}};

point xdata aera_pool[6]={{84,275},{94,245},{94,226},{60,232},{54,240},{70,250}};

Clearlcd(0x03,0x11);//清屏

Clearlcd(219,0x01);

Fill_in(aera_point,6,107);//新食堂

Draw_line2(40,107,195,107);

Draw_rectangle(3,0,104,10,0xe3);//西南边

Draw_rectangle(110,0,231,10,0xe3);//东南边

Draw_rectangle(161,16,231,86,109);//新主楼

Draw_rectangle(110,16,155,86,109);//体育馆

Draw_rectangle(176,71,216,31,0xfe);//新主楼天井

Draw_rectangle(68,86,104,16,111);//篮球场

Draw_rectangle(65,86,20,16,111);//操场

Draw_rectangle(15,317,3,16,0xe3);// 西边

Draw_rectangle(55,76,30,26,12);//操场草坪

Draw_rectangle(145,162,231,92,109);//东南门区域

Draw_rectangle(110,162,141,92,109);//办公区

Draw_rectangle(110,290,231,164,30);//教学区

Draw_rectangle(50,210,104,92,244);//生活区

Draw_rectangle(20,216,104,290,16);//绿园

Draw_rectangle(20,296,104,317,0xe3);//西北边

Draw_rectangle(110,296,231,317,0xe3);//东北边

Fill_in(aera_pool,6,0x03);//荷花池

}

/********************单片机主程序********************/

void main(void)

{

int xdata flag=0;

point a,b;

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]=='

共 2 页   上一页12
可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号
) 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

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

{

j1=(i1+1)%num;

Draw_line(*(peak+i1),*(peak+j1),fill_color);

}

max_row=peak->x;

min_row=peak->x;

for(i1=0;i1

{

if((peak+i1)->x>max_row)

max_row=(peak+i1)->x;

if((peak+i1)->x

min_row=(peak+i1)->x;

}

for(i1=min_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

{

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

{

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

{

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

{

if(node_in[j5]==node_in[j5+1])

{

for(i5=j5;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

{

Draw_line2(i6,min(y1,y2),max(y1,y2),color);

}

}

共 2 页   上一页12
可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号