flowchart TB
A([Start / Infinite Loop]) --> B{Check SS1 State}
B -- Off --> C[Turn BiLED OFF]
B -- On --> D{Has Pattern Started?}
D -- No --> E[Start Pattern]
D -- Yes --> F{Is Pattern Complete?}
F -- No --> G[Turn BiLED GREEN]
F -- Yes --> H[Turn BiLED RED]
C --> I{Any BMPx Pressed?}
I -- Yes --> J[Add Segment to Pattern]
J --> K[Toggle LEDFR/L States]
K --> L[Wait For All Buttons To Be Released]
L --> M{PB1 Pressed?}
I -- No --> M
M -- Yes --> N[Remove Last Segment]
N --> L[Wait For All Buttons To Be Released]
M -- No --> P{PB2 Pressed?}
P -- Yes --> Q[Delete Entire Pattern]
Q --> L[Wait For All Buttons To Be Released]
P -- No --> L
flowchart TB
A([Start / Infinite Loop]) --> B{Check SS1 State}
B -- Off --> C[Turn BiLED OFF]
B -- On --> D{Has Pattern Started?}
D -- No --> E[Start Pattern]
D -- Yes --> F{Is Pattern Complete?}
F -- No --> G[Turn BiLED GREEN]
F -- Yes --> H[Turn BiLED RED]
C --> I{Any BMPx Pressed?}
I -- Yes --> J[Add Segment to Pattern]
J --> K[Toggle LEDFR/L States]
K --> L[Wait For All Buttons To Be Released]
L --> M{PB1 Pressed?}
I -- No --> M
M -- Yes --> N[Remove Last Segment]
N --> L[Wait For All Buttons To Be Released]
M -- No --> P{PB2 Pressed?}
P -- Yes --> Q[Delete Entire Pattern]
Q --> L[Wait For All Buttons To Be Released]
P -- No --> L
voidcontrolSystem(void){// 用于跟踪序列是否当前正在运行(以便我们知道
// 它刚刚完成,或者根本没有开始等)
staticuint8_tpatternRunning=0;staticuint8_trunSeq=1;uint8_tss_state=GPIO_getInputPinValue(GPIO_PORT_P5,GPIO_PIN6);if(ss_state==GPIO_INPUT_PIN_HIGH){// 如果 SS1 打开
printf("SS1 is on\n\r");if(statusSequence()==100){// 如果序列完成或为空
uint8_tseqLength=getSequenceLength();if(seqLength==0){// 如果序列为空
patternRunning=1;printf("sequence is empty, won't start\n\r");}else{// 如果序列不为空
uint8_tseqCallback;if(runSeq==1){seqCallback=runSequence();runSeq=0;}if(seqCallback==0){// 如果序列启动成功
printf("sequence started OK\n\r");}elseif(seqCallback==1){// 如果序列为空
printf("sequence is empty\n\r");}elseif(seqCallback==2){// 如果 GPIO 错误
printf("fail to start sequence\n\r");}}}if(patternRunning){// 如果序列正在运行
if(statusSequence()==100){// 如果序列完成 => 将 BiLED 设置为红色
GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN0);GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN1);}else{// 如果序列正在运行 => 将 BiLED 设置为绿色
GPIO_setOutputHighOnPin(GPIO_PORT_P6,GPIO_PIN0);GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN1);}}}else{// 如果 SS1 关闭
patternRunning=0;// 将 BiLED 设置为关闭状态
GPIO_setOutputLowOnPin(GPIO_PORT_P6,GPIO_PIN0|GPIO_PIN1);// 静态切换变量,用于跟踪下次成功记录段时哪个前 LED 应该亮起
staticuint8_ttoggleLED=0;if(runSeq==0){runSeq=1;clearSequence();}// 单独检查每个碰撞按钮
if(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN0)==GPIO_INPUT_PIN_LOW){// 等待释放
while(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN0)==GPIO_INPUT_PIN_LOW){}__delay_cycles(240e3);// ~简单去抖延迟
// 记录请求的段
int8_trecStatus=recordSegment(2);// 右转90°
if(recStatus==0){printf("Turn right 90 added.\r\n");// 切换前 LED 状态
if(toggleLED==0){GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN5);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN0);toggleLED=1;printf("Left LED toggled.\r\n");}else{GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN0);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN5);toggleLED=0;printf("Right LED toggled.\r\n");}}elseif(recStatus==1){printf("ERROR: Sequence reached max length (50). Segment not added.\r\n");}elseif(recStatus==-1){printf("ERROR: mv value not recognized by recordSegment.\r\n");}}elseif(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN2)==GPIO_INPUT_PIN_LOW){// 等待释放
while(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN2)==GPIO_INPUT_PIN_LOW){}_delay_cycles(240e3);// ~简单去抖延迟
// 记录请求的段
int8_trecStatus=recordSegment(1);// 右转45°
if(recStatus==0){printf("Turn right 45 added.\r\n");// 切换前 LED 状态
if(toggleLED==0){GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN5);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN0);toggleLED=1;printf("Left LED toggled.\r\n");}else{GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN0);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN5);toggleLED=0;}}elseif(recStatus==1){printf("ERROR: Sequence reached max length (50). Segment not added.\r\n");}elseif(recStatus==-1){printf("ERROR: mv value not recognized by recordSegment.\r\n");}}elseif(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN3)==GPIO_INPUT_PIN_LOW){// 等待释放
while(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN3)==GPIO_INPUT_PIN_LOW){}__delay_cycles(240e3);// ~简单去抖延迟
// 记录请求的段
int8_trecStatus=recordSegment(0);// 前进
if(recStatus==0){printf("Drive forward added.\r\n");// 切换前 LED 状态
if(toggleLED==0){GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN5);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN0);toggleLED=1;printf("Left LED toggled.\r\n");}else{GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN0);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN5);toggleLED=0;}}elseif(recStatus==1){printf("ERROR: Sequence reached max length (50). Segment not added.\r\n");}elseif(recStatus==-1){printf("ERROR: mv value not recognized by recordSegment.\r\n");}}elseif(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN5)==GPIO_INPUT_PIN_LOW){// 等待释放
while(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN5)==GPIO_INPUT_PIN_LOW){}__delay_cycles(240e3);// ~简单去抖延迟
// 记录请求的段
int8_trecStatus=recordSegment(127);// 停止1秒
if(recStatus==0){printf("Stop for 1 s added.\r\n");// 切换前 LED 状态
if(toggleLED==0){GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN5);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN0);toggleLED=1;printf("Left LED toggled.\r\n");}else{GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN0);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN5);toggleLED=0;}}elseif(recStatus==1){printf("ERROR: Sequence reached max length (50). Segment not added.\r\n");}elseif(recStatus==-1){printf("ERROR: mv value not recognized by recordSegment.\r\n");}}elseif(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN6)==GPIO_INPUT_PIN_LOW){// 等待释放
while(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN6)==GPIO_INPUT_PIN_LOW){}__delay_cycles(240e3);// ~简单去抖延迟
// 记录请求的段
int8_trecStatus=recordSegment(-1);// 左转45°
if(recStatus==0){printf("Turn left 45 added.\r\n");// 切换前 LED 状态
if(toggleLED==0){GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN5);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN0);toggleLED=1;printf("Left LED toggled.\r\n");}else{GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN0);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN5);toggleLED=0;}}elseif(recStatus==1){printf("ERROR: Sequence reached max length (50). Segment not added.\r\n");}elseif(recStatus==-1){printf("ERROR: mv value not recognized by recordSegment.\r\n");}}elseif(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN7)==GPIO_INPUT_PIN_LOW){// 等待释放
while(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN7)==GPIO_INPUT_PIN_LOW){}__delay_cycles(240e3);// ~简单去抖延迟
// 记录请求的段
int8_trecStatus=recordSegment(-2);// 左转90°
if(recStatus==0){printf("Turn left 90 added.\r\n");// 切换前 LED 状态
if(toggleLED==0){GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN5);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN0);toggleLED=1;printf("Left LED toggled.\r\n");}else{GPIO_setOutputHighOnPin(GPIO_PORT_P8,GPIO_PIN0);GPIO_setOutputLowOnPin(GPIO_PORT_P8,GPIO_PIN5);toggleLED=0;}}elseif(recStatus==1){printf("ERROR: Sequence reached max length (50). Segment not added.\r\n");}elseif(recStatus==-1){printf("ERROR: mv value not recognized by recordSegment.\r\n");}}// -- 检查 PB1(弹出最后一步)--
if(!GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN4)==GPIO_INPUT_PIN_LOW){// 等待释放
while(!GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN4)==GPIO_INPUT_PIN_LOW){}__delay_cycles(200000);uint8_tpopRes=popSegment();if(popRes==0){printf("Last segment popped.\r\n");}else{printf("No segment to pop.\r\n");}}// -- 检查 PB2(清除整个序列)--
if(!GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN5)==GPIO_INPUT_PIN_LOW){// 等待释放
while(!GPIO_getInputPinValue(GPIO_PORT_P2,GPIO_PIN5)==GPIO_INPUT_PIN_LOW){}__delay_cycles(200000);clearSequence();printf("Entire sequence cleared.\r\n");}}}
voidhandleSegmentRecord(int8_tmv,uint8_t*toggleLED,constchar*message){int8_trecStatus=recordSegment(mv);if(recStatus==0){printf("%s added.\r\n",message);toggleFrontLEDs(toggleLED);}elseif(recStatus==1){printf("ERROR: Sequence reached max length.\r\n");}elseif(recStatus==-1){printf("ERROR: mv value not recognized.\r\n");}}
然后我们可以这样写:
1
2
3
4
if(GPIO_getInputPinValue(GPIO_PORT_P4,GPIO_PIN0)==GPIO_INPUT_PIN_LOW){debouncePin(GPIO_PORT_P4,GPIO_PIN0);handleSegmentRecord(2,&toggleLED,"Turn right 90");}