「練習プログラム7」の編集履歴(バックアップ)一覧はこちら
練習プログラム7 - (2008/04/06 (日) 01:11:52) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
このページで練習プログラムは最後となります。
今回はモード選択について学びます。
&bold(){参考プログラム⑦『LEDとスイッチを使い、モード選択して全点灯or全点滅する』}
#include <3694.h>
#define SW1 ((~IO.PDR1.BYTE)&0x01) //スイッチ (SW1→押されたら1、押されてないと0)
#define SW2 ((~IO.PDR1.BYTE)&0x02) //スイッチ (SW2→押されたら1、押されてないと0)
#define SW3 ((~IO.PDR1.BYTE)&0x04) //スイッチ (SW3→押されたら1、押されてないと0)
/*ウェイト関数*/
void wait(long loop)//無駄ループさせて時間を稼ぐ関数
{
while(loop--);
}
/*LED全点灯関数*/
void LED_all()
{
while(1)
{ //無限ループさせる
IO.PDR8.BYTE = 0x00; //ポート8の【High】or【 Low】の出力を決める(出力の設 定 0なら点灯 1なら消灯 →ActiveLow)
}
}
/*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を加算
else if(SW2){mode--;} //modeを減算
mode=(mode+6)%6; //余り分を消す
IO.PDR8.BYTE=~mode; //modeの値を反転してLEDに表示
wait(10); //加減する速さを調節
}
return mode;
}
/*--------------------------------------------------*/
/* メイン関数 */
/*--------------------------------------------------*/
int main(void) //メイン関数
{
char mode;
IO.PCR8 = 0xff; //ポート8を全て出力に設定
IO.PDR8.BYTE = 0xff; //全消灯
mode=mode_select(); //モード選ぶ(変数modeの値を決定する)
switch(mode) //スイッチ文
{
case 1:LED_all();break; //modeが1なら全点灯関数を実行
case 2:LED_blink();break; //modeが2なら全点滅関数を実行
}
return 0;
}
&bold(){・プログラムの解説}
以下編集中・・・
このページで練習プログラムは最後となります。
今回はモード選択について学びます。
&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》を実行させよ』