📄 perfect111.c
字号:
Next=False;
while(1)
{
if (Next==True) //如果再一次按下Next键,则跳出
break;
if (SpeedSelected==True) //如果按下确定键,则设置速度为High,并跳出
{
Thx[0]=0xe0;Tlx[0]=0xc0; //8ms
Thx[1]=0xe0;Tlx[1]=0xc0; //8ms
Thx[2]=0x63;Tlx[2]=0xc0; //40ms
Thx[3]=0xec;Tlx[3]=0x78; //5ms
Thx[4]=0xec;Tlx[4]=0x78; //5ms
SelectedSpeed=High;
break;
}
}
}
if (SpeedSelected==True) //按下了确定键,退出速度选择
{
IsSelectingSpeed=False;
break;
}
if (Next==True) //再一次按下了Next键,则循环速度选择
{
Next=False;
continue;
}
}
}
StartSelectModeAndSpeed=False; //标志模式选择和速度选择完毕
Delay(150); //防止按钮抖动产生毛刺电平
Running=True;
Delay(50);
WriteCmd(LCD_CLS);
/*------------------------- 显示所选择的模式和速度方案 -------------------------*/
if (SelectedMode==Line)
{
DisplayString(0x0,0," Choosen Mode is");
DisplayString(0x0,1," Line ");
Delay(150);
WriteCmd(LCD_CLS);
}
if (SelectedMode==Curve)
{
DisplayString(0x0,0," Choosen Mode is");
DisplayString(0x0,1," Curve ");
Delay(150);
WriteCmd(LCD_CLS);
}
if (AutoMode==1)
{
DisplayString(0x0,0," Choosen Mode is");
DisplayString(0x0,1," AutoMode ");
Delay(150);
WriteCmd(LCD_CLS);
}
if (SelectedMode==Line)
{
if (SelectedSpeed==Normal)
{
DisplayString(0x0,0,"Choosen Speed is");
DisplayString(0x0,1," Normal ");
Delay(150);
WriteCmd(LCD_CLS);
}
if (SelectedSpeed==Low)
{
DisplayString(0x0,0,"Choosen Speed is");
DisplayString(0x0,1," Low ");
Delay(150);
WriteCmd(LCD_CLS);
}
if (SelectedSpeed==High)
{
DisplayString(0x0,0,"Choosen Speed is");
DisplayString(0x0,1," High ");
Delay(150);
WriteCmd(LCD_CLS);
}
}
INTInit(); //初始化所有中断
/*----------------------------- 开始起跑 ------------------------------------*/
/*----------------------------- 倒计时3秒 -----------------------------------*/
DisplayString(0x0,0,"Left Times To Go");
while (ReadyToGo--)
{
DisplaySingleChar(0x7,1,ReadyToGo+0x30);
DisplaySingleChar(0x09,1,'s');
Delay(300);
}
WriteCmd(LCD_CLS);
DisplayString(0x05,0,"Go!!!");
Delay(100);
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Running... ");
DisplayString(0x0,1,"Designed by 3202");
if (SelectedMode==Line&&AutoMode!=1)
flag=Area0;
else
flag=1;
while(flag<5)
{
if(AutoMode==1) //自动型
{
switch(PassLineID)
{
case 0 :{
if(IsT0INT==1)
{P01=P02=P04=0;P03=1;}
else
{P01=P02=P03=P04=0;}
}break;
case 1 :{
P01=P02=P03=0;P04=1;
}break;
case 2 :{
P01=P02=P04=0;P03=1;
}break;
default :break;
}
}
else
{
if(SelectedMode==Line) //直线型
{ if(AutoMode==2)
{ flag=Area0;
if(IsT0INT==1)
{P03=1;P04=0;P01=P02=0;}
else
{P03=0;P04=0;P01=P02=0;}
if(IsT1INT==1)
{SurveyDistance=Distance-SurveyDistance;
if(Area0==2)
{if((SurveyDistance/0.5)>FirstAreaRate)
RateID=0;
else
RateID=1;
}
if(Area0==3)
{ if(SurveyDistance/0.5>SecondAreaRate)
RateID=0;
else
RateID=1;
}
if(Area0==4)
{if((SurveyDistance/0.5)>ThirdAreaRate)
RateID=0;
else
RateID=1;
}
SurveyDistance=Distance;
IsT1INT=0;
}
}
else
{
flag=Area0;
if(IsT0INT==1)
{P03=1;P04=0;P01=P02=0;}
else
{P03=0;P04=0;P01=P02=0;}
}
}
else
{ //S型
if((Nocurve<2)&&Round!=0&&(Back0>0)&&Back!=0)
{
if(Backid==1)
{P01=1;P02=0;P03=0;P04=1;}
else
{P01=0;P02=1;P03=0;P04=1;}
Back=1;
}
else
{
if(Round==0)
{
if(IsT0INT2==1)
{P01=0;P02=0;P03=1;P04=0;}
else
{P01=0;P02=0;P03=0;P04=0;}
}
else
{
EX1=1;
if(Round%2)
{
if(IsT0INT2==1)
{P01=1;P02=0;P03=1;P04=0;Backid=1;}
else
{P01=1;P02=0;P03=0;P04=0;}
}
else
{
if(IsT0INT2==1)
{P01=0;P02=1;P03=1;P04=0;Backid=0;}
else
{P01=0;P02=1;P03=0;P04=0;}
}
}
}
}
}
}
}
//补中断路程,加上最后一次中断缺失的路程
Speed=SpeedCount/4*CircleLength; //计算瞬时速度
Distance+=Speed; //计算距离
SpeedCount=0;
while(Area0<6&&SelectedMode==Line)
{ if(IsT0INT==1)
{P03=1;P04=0;P01=P02=0;}
else
{P03=0;P04=0;P01=P02=0;}
}
P04=1;P03=0;P01=P02=0;Delay(90);
P03=0;P04=0; //行程结束,小车停止
P31=1; //行程结束,背光开
ET0=0x0; //关T0中断
ET1=0x0; //关T1中断
EX1=0x01; //开INT1中断
Running=False;
AutoDisplay=True; //默认情况下直线模式会自动显示高低速区域经过的时间
WriteCmd(LCD_CLS);
/*--------------------------- 小车跑完,开始显示信息-------------------------------*\
说明: 小车跑完之后,如果之前选择的是Line模式或者AutoMode模式,LCD会自动循环显示第
一个低速区、高速区以及第二个低速区的通过时间,以检查是否满足设计要求。
在循环显示这三个信息时,只要你按一下确定键,LCD会进入菜单选择,在菜单选择里
你可以查看另外三个信息,即全程所花的时间CostTime,全程平均速度AVGSpeed以及
全程所走过的路程TotalDistance。
如果之前选择的是Curve模式,那么LCD会直接进入菜单选择让你查看CostTime、AVGS
-peed以及TotalDistance三个信息,而不会显示低速区和高速区的通过时间,因为在
Curve模式下是没有低速区和高速区的。
\*---------------------------------------------------------------------------------*/
/*------------------------ 显示低速区、高速区的通过时间 --------------------------*/
GoToChoosingDisplay=False;
if (SelectedMode==Line) //Line或者AutoMode模式下才显示
{
while(1)
{
if (GoToChoosingDisplay==True)
break;
WriteCmd(LCD_CLS);
DisplayString(0,0," LowSpeedArea1 ");
DisplayString(0,1," Costed ");
DisplaySingleChar(0x0C,1,'s');
LowSpeedArea1PassTime=LowSpeedArea1EndTime-LowSpeedArea1StartTime;
DisplaySingleChar(0x0A,1,LowSpeedArea1PassTime%10+0x30);
if (LowSpeedArea1PassTime > 9) //通过低速区的时间超过10s
DisplaySingleChar(0x0B,1,LowSpeedArea1PassTime/10+0x30);
Delay(400);
if (GoToChoosingDisplay==True)
break;
WriteCmd(LCD_CLS);
DisplayString(0,0," HighSpeedArea ");
DisplayString(0,1," Costed ");
DisplaySingleChar(0x0C,1,'s');
HighSpeedAreaPassTime=HighSpeedAreaEndTime-LowSpeedArea1EndTime;
DisplaySingleChar(0x0A,1,HighSpeedAreaPassTime%10+0x30);
if ( HighSpeedAreaPassTime> 9) //通过高速区的时间超过10s
DisplaySingleChar(0x0B,1,HighSpeedAreaPassTime/10+0x30);
Delay(400);
if (GoToChoosingDisplay==True)
break;
WriteCmd(LCD_CLS);
DisplayString(0,0," LowSpeedArea2 ");
DisplayString(0,1," Costed ");
DisplaySingleChar(0x0C,1,'s');
LowSpeedArea2PassTime=LowSpeedArea2EndTime-HighSpeedAreaEndTime;
DisplaySingleChar(0x0A,1,LowSpeedArea2PassTime%10+0x30);
if ( LowSpeedArea2PassTime> 9) //通过第二个低速区的时间超过10s
DisplaySingleChar(0x0B,1,LowSpeedArea2PassTime/10+0x30);
Delay(400);
}
}
AutoDisplay=False;
/*---------------- 菜单选择你想要看的内容--总时间、总路程以及平均速度 --------------*/
ChoosingDisplay=True;
WriteCmd(LCD_CLS);
SelectedShow=False; //防止之前中断对按钮的影响
SelectedReturn=False;
Selected=False;
Next=False;
while(1)
{
if (NextTimes>=3) //说明是按Next键到菜单选项尽头才返回的
{
NextTimes=0; //这样不显示主菜单的提示信息
Next=False; //修改过的
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Costed Time ");
DisplayString(0x0,1,"Next Show");
Delay(120); //检测按键抖动并消除
if (Next==True)
Next=False;
}
else
{
NextTimes=0;
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Now Choose what"); //首次显示主菜单或者是按返回键返回的
DisplayString(0x0,1," you want to see"); //这样就显示主菜单的提示信息
Delay(250);
if (SelectedShow==True) //检测按键抖动并消除
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
}
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Costed Time ");
DisplayString(0x0,1,"Next Show");
Delay(120);
}
/*------------------------------------第一次按键--------------------------------------*/
/*不断检测确定键和Next键*/
while(1)
{
if (Next==True)
break;
if (SelectedShow==True)
break;
}
/*按下了确定键,显示第一个选项的内容*/
if (SelectedShow==True)
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
WriteCmd(LCD_CLS);
DisplayString(0,0,"Costed Time is");
DisplayTime();
DisplayString(0x0A,1,"s");
ReturnSelection=True; //按下了确定键,那么这个时候开启返回键的功能
AVGSpeedShow=False;
Delay(120); //检测按键抖动并消除
if (SelectedShow==True)
{
SelectedShow=False;
SelectedReturn=False;
Selected=False;
}
}
/**按下了Next键,则显示第二个选项*/
if (Next==True) //按下Next键,显示AVGSpeed菜单项
{
NextTimes++;
Next=False;
WriteCmd(LCD_CLS);
DisplayString(0x0,0," AVGSpeed ");
DisplayString(0x0,1,"Next Show");
ReturnMain=False;
ReturnSelection=False; //按下了Next键,那么这个时候关闭返回键的功能
AVGSpeedShow=True; //表明AVGSpeed选项已经显示过了
Delay(120); //检测按键抖动并消除
if (Next==True)
Next=False;
}
/*------------------------------------第二次按键--------------------------------------*/
/*显示第一个选项的内容后又不断检测返回键(确定键)和Next键*/
while(1)
{
if (Next==True)
break;
if (Selected==True)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -