whileを使った練習プログラム
ここからは、これまで学んだ知識を使っていっしょに考えましょう。作るのは、「スプーンを叩いたらLEDが光る」ように動作するプログラムです。
ポート設定のところで説明したように、マジカルボックスでは音を検出するとポートP30が1から0になります。LEDについて以前の連載記事「ハードウェアの話とコードの生成」を参照してください。全部で5つ実装されています。今回はD7を点灯させてみましょう。D7は第3回の表1にあるように、ポートP123を1にすると点灯します。
LEDを消灯
では順に処理を考えていきます。まず最初にしないといけないのは、LEDを全部消灯させることです。点灯させるためには、あらかじめ消灯しておかないといけません。あたりまえのことなのですが、プログラミングというのはそういう当たり前なことまで事細かに気配りする必要があります。
実際には、プログラムで消灯しなくてもLEDは消灯状態から開始します。これは、マイコンのポートはリセット直後(マイコンの起動直後)はハードウェアで0に初期化される仕様になっているためです。今回のマジカルボックスの回路ではポートが0のとき消灯するようになっているので、結果的に消えています。
ですが、プログラミングするにあたっては、そういうところも手抜きせずきちんと書いておくことが、不具合を作り込まないために大切です。「ここはxxなはず」という思い込みで処理をはしょって失敗する例はプロでも意外と多いのです。
音信号が来るまで待つ
次に、スプーンが叩かれるまで、つまり音信号が来るまで待つ必要があります。これは言い換えれば、「音信号が来ない間、なにもしない」です。音信号が来ないというのは……音信号の入力ポート(P30)が1の間ということです。
「~の間」というのはwhile文の得意技ですから、while文の条件に、P30が1と等しいという条件を書けばいいはずです。「等しい」を表す演算子はなんでしたか。忘れた方は記事「たった5つのルール」を読んで復習しましょう。はい、=じゃなくて==でしたね。ということで、while文は
while ( P3.0 == 1 )
と書けばいいことがわかります。つぎにちょっとむずかしいのは「なにもしないで待つ」かもしれません。これは意外と簡単、聞くとな~んだです。答えを言いますとこうです。
while ( P3.0 == 1 ){
;
}
注:P30はプログラム中ではP3.0と書きます
実行文を何も書かず、セミコロンだけにします。これで、このwhile文は、P30が1の間、なにもしないでずっとここでぐるぐるループします。で、音信号がくるとP30は0になるので、( P30 == 1 )の条件が成立しなくなって、ループを終了し、次へと制御が進みます。なので、この後にLEDを点灯させる処理を書けばうまくいくはずです。
無限ループを置く
さて、LEDを点灯させたあとはどうしたらいいでしょうか。そのままだとマイコンはどんどん先へ進んで、プログラムの存在しないところへ暴走していってしまいます。これを防ぐためにはいろいろな方法がありますが、ここでは無限ループを置く方法を学びましょう。
無限ループはその名の通り無限にループし続ける処理です。これも通常はwhile文を使って以下ように書きます。
while(1){
;
}
条件に1という固定の値を書くことで、永遠に条件が成立した状態にしているわけです。
さあ、これでもう自力でプログラムが書けますね。PM plusを起動して、プログラムを入力してみましょう。
PM plus を起動し、[ファイル]メニューから[ワークスペースを開く(W)]を選択します。ファイル指定のダイアログでD:¥mspoon¥test2¥test2.prwを指定します。ワークスペースを読み込んだら、ProjectWindowのソース・ファイルを展開([+]マークをクリックする)して、図20のようになっているか確認してください。

プロジェクト名を変更
このままでもいいですが、せっかくなのでプロジェクトの名前を変えておきましょう。赤い円柱の横のAppliletの部分を右クリックして、表示されたメニューから「プロジェクト・タイトルの変更(E)」を選びます(図21)。

名称入力のダイアログが開きますから、ここでは「while文練習」とでも入れておきましょう(図22)。

