今回は、ソース・コードに解説を加えていきます。
大域変数の解説このプログラムで使用する変数は、一つだけです。
//============================================================== // 変数の宣言 //============================================================== byte led_index; // 点灯させるLEDの場所
プログラムは、変数led_indexの値に従って、 LEDを一つだけ点灯させます。 変数の値と点灯するLEDとの関係は、 後の「選択したLEDを点灯させる関数」で解説します。
初期設定関数の解説関数initialize(void)では、 レジスタと変数の初期化を行っています。
//==============================================================
// 初期設定
//==============================================================
void initialize(void) {
ICSTRM = NVICSTRM; // TRIMレジスタを設定する
ICSSC = NVFTRIM; // FTRIMレジスタを設定する
SOPT = SOPT_INIT; // SOPTレジスタを初期化する
led_index = 0; // LED0を点灯させる
}
レジスタと変数が初期化されます。 変数led_indexは、0に初期化され、 最初はLED0が点灯します。
選択したLEDを点灯させる関数の解説関数put_led(void)は、 変数led_indexで指定した LEDを点灯させます。
//==============================================================
// 選択したLEDを点灯させる
//==============================================================
void put_led(void) {
switch (led_index) {
case 0: // LED0を点灯させる
PTAD = 0b00010000; // PTA5=L, PTA4=H, PTA1=Z
PTADD = 0b00110000;
break;
case 1: // LED1を点灯させる
PTAD = 0b00100000; // PTA5=H, PTA4=L, PTA1=Z
PTADD = 0b00110000;
break;
case 2: // LED2を点灯させる
PTAD = 0b00000010; // PTA5=Z, PTA4=L, PTA1=H
PTADD = 0b00010010;
break;
case 3: // LED3を点灯させる
PTAD = 0b00010000; // PTA5=Z, PTA4=H, PTA1=L
PTADD = 0b00010010;
break;
case 4: // LED4を点灯させる
PTAD = 0b00100000; // PTA5=H, PTA4=Z, PTA1=L
PTADD = 0b00100010;
break;
case 5: // LED5を点灯させる
PTAD = 0b00000010; // PTA5=L, PTA4=Z, PTA1=H
PTADD = 0b00100010;
break;
default: // 全部消灯する
PTAD = 0b00000000; // PTA5=L, PTA4=L, PTA1=L
PTADD = 0b00110010;
}
}
変数led_indexの値により、 ポートが以下の表のように設定され、 選択されたLEDが点灯します。
| led_index | ポートの状態 | 点灯するLED | ||
|---|---|---|---|---|
| PTA5 | PTA4 | PTA1 | ||
| 0 | L出力 | H出力 | 入力 | LED0 |
| 1 | H出力 | L出力 | 入力 | LED1 |
| 2 | 入力 | L出力 | H出力 | LED2 |
| 3 | 入力 | H出力 | L出力 | LED3 |
| 4 | H出力 | 入力 | L出力 | LED4 |
| 5 | L出力 | 入力 | H出力 | LED5 |
| それ以外 | L出力 | L出力 | L出力 | なし |
メイン関数の解説
メイン関数main(void)は、 フローチャートを忠実に再現した記述になっています。
//==============================================================
// メイン関数
//==============================================================
void main(void) {
EnableInterrupts; /* enable interrupts */
/* include your code here */
initialize(); // 初期設定
for(;;) {
put_led(); // 選択したLEDを点灯させる
} /* loop forever */
/* please make sure that you never leave main */
}
変数led_indexは、 デバッガを使い手動で変更するため、 プログラムには変更を行う部分がありません。
次回は、マイコンにプログラムを書き込んで、実行します。
田中範明
