| トップページ | 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;
}
サンプルプログラムのダウンロード |