練習プログラム7


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

このページで練習プログラムは最後となります。
今回はモード選択について学びます。

参考プログラム⑦『LEDとスイッチを使い、モード選択して全点灯or全点滅する』
#include <3694.h>  

#define SW1 !IO.PDR1.BIT.B4        //スイッチ (SW1→押されたら1、押されてないと0)
#define SW2 !IO.PDR1.BIT.B5        //スイッチ (SW2→押されたら1、押されてないと0)
#define SW3 !IO.PDR1.BIT.B6        //スイッチ (SW3→押されたら1、押されてないと0)


/*ウェイト関数*/
void wait(long long loop)                      //無駄ループさせて時間を稼ぐ関数.
{
    while(loop--);
}

/*LED全点灯関数*/
void LED_all()
{
    while(1)                              //無限ループさせる.
    {
       IO.PDR5.BYTE = 0x00;               //ポート5の【High】or【 Low】の出力設定.
    }
}

/*LED全点滅関数*/
void LED_blink(){
    while(1){                              //無限ループさせる.
        IO.PDR5.BYTE = 0x00;               //ポート5の【High】or【 Low】の出力設定.
        wait(20000);
        IO.PDR5.BYTE = 0xff;               //ポート5の【High】or【 Low】の出力設定.
        wait(20000);
    }
}

/*モード選択関数*/
char mode_select()
{
    char mode=0x01;
    while(!SW3){                           //SW3が押されるまでループ.
        if(SW1){                           //modeを加算.
            mode++;
            wait(10000);                   //加減する速さを調節.
        }
        else if(SW2){                      //modeを減算.
            mode--;
            wait(10000);                   //加減する速さを調節.
        }
        mode=(mode+6)%6;                   //余り分を消す.
        IO.PDR5.BYTE=~mode;                //modeの値を反転してLEDに表示.
     }
    return mode;
}

/*メイン関数*/
int main(void)                             //メイン関数.
{
    char mode;
    IO.PCR5 = 0xff;                        //ポート8を全て出力に設定.
    IO.PDR5.BYTE = 0xff;                   //全消灯.
    
    mode=mode_select();                    //モード選ぶ(変数modeの値を決定する)

    switch(mode){                          //switch文.
    case 1:
        LED_all();break;                   //modeが1なら全点灯関数を実行.
    case 2:
        LED_blink();break;                 //modeが2なら全点滅関数を実行.
    }

    return 0; 
}


・プログラムの解説

char mode_select()
{
    char mode=0x01;
    while(!SW3){                           //SW3が押されるまでループ.
        if(SW1){                           //modeを加算.
            mode++;
            wait(10000);                   //加減する速さを調節.
        }
        else if(SW2){                      //modeを減算.
            mode--;
            wait(10000);                   //加減する速さを調節.
        }
        mode=(mode+6)%6;                   //余り分を消す.
        IO.PDR5.BYTE=~mode;                //modeの値を反転してLEDに表示.
     }
    return mode;
}
今回のプログラムは、この関数が全てなような感じです。

mode=(mode+6)%6; (-----(*)とおく)
この行で、モードが1から6の間を動くようにしています。

「%」は演算子で、余りを求める役割をもっています。
「a % b」なら「a を b で割った余り」という意味です。

なので(*)は
mode に 「 (mode+6) を 6 で割った余り 」 を代入する、という意味です。

例えば
mode=6;
mode++;
によりmode=7となると
(*)で、modeに(7+6)/6の余り:1が代入され、
1→2→3→4→5→6→7→8→…
とはならずに、
1→2→3→4→5→6→1→2→…
というように、モードが1から6の間を動くようになります。

Y氏曰く、マイコンに割り算をやらせると遅くなるので、本当はif文を使ったほうが良いようですが
まあ、頭の体操的な気分で。


課題プログラム⑦『LEDとスイッチを使い、モード選択をして《Lv1》~《Lv6》を実行させよ』
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。