szzyq 发表于 2012-3-29 10:52:15

请高手指点下这2个函数有什么问题

本帖最后由 szzyq 于 2012-3-29 10:54 编辑

以下是遥控器的2个函数,但有些不明白,请高手指点下是怎么回事?
看以下这2个函数,在FALSE == remote_offset_adjust_flag时按下ADJUST键进入remote_adjust_key_operation()这个函数,在这个函数里会
将remote_offset_adjust_flag赋值为TRUE,在这种情况下再按下任意键应该进入到调整偏移量模式的SWITCH下,只有按下ADJUST键和SAVE键
才会退出调整偏移量模式,在这个SWITCH结构里FRONT\STOP\BACK没定义去向,如按下这几个键应该是不起任何作用的,但现在的情况是按
下任意键都是退出。看程序只有在按下ADJUST键和SAVE键才会将remote_offset_adjust_flag赋值为FALSE而退出ELSE下的SWITCH结构,而且
整个程序里只有remote_adjust_key_operation()和remote_offset_adjust_value_save()这2个函数会将改变remote_offset_adjust_flag的值。
现在却是按下FRONT\STOP\BACK也改变了remote_offset_adjust_flag的值从而退出了调整偏移量模式。请问到底是怎么回事?

void remote_key_operation(void)
{
    if(FALSE == remote_offset_adjust_flag)         //非调整模式
    {
      switch(RF_key_number)
      {
            case REMOTE_STOP_KEY:   remote_stop_key_operation(); break;                  //按下STOP键
            case REMOTE_FRONT_KEY:remote_front_key_operation(); break;                //按下FRONT键
            case REMOTE_BACK_KEY:   remote_back_key_operation(); break;                  //按下BACK键
            case REMOTE_LEFT_KEY:   remote_left_key_operation(); break;
            case REMOTE_RIGHT_KEY:remote_right_key_operation(); break;
            case REMOTE_ADJUST_KEY: remote_adjust_key_operation(); break;                //按下ADJUST键
            //case REMOTE_SAVE_KEY:   remote_prescribe_length_key_operation(); break;
            default: break;
      }
    }
    //偏移量调整
    else                                             //调整偏移量模式
    {
      switch(RF_key_number)
      {
            case REMOTE_ADJUST_KEY: remote_adjust_key_operation(); break;         //按下ADJUST键
            case REMOTE_BACK_KEY:   
            case REMOTE_FRONT_KEY:
            case REMOTE_STOP_KEY:   
            case REMOTE_SAVE_KEY:   remote_offset_adjust_value_save(); break;   //按下SAVE键
            case REMOTE_LEFT_KEY:   send_adjust('R'); break;                              //按下LEFT键
            case REMOTE_RIGHT_KEY:send_adjust('L'); break;                               //按下RIGHT键
            default: break;
      }
    }
}

void remote_adjust_key_operation(void)
{
    if(TRUE == remote_offset_adjust_flag)
    {
      start_flag = 0;
      set_speed_band = 0;
      system_mode = MODE_RUN;

      send_adjust('E');

      remote_offset_adjust_flag = FALSE;
    }
    else
    {
      set_direction = 'F';
      set_speed_band = 1;
      
      system_mode = MODE_RUN;

      start_flag = 1;

      send_adjust('B');

      remote_offset_adjust_flag = TRUE;
    }
}

void remote_offset_adjust_value_save(void)
{
    start_flag = 0;
    system_mode = MODE_RUN;

    send_adjust('S');

    remote_offset_adjust_flag = FALSE;
}

szzyq 发表于 2012-3-29 11:00:36

程序运行是正常的,只是不明白为什么按下FRONT\STOP\BACK这几个会退出偏移调整模式。

zyyn123 发表于 2012-3-29 12:40:53

case REMOTE_BACK_KEY:
case REMOTE_FRONT_KEY:
case REMOTE_STOP_KEY:
这三个语句不要试一下,要是要的话在后面都加上break语句试下.

szzyq 发表于 2012-3-29 14:39:15

zyyn123 发表于 2012-3-29 12:40 static/image/common/back.gif
case REMOTE_BACK_KEY:
case REMOTE_FRONT_KEY:
case REMOTE_STOP_KEY:


加上BREAK就不起作用了,经过测试原来是跳到case REMOTE_SAVE_KEY:   remote_offset_adjust_value_save(); break这里去了

zyyn123 发表于 2012-3-29 14:52:20

按道理来说,应该加上BREAK就不会跳到case REMOTE_SAVE_KEY:   remote_offset_adjust_value_save(); break这句,因为case语句再没有遇到BREAK语句时会依次执行下面的case语句的.所以当按下FRONT\STOP\BACK这几个会退出偏移调整模式的.不知道我理解对不对.

szzyq 发表于 2012-3-29 16:42:50

应该就是这样,但后面不是有DEFAULT语句吗,把这几行屏蔽掉就没事         case REMOTE_BACK_KEY:   
            case REMOTE_FRONT_KEY:  
            case REMOTE_STOP_KEY:   
难道这是KEIL的BUG?

zyyn123 发表于 2012-3-29 17:52:19

如果按下FRONT\STOP\BACK键,程序是不会执行到default语句的.假如按下了BACK键,那程序执行应该如下图:
页: [1]
查看完整版本: 请高手指点下这2个函数有什么问题