switch 语句从一种情况跳转到另一种情况
Switch statement jumps from one case to another
这是 MSP430 微控制器项目的一部分。我的问题是这个 switch 语句从 case 1: (和 case 2: 以及)跳到 case 11: 没有明显的原因。我尝试调试它,开关值 selected_cmd 在此过程中没有改变。变量selected_cmd是一个全局变量,它的值是在另一个函数中设置的。如果我在此 switch 语句之前放置简单语句 selected_cmd = 2,它会按预期工作。如果以编程方式设置 selected_cmd,它会从一种情况跳转到另一种情况。如何解决?
switch (selected_cmd)
{
case 0: // set light level
{
DALI_MsgBuf[1] = value;
DALI_FF = DALI_MsgBuf[1] | (DALI_MsgBuf[0] << 8);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 1: // turn off
{
DALI_FF = TURN_OFF | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 2: // recall max
{
DALI_FF = RECALL_MAX_LEVEL | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 3: // recall min
{
DALI_FF = RECALL_MIN_LEVEL | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 4: // store max lvl
{
DALI_FF = (DATA_TRANSFER_REGISTER << 8) | value;
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_FF = STORE_THE_DTR_AS_MAX_LEVEL | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 5: // store min lvl
{
DALI_FF = (DATA_TRANSFER_REGISTER << 8) | value;
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_FF = STORE_THE_DTR_AS_MIN_LEVEL | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 6: // set fade rate
{
DALI_FF = (DATA_TRANSFER_REGISTER << 8) | value;
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_FF = STORE_THE_DTR_AS_FADE_RATE | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 7: // set fade time
{
DALI_FF = (DATA_TRANSFER_REGISTER << 8) | value;
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_FF = STORE_THE_DTR_AS_FADE_TIME | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 8: // add to group
{
DALI_FF = (ADD_TO_GROUP_0 | value) | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 9: // remove from group
{
DALI_FF = (REMOVE_FROM_GROUP_0 | value) | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 10: // store as scene
{
DALI_FF = STORE_ACTUAL_LEVEL_IN_THE_DTR | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_FF = (STORE_THE_DTR_AS_SCENE_0 | value) | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 11: // go to scene
{
DALI_FF = (GO_TO_SCENE_0 | value) | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 12: // remove from scene
{
DALI_FF = (REMOVE_FROM_SCENE_0 | value) | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 13: // reset
{
DALI_FF = RESET | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
default: break;
}
使用
switch (selected_cmd)
{
case 0: // set light level
DALI_MsgBuf[1] = value;
DALI_FF = DALI_MsgBuf[1] | (DALI_MsgBuf[0] << 8);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
case 1: // turn off
DALI_FF = TURN_OFF | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
case 2: // recall max
DALI_FF = RECALL_MAX_LEVEL | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
...
不要在 case: 语句后使用大括号
您是否从中断中调用此函数。然后,当新的中断再次进入该方法时,调试器可能会感到困惑。
这是 MSP430 微控制器项目的一部分。我的问题是这个 switch 语句从 case 1: (和 case 2: 以及)跳到 case 11: 没有明显的原因。我尝试调试它,开关值 selected_cmd 在此过程中没有改变。变量selected_cmd是一个全局变量,它的值是在另一个函数中设置的。如果我在此 switch 语句之前放置简单语句 selected_cmd = 2,它会按预期工作。如果以编程方式设置 selected_cmd,它会从一种情况跳转到另一种情况。如何解决?
switch (selected_cmd)
{
case 0: // set light level
{
DALI_MsgBuf[1] = value;
DALI_FF = DALI_MsgBuf[1] | (DALI_MsgBuf[0] << 8);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 1: // turn off
{
DALI_FF = TURN_OFF | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 2: // recall max
{
DALI_FF = RECALL_MAX_LEVEL | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 3: // recall min
{
DALI_FF = RECALL_MIN_LEVEL | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 4: // store max lvl
{
DALI_FF = (DATA_TRANSFER_REGISTER << 8) | value;
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_FF = STORE_THE_DTR_AS_MAX_LEVEL | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 5: // store min lvl
{
DALI_FF = (DATA_TRANSFER_REGISTER << 8) | value;
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_FF = STORE_THE_DTR_AS_MIN_LEVEL | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 6: // set fade rate
{
DALI_FF = (DATA_TRANSFER_REGISTER << 8) | value;
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_FF = STORE_THE_DTR_AS_FADE_RATE | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 7: // set fade time
{
DALI_FF = (DATA_TRANSFER_REGISTER << 8) | value;
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_FF = STORE_THE_DTR_AS_FADE_TIME | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 8: // add to group
{
DALI_FF = (ADD_TO_GROUP_0 | value) | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 9: // remove from group
{
DALI_FF = (REMOVE_FROM_GROUP_0 | value) | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 10: // store as scene
{
DALI_FF = STORE_ACTUAL_LEVEL_IN_THE_DTR | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_FF = (STORE_THE_DTR_AS_SCENE_0 | value) | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 11: // go to scene
{
DALI_FF = (GO_TO_SCENE_0 | value) | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 12: // remove from scene
{
DALI_FF = (REMOVE_FROM_SCENE_0 | value) | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
case 13: // reset
{
DALI_FF = RESET | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
}
default: break;
}
使用
switch (selected_cmd)
{
case 0: // set light level
DALI_MsgBuf[1] = value;
DALI_FF = DALI_MsgBuf[1] | (DALI_MsgBuf[0] << 8);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
case 1: // turn off
DALI_FF = TURN_OFF | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
case 2: // recall max
DALI_FF = RECALL_MAX_LEVEL | ((DALI_MsgBuf[0] << 8) | 0x01);
DALI_Transmit(DALI_FF);
timer_sleep_ms(5);
break;
...
不要在 case: 语句后使用大括号
您是否从中断中调用此函数。然后,当新的中断再次进入该方法时,调试器可能会感到困惑。