📄 main.c
字号:
{
rTCON &= ~0x1000;
}
/********************************************************************
Function name : Test_Stat
Description : 站点检测,距离判断
Return type : unsigned char
*********************************************************************/
unsigned char Test_Stat(void)
{
/*
*假设地球是一个标准球体,半径为R,并且假设东经为正,西经为负,北纬为正,南纬为负,
*因此A(x1,y1)B(x2,y2)两点的球面距离为
* R*arccos(cos(y2)*cos(y1)*cos(x2-x1)+sin(y2)*sin(y1))
*x1,y1,x2,y2都是弧度形式。 (x经度,y纬度)
*/
long double x1, y1, x2, y2,x3,y3;
unsigned char i=0,j=0;
while(Get_MsgHeader()==0)
{
printsentence(0,"GPS 信号检测中 ");
printsentence(2," 请稍等. ");
Delay(800);
printsentence(2," 请稍等 . ");
Delay(800);
printsentence(2," 请稍等 . ");
Delay(800);
printsentence(2," 请稍等 . ");
Delay(800);
printsentence(2," 请稍等 . ");
Delay(800);
printsentence(2," 请稍等 . ");
Delay(800);
printsentence(2," 请稍等 . ");
Delay(800);
printsentence(2," 请稍等 . ");
Delay(800);
printsentence(2," 请稍等. ");
Delay(800);
printsentence(2," 请稍等 ");
};
printsentence(0," Welcome ! ");
printsentence(2," GPS Bus System ");
DelayNS(20);
x1 = Chg_to_Radian(Lotd);
y1 = Chg_to_Radian(Latd);
TextDisplayInit();
printsentence(0,"今天是: ");
DisplayChar(1,0,date);
printsentence(2,"现在时间为: ");
DisplayChar(3,0,time);
DelayNS(25);
TextDisplayInit();
printsentence(0,"现在纬度为: ");
DisplayChar(1,0,pos1);
printsentence(2,"现在经度为: ");
DisplayChar(3,0,pos2);
DelayNS(25);
for ( k = 0; k < STAT_NUM; k++)
{
x2 = Chg_to_Radian(POS[k].longitude);
y2 = Chg_to_Radian(POS[k].latitude);
x3 = Chg_to_Radian(POS[k+1].longitude);
y3 = Chg_to_Radian(POS[k+1].latitude);
distance =( R * acos(cos(y2) * cos(y1) *cos(x2 - x1) + sin(y2) * sin(y1)));
distance1=( R * acos(cos(y3) * cos(y1) *cos(x3 - x1) + sin(y3) * sin(y1)));
if(distance<250)
{
xx=Change_String(Lotd);
yy=Change_String(Latd);
xxx=Change_String(POS[k].longitude);
yyy=Change_String(POS[k].latitude);
x_d=((xx-xxx)>0)?(xx-xxx):((xx-xxx)*(-1));
y_d=((yy-yyy)>0)?(yy-yyy):((yy-yyy)*(-1));
s=Compare_Float(x_d,y_d);
switch(s)
{
case 0:
distance=distance-160.0;
break;
case 1:
distance=distance-100.0;
break;
case 2:
distance=distance-80.0;
break;
case 3:
distance=distance-60.0;
break;
default:
break;
}
if(distance<30)
{
StopBeepPwm();
Start_Beep(50, 50);
return k;
}
else
return 5;
}
else if (distance>250.0&&distance<1000.0)
{
Start_Beep(30, 50);
return 3;
}
}
StopBeepPwm();
return 5; /* 没到站则返回255 */
}
/********************************************************************
Function name : __irq Key_Int
Description : 按键中断
Return type : void
*********************************************************************/
void __irq Key_Int(void)
{
which_int=rEXTINTPND;
rEXTINTPND=0xf; //clear EXTINTPND reg.
rI_ISPC=BIT_EINT4567; //clear pending_bit
switch(which_int)
{
case 1:
StopBeepPwm();
which_int=0;
break;
case 2:
StopBeepPwm();
which_int=0;
break;
case 4:
StopBeepPwm();
which_int=0;
break;
case 8:
StopBeepPwm();
which_int=0;
break;
}
}
/********************************************************************
Function name :Key_Init
Description :按键检测初始化
Return type :void
*********************************************************************/
void Key_Init(void)
{
rINTCON=0x5;
rINTMOD=0x0;
rEXTINT=0x0;
rPCONG=0xffff;
rPUPG=0x0;
pISR_EINT4567=(unsigned)Key_Int;
rINTMSK=~(BIT_GLOBAL|BIT_EINT4567);
}
/********************************************************************
Function name : Main
Description : 主函数
Return type : void
*********************************************************************/
void Main(void)
{
U8 which_key;
rSYSCFG=CACHECFG; // Using 8KB Cache//
Port_Init();
Uart_Init(0,4800);
LCDIni();
Uart_Select(1);
rPDATC&=~0x10;
rPCONG=0x00ff;
rPUPG=0x0;
TextDisplayInit();
displaypicture(0);
DelayNS(20);
TextDisplayInit();
printsentence(0," GPS 定位系统 ");
printsentence(1," ★★ ");
printsentence(2," ★★★★ ");
printsentence(3," ★★ ");
DelayNS(20);
Key_Init();
TextDisplayInit();
while(1)
{
if ((a = Test_Stat()) < STAT_NUM)
{
switch(a)
{
case 0:
TextDisplayInit();
printsentence(0,"the Station is: ");
printsentence(1,POS[k].name);
Start_Beep(50, 50);
DelayNS(20);
Start_Beep(50, 50);
TextDisplayInit();
Dis[0]=(int)distance1/1000+'0';
Dis[1]=(int)distance1%1000/100+'0';
Dis[2]=(int)distance1%1000%100/10+'0';
Dis[3]=(int)distance1%1000%100%10+'0';
Dis[4]='M';
Dis[5]='@';
printsentence(0,"Next Station ");
printsentence(1,POS[k+1].name);
printsentence(2,"Letf for: ");
DisplayChar(3,1,Dis);
DelayNS(20);
TextDisplayInit();
StopBeepPwm();
break;
case 1:
TextDisplayInit();
printsentence(0,"the Station is: ");
printsentence(1,POS[k].name);
Start_Beep(50, 50);
DelayNS(20);
Start_Beep(50, 50);
TextDisplayInit();
Dis[0]=(int)distance1/1000+'0';
Dis[1]=(int)distance1%1000/100+'0';
Dis[2]=(int)distance1%1000%100/10+'0';
Dis[3]=(int)distance1%1000%100%10+'0';
Dis[4]='M';
Dis[5]='@';
printsentence(0,"Next Station ");
printsentence(1,POS[k+1].name);
printsentence(2,"Left for: ");
DisplayChar(3,1,Dis);
DelayNS(20);
TextDisplayInit();
StopBeepPwm();
break;
case 2:
TextDisplayInit();
printsentence(0,"The Station is: ");
printsentence(1,POS[k].name);
Start_Beep(50, 50);
DelayNS(20);
Start_Beep(50, 50);
TextDisplayInit();
Dis[0]=(int)distance1/1000+'0';
Dis[1]=(int)distance1%1000/100+'0';
Dis[2]=(int)distance1%1000%100/10+'0';
Dis[3]=(int)distance1%1000%100%10+'0';
Dis[4]='M';
Dis[5]='@';
printsentence(0,"Next Station ");
printsentence(1,POS[k+1].name);
printsentence(2,"Left for: ");
DisplayChar(3,1,Dis);
DelayNS(20);
TextDisplayInit();
StopBeepPwm();
break;
case 3:
TextDisplayInit();
Dis[0]=(int)distance/1000+'0';
Dis[1]=(int)distance%1000/100+'0';
Dis[2]=(int)distance%1000%100/10+'0';
Dis[3]=(int)distance%1000%100%10+'0';
Dis[4]='M';
Dis[5]='@';
printsentence(0,"Next Station ");
printsentence(1,POS[k].name);
printsentence(2,"Left for: ");
DisplayChar(3,1,Dis);
DelayNS(20);
StopBeepPwm();
TextDisplayInit();
break;
default:TextDisplayInit();
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -