我正在设计一个交通灯控制系统,其描述如下:
我尝试修复我的代码,我已经修复了代码并编写了防振按钮,但这一切都是徒劳的,这是我的代码:
uint8_t direct = HAL_GPIO_ReadPin(direct_GPIO_Port, direct_Pin);
uint8_t rst = HAL_GPIO_ReadPin(rst_GPIO_Port, rst_Pin);
uint8_t i;
uint8_t j;
uint8_t pre_state = GR;
uint8_t next_state;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1){
if (rst == 1) {
pre_state = GR;
} else {
pre_state = next_state;
}
switch (pre_state) {
case GR:
if (direct == 0) {
next_state = GR;
} else {
next_state = YR;
i = 3;
}
break;
case YR:
if (i != 0) {
next_state = YR;
i = i - 1;
} else if (i == 0){
pre_state = RR1;
next_state = RR1;
j = 3;
}
break;
case RR1:
if (j != 0) {
next_state = RR1;
j = j - 1;
} else if (j == 0){
pre_state = RG;
next_state = RG;
}
break;
case RG:
if (direct == 1) {
next_state = RG;
} else {
next_state = RY;
j = 3;
}
break;
case RY:
if (j != 0) {
next_state = RY;
j = j - 1;
} else if (j == 0){
pre_state = RR2;
next_state = RR2;
i = 3;
}
break;
case RR2:
if (i != 0) {
next_state = RR2;
i = i - 1;
} else if (i == 0){
pre_state = GR;
next_state = GR;
}
break;
}
if (pre_state == GR) {
HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_RESET);
} else if (pre_state == YR) {
HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_RESET);
} else if (pre_state == RR1) {
HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_RESET);
} else if (pre_state == RR2) {
HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_RESET);
} else if (pre_state == RG) {
HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_RESET);
} else {
HAL_GPIO_WritePin(R1_GPIO_Port, R1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(G1_GPIO_Port, G1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Y1_GPIO_Port, Y1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(R2_GPIO_Port, R2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(Y2_GPIO_Port, Y2_Pin, GPIO_PIN_SET);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
由于您只读取
uint8_t direct = HAL_GPIO_ReadPin(direct_GPIO_Port, direct_Pin);
和 uint8_t rst = HAL_GPIO_ReadPin(rst_GPIO_Port, rst_Pin);
一次,并且在 while(1)
循环之外,您只需将这些引脚的初始状态放入上述变量中。
要解决此问题,请将 while 循环中的 rst
和 direct
替换为 HAL_GPIO_ReadPin(...)
。