マトリクスLEDの表示方法の原理†※データシート→http://akizukidenshi.com/download/ds/optosupply/OSL641501-XX.pdf (-BRAのほう) マトリクスLEDは、↑のようにたくさんのLEDが、格子状に縦横につながっています。
タイマ割り込み†このような動作は、メインプログラムの動作とは独立に行った方が、メインプログラムの記述が楽ですので、タイマ割り込みという手法を使って、メインプログラムとは独立に行うことにします。 ↑のようにTimer8_1モジュールのパラメータを設定しておきます。 #pragma interrupt_handler Timer8_1_ISR void Timer8_1_ISR() { .... } ダイナミック駆動のLED制御の準備†ダイナミック駆動では、行方向(ROW1〜8)と列方向(COL1〜8)を、それぞれ"H"/"L"とする必要があります。 ↑行方向は、こんな感じでLED_R1〜LED_R8を置きます。それぞれのPortとPinは、実際にマトリクスLEDがつながっているポート番号を設定します。 ↑列方向も、同様にLED_C1〜LED_C8を置き、PortとPinを、実際にマトリクスLEDがつながっているポート番号を設定します。 ダイナミック駆動の全体†以上の準備をふまえて、ダイナミック駆動の全体プログラムは、例えば以下のような感じになります。 BYTE pat[8]; BYTE col; #pragma interrupt_handler Timer8_1_ISR void Timer8_1_ISR() { LED_C1_Off(); LED_C2_Off(); LED_C3_Off(); LED_C4_Off(); LED_C5_Off(); LED_C6_Off(); LED_C7_Off(); LED_C8_Off(); if (pat[col] & 0x01) LED_R1_On(); else LED_R1_Off(); if (pat[col] & 0x02) LED_R2_On(); else LED_R2_Off(); if (pat[col] & 0x04) LED_R3_On(); else LED_R3_Off(); if (pat[col] & 0x08) LED_R4_On(); else LED_R4_Off(); if (pat[col] & 0x10) LED_R5_On(); else LED_R5_Off(); if (pat[col] & 0x20) LED_R6_On(); else LED_R6_Off(); if (pat[col] & 0x40) LED_R7_On(); else LED_R7_Off(); if (pat[col] & 0x80) LED_R8_On(); else LED_R8_Off(); switch (col){ case 0 : LED_C1_On(); break; case 1 : LED_C2_On(); break; case 2 : LED_C3_On(); break; case 3 : LED_C4_On(); break; case 4 : LED_C5_On(); break; case 5 : LED_C6_On(); break; case 6 : LED_C7_On(); break; case 7 : LED_C8_On(); break; } col = col + 1; if (col == 8) col = 0; } void main(void) { pat[0] = 0x01; // 00000001 pat[1] = 0x02; // 00000010 pat[2] = 0x04; // 00000100 pat[3] = 0x08; // 00001000 pat[4] = 0x10; // 00010000 pat[5] = 0x20; // 00100000 pat[6] = 0x40; // 01000000 pat[7] = 0x80; // 10000000 col = 0; M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts Timer8_1_EnableInt(); Timer8_1_Start(); while (1){ } } |