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

2020-02-04 09:23发布

本帖最后由 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结构里FRONTSTOPBACK没定义去向,如按下这几个键应该是不起任何作用的,但现在的情况是按
下任意键都是退出。看程序只有在按下ADJUST键和SAVE键才会将remote_offset_adjust_flag赋值为FALSE而退出ELSE下的SWITCH结构,而且
整个程序里只有remote_adjust_key_operation()和remote_offset_adjust_value_save()这2个函数会将改变remote_offset_adjust_flag的值。
现在却是按下FRONTSTOPBACK也改变了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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
szzyq
1楼-- · 2020-02-04 11:02
程序运行是正常的,只是不明白为什么按下FRONTSTOPBACK这几个会退出偏移调整模式。
zyyn123
2楼-- · 2020-02-04 14:17
 精彩回答 2  元偷偷看……
szzyq
3楼-- · 2020-02-04 20:02
zyyn123 发表于 2012-3-29 12:40
case REMOTE_BACK_KEY:  
case REMOTE_FRONT_KEY:  
case REMOTE_STOP_KEY:

加上BREAK就不起作用了,经过测试原来是跳到case REMOTE_SAVE_KEY:   remote_offset_adjust_value_save(); break这里去了
zyyn123
4楼-- · 2020-02-05 01:55
按道理来说,应该加上BREAK就不会跳到case REMOTE_SAVE_KEY:   remote_offset_adjust_value_save(); break这句,因为case语句再没有遇到BREAK语句时会依次执行下面的case语句的.所以当按下FRONTSTOPBACK这几个会退出偏移调整模式的.不知道我理解对不对.
szzyq
5楼-- · 2020-02-05 05:23
应该就是这样,但后面不是有DEFAULT语句吗,把这几行屏蔽掉就没事         case REMOTE_BACK_KEY:   
            case REMOTE_FRONT_KEY:  
            case REMOTE_STOP_KEY:   
难道这是KEIL的BUG?
zyyn123
6楼-- · 2020-02-05 06:26
如果按下FRONTSTOPBACK键,程序是不会执行到default语句的.假如按下了BACK键,那程序执行应该如下图:

一周热门 更多>