3

背景

我正在使用基于 8052 的微控制器。我连接了 LCD 和编码器轮。用户可以通过旋转并按下编码轮来浏览 LCD 上显示的菜单。

编码器轮的旋转是基于中断的。

编码器轮的旋转方向 ( encoder_turn) 在编码器中断内设置。

update_lcd()在循环内部调用。

新的响应代码

void update_lcd()                           
{

        //ENCODER TURN      
        switch(encoder_turn)
        {
            case RIGHT:
                 lcd_clear();
                 next_screen();
                 break;
            case LEFT:
                lcd_clear();
                previous_screen();
                break;
            default:
                break;
        }
 }

void next_screen()
{
    if(current_test_screen < screen5)
    {
        current_test_screen++;
    }

    draw_current_test_screen(); 
}

void draw_current_test_screen()
{
    switch(current_test_screen)
    {
        case screen1:
            draw_screen1();
            break;
        case screen2:
            draw_screen2();
            break;
        case screen3:
            draw_screen3();
            break;
        case screen4:
            draw_screen4();
            break;
        case screen5:
            draw_screen5();
            break;      
        default:
        break;
    }
}

旧的无响应代码

void update_lcd()                           
{

        //ENCODER TURN      
        switch(encoder_turn)
        {
            case RIGHT:
                 lcd_clear();
                 next_screen();
                 break;
            case LEFT:
                lcd_clear();
                previous_screen();
                break;
            default:
                break;
        }

        switch(current_test_screen)
        {
            case screen1:
                draw_screen1();
                break;
            case screen2:
                draw_screen2();
                break;
            case screen3:
                draw_screen3();
                break;
            case screen4:
                draw_screen4();
                break;
            case screen5:
               draw_screen5();
               break;       
            default:
               break;
       }


 }

void next_screen()
{
    if(current_test_screen < screen5)
    {
        current_test_screen++;
    }
}

问题

为什么一个反应灵敏而另一个完全没用?

当我说响应时,我指的是当我旋转编码器时屏幕变化是响应的。两种方法都“有效”,但从使用的角度来看,一种方法是不可接受的。

4

2 回答 2

9

这两段代码几乎是等价的,除了一个非常细微的区别。

如果您尝试重构旧代码以使其看起来更像您的新代码,您会发现旧代码进行了一次额外的函数调用。仔细看区别:

void update_lcd()                           
{
        //ENCODER TURN      
        switch(encoder_turn)
        {
            case RIGHT:
                 lcd_clear();
                 next_screen();
                 break;
            case LEFT:
                lcd_clear();
                previous_screen();
                break;
            default:
                draw_current_test_screen();   // <--- your new code omits this call
                break;
        }
 }

尝试获取新代码并添加该行,看看它是否会导致无响应问题。

于 2012-05-02T20:08:23.433 回答
0

只是一个猜测,但我怀疑:由于您唯一更改的是函数嵌套,encoder_turn因此可能正在被优化器缓存。您需要标记encoder_turn为易失性,因为中断可以随时发生并更改其值。

于 2012-05-02T20:08:00.003 回答