練習プログラム7

「練習プログラム7」の編集履歴(バックアップ)一覧はこちら

練習プログラム7 - (2011/05/19 (木) 16:26:35) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

このページで練習プログラムは最後となります。 今回はモード選択について学びます。 &bold(){参考プログラム⑦『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.PDR8.BYTE = 0x00; //ポート8の【High】or【 Low】の出力設定. } } /*LED全点滅関数*/ void LED_blink(){ while(1){ //無限ループさせる. IO.PDR8.BYTE = 0x00; //ポート8の【High】or【 Low】の出力設定. wait(20000); IO.PDR8.BYTE = 0xff; //ポート8の【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.PDR8.BYTE=~mode; //modeの値を反転してLEDに表示. } return mode; } /*メイン関数*/ int main(void) //メイン関数. { char mode; IO.PCR8 = 0xff; //ポート8を全て出力に設定. IO.PDR8.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; } &bold(){・プログラムの解説} 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.PDR8.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》を実行させよ』
このページで練習プログラムは最後となります。 今回はモード選択について学びます。 &bold(){参考プログラム⑦『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; } &bold(){・プログラムの解説} 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 もご覧ください。