トップページ H8 3.LEDの複雑な表示

3.LEDの複雑な表示
前回LEDの点滅プログラムを作成しました。今回はこれより複雑な表示をします。複雑といってもとても簡単な表示です。この表示の方法を応用すればLEDのみなず高機能なLSIやモーターなどの制御をすることができます。極端な表現ですが、
「LEDを好きなように制御できれば、あとは何でもできる!」
といえます。
LEDの表示は、音楽で言えば 
タ タ タン
のリズムで繰り返します。
アニメーションGIFではこうなります。


前回のLED点滅では、点灯と消灯を交互に繰り返すだけなので簡単でした。今回はLEDのステート(状態)とステートが変わるための時間をセットして表示を実現します。


LEDの表示を制御する時間は1msごとにやるほどの忙しい処理ではありません。厳密に制御したところで人間の目には違いがわかりません。とりあえず10msごとに処理することにします。
1msごとの割り込み処理InterruptITU0()で10msを数えてLED処理フラグg_byLEDCtrlをセットします。
 void InterruptITU0()
{
TSR0 &= 0xfb;
TCNT0 = 0x10000 - 25000;/* 1 msec interval */
g_nITU0--;
if(g_nITU0 <= 0)
{
g_nITU0 = 10;
g_byLEDCtrl = 1;
} }

次に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;
}
サンプルプログラムのダウンロード