トップページ | H8 | 3.LEDの複雑な表示 |
3.LEDの複雑な表示 | |
前回LEDの点滅プログラムを作成しました。今回はこれより複雑な表示をします。複雑といってもとても簡単な表示です。この表示の方法を応用すればLEDのみなず高機能なLSIやモーターなどの制御をすることができます。極端な表現ですが、 「LEDを好きなように制御できれば、あとは何でもできる!」 といえます。 LEDの表示は、音楽で言えば タ タ タン のリズムで繰り返します。 アニメーションGIFではこうなります。 前回のLED点滅では、点灯と消灯を交互に繰り返すだけなので簡単でした。今回はLEDのステート(状態)とステートが変わるための時間をセットして表示を実現します。 LEDの表示を制御する時間は1msごとにやるほどの忙しい処理ではありません。厳密に制御したところで人間の目には違いがわかりません。とりあえず10msごとに処理することにします。 1msごとの割り込み処理InterruptITU0()で10msを数えてLED処理フラグg_byLEDCtrlをセットします。 void InterruptITU0() 次にMyOS()では、LED処理フラグをみて、LED処理関数LEDCtrl()を呼び出します。 void MyOS() { InitPort(); InitITU(); InitLED(); EnableInterrupt(); while(1) { if(g_byLEDCtrl == 1) { LEDCtrl(); } }つぎにLEDCtrl()では、上記のタイミングチャートにあるステートと時間をセットして状態が変わるときにLEDの点灯または消灯をPBポートに出力します。また、g_byLEDCtrlのクリアをします。(案外クリアすることは忘れやすいです。) void LEDCtrl() { g_sLED1Time--; if(g_sLED1Time == 0) { switch(g_byLED1State) { case 0: case 2: PB_DR &= 0xfe; g_byLED1State++; g_sLED1Time = 30; break; case 1: case 3: PB_DR |= 0x01; g_byLED1State++; g_sLED1Time = 30; break; case 4: PB_DR &= 0xfe; g_sLED1Time = 120; g_byLED1State++; break; case 5: PB_DR |= 0x01; g_byLED1State = 0; g_sLED1Time = 120; break; } } g_byLEDCtrl = 0; }サンプルプログラムのダウンロード |