ブレッドボードラジオAVRマイコン入門

BASCOM-AVR LEDの点灯・消灯(その2)

 ポートAに接続した8個のLEDを同時に点灯・消灯するプログラム、及び、4個ずつ交互に点灯するプログラムを実験しました。マイコン回路は「LED点滅テスト用回路」を使用します。

1. LEDを8個同時に点灯・消灯する

 ICのポートAにつないだ8個のLED(LED7〜LED0)すべてを0.5秒おきに2回点灯させるプログラムです。プログラムを実行するとLEDは下の図のように点灯・消灯します。赤丸が点灯、白丸が消灯を表わしています。

時間LED7LED6LED5LED4 LED3LED2LED1LED0
0
1
2
3

a. ポートの出力を10進数で指定する

 ポートの出力を10進数で指定します。IC内部で8桁の2進数に変換され、PB7〜PB0が「1」または「0」になります。

 プログラムファイル on_off2a.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3 Config Porta = Output ポートAを出力に設定する。
4 Dim T As Word 待ち時間設定用の変数「T」を定義する。
5 T = 500 変数Tの値を500にする。(待ち時間500mS)
6 Porta = 255 ポートAの出力を「255」(11111111)にする。すべてのLEDが点灯。
7 Waitms T Tミリ秒間(0.5秒間)そのまま。
8 Porta = 0 ポートAの出力を「0」(00000000)にする。すべてのLEDが消灯。
9 Waitms T Tミリ秒間(0.5秒間)そのまま。
10 Porta = 255 ポートAの出力を「255」(11111111)にする。すべてのLEDが点灯。
11 Waitms T Tミリ秒間(0.5秒間)そのまま。
12 Porta = 0 ポートAの出力を「0」(00000000)にする。すべてのLEDが消灯。
13 End 終わり。

 プログラム6行目の「Porta = 255」はポートAの出力を「255」にする命令です。10進数の255を8桁の2進数で表わすと「11111111」ですから、PA7〜PA0の出力がすべて「1」となり、8個のLEDすべてが点灯します。8行目の「Porta = 0」はポートAの出力を「0」、つまり「00000000」にする命令です。これによりすべてのLEDが消灯します。

b. ポートの出力を2進数で指定する

 今度はポートの出力を2進数で指定してみます。8個のLEDの並び順そのままの形で点灯・消灯の指定ができます。

 プログラムファイル on_off2b.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3 Config Porta = Output ポートAを出力に設定する。
4 Dim T As Word 待ち時間設定用の変数「T」を定義する。
5 T = 500 変数Tの値を500にする。(待ち時間500mS)
6 Porta = &B11111111 ポートAの出力を「11111111」にする。すべてのLEDが点灯。
7 Waitms T Tミリ秒間(0.5秒間)そのまま。
8 Porta = &B00000000 ポートAの出力を「00000000」にする。すべてのLEDが消灯。
9 Waitms T Tミリ秒間(0.5秒間)そのまま。
10 Porta = &B11111111 ポートAの出力を「11111111」にする。すべてのLEDが点灯。
11 Waitms T Tミリ秒間(0.5秒間)そのまま。
12 Porta = &B00000000 ポートAの出力を「00000000」にする。すべてのLEDが消灯。
13 End 終わり。

 6行目の「Porta = &B11111111」がポートの出力を2進数で指定する命令です。プログラム中に2進数を表記するときは頭に「&B」をつけます。これがないとマイコンは10進数の「11111111」と判断してしまいます。「&B11111111」は、PB7〜PB0の出力の状態をそのまま表わしています。今回は8個のLEDすべてを同時に点灯・消灯させていますが、例えばひとつおきに点灯させたいときは「&B10101010」と書けばいいわけで、直感的にわかりやすい書き方だと思います。

2. LEDを4個ずつ交互に点灯・消灯する

 初めにLED3〜LED0の4個を点灯、次にLED7〜LED4の4個を点灯、続いて8個すべてを点灯、最後にすべて消灯して終わるプログラムです。下図のような動作になります。

時間LED7LED6LED5LED4 LED3LED2LED1LED0
0
1
2
3

a. ポートの出力を10進数または2進数で指定する

 最初に、上でやったようにポートの出力状態を10進数、あるいは2進数で指定するやり方でやってみます。説明は不要だと思うので、プログラム文だけ示します。

10進数で指定 2進数で指定
1 $regfile = "at26def.dat" $regfile = "at26def.dat"
2 $crystal = 1000000 $crystal = 1000000
3 Config Porta = Output Config Porta = Output
4 Porta = 15 Porta = &B00001111
5 Waitms 500 Waitms 500
6 Porta = 240 Porta = &B11110000
7 Waitms 500 Waitms 500
8 Porta = 255 Porta = &B11111111
9 Waitms 500 Waitms 500
10 Porta = 0 Porta = &B00000000
11 End End

b. ポートの出力を16進数で指定する

 次に、ポートの出力を16進数で指定するプログラムを作ってみました。16進数というのは、16倍毎にひと桁繰り上がる数え方です。0〜9までの数字、及びA〜Fまでの文字を使って表わします。マイコンのプログラムでは16進数による数字の表記がよく登場します。下に、10進数、16進数、及び2進数の対照表を掲げます。

10進数16進数2進数10進数16進数2進数
000000 000016100001 0000
110000 000117110001 0001
220000 001018120001 0010
330000 001119130001 0011
440000 010020140001 0100
550000 010121150001 0101
660000 011022160001 0110
770000 011123170001 0111
880000 100024180001 1000
990000 100125190001 1001
10A0000 1010261A0001 1010
11B0000 1011271B0001 1011
12C0000 1100281C0001 1100
13D0000 1101291D0001 1101
14E0000 1110301E0001 1110
15F0000 1111311F0001 1111
10進数16進数2進数10進数16進数2進数
32200010 0000241F11111 0001
48300011 0000242F21111 0010
64400100 0000243F31111 0011
80500101 0000244F41111 0100
96600110 0000245F51111 0101
112700111 0000246F61111 0110
128801000 0000247F71111 0111
144901001 0000248F81111 1000
160A01010 0000249F91111 1001
176B01011 0000250FA1111 1010
192C01100 0000251FB1111 1011
208D01101 0000252FC1111 1100
224E01110 0000253FD1111 1101
240F01111 0000254FE1111 1110
255FF1111 1111

 最初のうちは、何で16進数なんだろうと思ったのですが、上の表をながめているうち、16進数は8桁の2進数を短く表現するのに便利な方法だと気付きました。8桁の2進数のうち、上位4桁が16進数の16の位(左側の数字)に、また下位の4桁が16進数の1の位(右側の数字)に対応しています。

 LEDを4個ずつ点灯させるプログラムを16進数で書くと下のようになります。プログラム文中に16進数の数字を書くときは頭に「&H」を付けます。「&HF」「&H0」はそれぞれ「&H0F」「&H00」と書いても同じです。

 プログラムファイル on_off2c.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3 Config Porta = Output ポートAを出力に設定する。
4 Porta = &HF ポートAの出力を「00001111」にする。LED3〜0が点灯。
5 Waitms 500 0.5秒間そのまま。
6 Porta = &HF0 ポートAの出力を「11110000」にする。LED7〜4が点灯。
7 Waitms 500 0.5秒間そのまま。
8 Porta = &HFF ポートAの出力を「11111111」にする。すべてのLEDが点灯。
9 Waitms 500 0.5秒間そのまま。
10 Porta = &H0 ポートAの出力を「00000000」にする。すべてのLEDが消灯。
11 End 終わり。