main.c
来自「此程序实现无线信标定位」· C语言 代码 · 共 220 行
C
220 行
#include<AT89X51.H>
//#include<absacc.h>
//#include<string.h>
#include "gps.h"
//unsigned char data buf[30] _at_ 0x30; // 必须在这里定义才不会出错,估计是和作用域有关,不定义在这里,默认从R0开始
//而R0在运算是会时刻改变,导致改变数据
#define KEY P2_3
#define SW P2_4
#define PWD P3_5
unsigned char code start_menu1[]="Enter A:start";
unsigned char code start_menu2[]="NJU_DEE,by Z.QY";
unsigned char code search[]="searching...";
unsigned char code local[]="本地: ";
unsigned char code beacon[]="信标: ";
unsigned char code site[]="坐标";
unsigned char data local_lat[11]="2446.5211N";
unsigned char data local_lon[12]="12100.1536E";
unsigned char data beacon_lat[8];//="6.5212N";//="(244)6.5211N";
unsigned char data beacon_lon[8];//="0.1535E";//="(1210)0.1536E";
unsigned char data recieve[15];//="6.5211N0.1536E";//="(244)6.5211N(1210)0.1536E";
unsigned char code line_code[16][6] =
{
0xF0,0x00,0x00,0x00,0x00,0x00,
0x1E,0x00,0x00,0x00,0x00,0x00,
0x03,0xE0,0x00,0x00,0x00,0x00,
0x00,0x78,0x00,0x00,0x00,0x00,
0x00,0x0F,0x00,0x00,0x00,0x00,
0x00,0x01,0xE0,0x00,0x00,0x00,
0x00,0x00,0x3C,0x00,0x00,0x00,
0x00,0x00,0x07,0x80,0x00,0x00,
0x00,0x00,0x00,0xF0,0x00,0x00,
0x00,0x00,0x00,0x1E,0x00,0x00,
0x00,0x00,0x00,0x03,0xC0,0x00,
0x00,0x00,0x00,0x00,0x78,0x00,
0x00,0x00,0x00,0x00,0x0F,0x00,
0x00,0x00,0x00,0x00,0x01,0xE0,
0x00,0x00,0x00,0x00,0x00,0x3C,
0x00,0x00,0x00,0x00,0x00,0x0F,
};
void main()
{
unsigned char p = 0,time = 0,i,head,addr = 0,j = 0;
bit store_en = 1;
// sp=0x06 ;//编译器在把所有变量和缓冲区赋予地址后,自动把最后一个字节开始的地方,作为SP的开始位置,
//自己指定会使变量之间产生冲突,在这里,如果定位sp为0x60,latitude[]数组的后几位就会跟着程序改变
lcd_ini();
display(0x80,start_menu1);
display(0x90,start_menu2);
display(0x98,search);
keypress();
cls_cht();
while(j < 100)
{
SW = 0; //数据选择期控制端,0送本地坐标至RXD,1送信标坐标至RXD
// recv_data();
display(0x80,local);
display(0x83,local_lat);
display(0x90,local_lon);
SW = 1;
decode();
display(0x88,beacon);
send_i(0x8B);
for(head = 0; head < 10; head ++)
{
if(head < 3)
send_d(local_lat[head]);
else
send_d(beacon_lat[head - 3]);
}
send_i(0x98);
for(head = 0; head < 11; head ++)
{
if(head < 4)
send_d(local_lon[head]);
else
send_d(beacon_lon[head - 4]);
}
keypress();
// store
for(i = 0; i < 15; i ++)
{
if(recieve[i] == '?')
{
store_en = 0;
break;
}
}
if(store_en)
{
p = store(recieve,time);
time = p;
cls_cht();
draw();
keypress();
cls_grap();
cls_cht();
j ++;
}
}
}
void keypress(void)
{
while(KEY == 1) // control searching...
{}
while(KEY == 0)
KEY = 1;
}
void display(unsigned char address,unsigned char *string)
{
unsigned char data i = 0;
send_i(address);
do
{
send_d(*string);
string ++;
}
while(*string != '\0');
}
void plot(unsigned char data address,unsigned int ascII)
{
send_i(address);
send_d(ascII / 0x100);
send_d(ascII % 0x100);
}
/*
unsigned char data local_lat[11]="2446.5211N";
unsigned char data local_lon[12]="12100.1536E";
unsigned char data beacon_lat[8]="6.5212N";//="(244)6.5211N";
unsigned char data beacon_lon[8]="0.1537E";//="(1210)0.1536E";
*/
void draw(void)
{
unsigned char pos,i;
bit lat_site,lon_site;
for(i = 0;i < 8;i ++)
{
if(beacon_lat[i] > local_lat[i + 3])
{
lat_site = 1;
break;
}
else if(beacon_lat[i] < local_lat[i + 3])
{
lat_site = 0;
break;
}
}
for(i = 0;i < 8;i ++)
{
if(beacon_lon[i] > local_lon[i + 4])
{
lon_site = 1;
break;
}
else if(beacon_lon[i] < local_lon[i + 4])
{
lon_site = 0;
break;
}
}
if(lat_site == 1 && lon_site == 1)
pos = 1;
else if(lat_site == 1 && lon_site == 0)
pos = 2;
else if(lat_site == 0 && lon_site == 0)
pos = 3;
else
pos = 4;
switch (pos)
{
case 1: board_show(1,0x87,0x98,0x86,0x99,0x82,0x9A); break;
case 2: board_show(0,0x80,0x9F,0x81,0x9E,0x82,0x9A); break;
case 3: board_show(1,0x87,0x98,0x86,0x99,0x9A,0x82); break;
case 4: board_show(0,0x80,0x9F,0x81,0x9E,0x9A,0x82); break;
default: break;
}
}
void board_show(bit line_style,unsigned char b_target,unsigned char l_target,unsigned char r_arrow,
unsigned char l_arrow,unsigned char b_ch,unsigned char l_ch)
{
line(line_style);
plot(b_target,0xA9EF); // beacon '+'
plot(l_target,0xA9EF); // local '+'
plot(r_arrow,0xA1FA); // right arrow
plot(l_arrow,0xA1FB); // left arrow
display(b_ch,beacon);
display(l_ch,local);
display(0x84,site);
display(0x9C,site);
}
void cls_cht(void)
{
send_i(0x30);
send_i(0x01);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?