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++;
    }
}

質問

1 つが応答し、もう 1 つがまったく役に立たないのはなぜですか?

レスポンシブと言うときは、エンコーダーを回転させたときに画面の変化がレスポンシブであるという事実を指しています。どちらの方法も「機能」しますが、使用の観点からは受け入れられません。

4

2 に答える 2

9

これら 2 つのコードは、1 つの非常に微妙な違いを除けば、ほぼ同等です。

古いコードをリファクタリングして、新しいコードのように見えるようにしようとすると、古いコードが 1 つの余分な関数呼び出しを行うことがわかります。違いを注意深く見てください。

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 に答える