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

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

 ポートAに接続した8個のLEDを、右(LED0)から順に1個ずつ点灯させるプログラムを実験しました。動作のようすは下の図のようになります。マイコン回路は「LED点滅テスト用回路」を使用します。

時間LED7LED6LED5LED4 LED3LED2LED1LED0
0
1
2
3
4
5
6
7
8

1. 出力端子を順次「1」にする

 まずは一番ベタな方法として、PA0から順番にひとつずつ「1」にしていくプログラムを作りました。現在点灯しているLEDを消灯してから、左隣のLEDを点灯させる命令を書きます。1行に2つの命令を書くときは「:」(コロン)で区切ります。なお、「Porta.0 = 1」の部分を「Set Porta.0」、「Porta.0 = 0」の部分を「Reset Porta.0」と書いても同じです。

 プログラムファイル on_off3a.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.0 = 1 PA0を「1」にする。LED0が点灯。
7 Waitms T Tミリ秒間(0.5秒間)そのまま。
8 Porta.0 = 0 : Porta.1 = 1 LED0を消灯。LED1を点灯。
9 Waitms T Tミリ秒間(0.5秒間)そのまま。
10 Porta.1 = 0 : Porta.2 = 1 LED1を消灯。LED2を点灯。
11 Waitms T Tミリ秒間(0.5秒間)そのまま。
12 Porta.2 = 0 : Porta.3 = 1 LED2を消灯。LED3を点灯。
13 Waitms T Tミリ秒間(0.5秒間)そのまま。
14 Porta.3 = 0 : Porta.4 = 1 LED3を消灯。LED4を点灯。
15 Waitms T Tミリ秒間(0.5秒間)そのまま。
16 Porta.4 = 0 : Porta.5 = 1 LED4を消灯。LED5を点灯。
17 Waitms T Tミリ秒間(0.5秒間)そのまま。
18 Porta.5 = 0 : Porta.6 = 1 LED5を消灯。LED6を点灯。
19 Waitms T Tミリ秒間(0.5秒間)そのまま。
20 Porta.6 = 0 : Porta.7 = 1 LED6を消灯。LED7を点灯。
21 Waitms T Tミリ秒間(0.5秒間)そのまま。
22 Porta.7 = 0 LED7を消灯。
23 End 終わり。

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

 今度はポートの出力を2進数で指定してみます。8個のLEDのうち、点灯させたいものを「1」に、消灯させたいものを「0」にします。

 プログラムファイル on_off3c.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 = &B00000001 ポートAの出力を「00000001」にする。LED0のみ点灯。
7 Waitms T Tミリ秒間(0.5秒間)そのまま。
8 Porta = &B00000010 ポートAの出力を「00000010」にする。LED1のみ点灯。
9 Waitms T Tミリ秒間(0.5秒間)そのまま。
10 Porta = &B00000100 ポートAの出力を「00000100」にする。LED2のみ点灯。
11 Waitms T Tミリ秒間(0.5秒間)そのまま。
12 Porta = &B00001000 ポートAの出力を「00001000」にする。LED3のみ点灯。
13 Waitms T Tミリ秒間(0.5秒間)そのまま。
14 Porta = &B00010000 ポートAの出力を「00010000」にする。LED4のみ点灯。
15 Waitms T Tミリ秒間(0.5秒間)そのまま。
16 Porta = &B00100000 ポートAの出力を「00100000」にする。LED5のみ点灯。
17 Waitms T Tミリ秒間(0.5秒間)そのまま。
18 Porta = &B01000000 ポートAの出力を「01000000」にする。LED6のみ点灯。
19 Waitms T Tミリ秒間(0.5秒間)そのまま。
20 Porta = &B10000000 ポートAの出力を「10000000」にする。LED7のみ点灯。
21 Waitms T Tミリ秒間(0.5秒間)そのまま。
22 Porta = &B00000000 ポートAの出力を「00000000」にする。すべて消灯。
23 End 終わり。

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

 「その2」でやったように、ポートの出力を16進数で指定することもできます。PA7〜PA0を8桁の2進数と考え、上位4桁と下位4桁をそれぞれ16進数(1〜F)に変換すればOKです。

 プログラムファイル on_off3d.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 = &H1 ポートAの出力を「00000001」にする。LED0のみ点灯。
7 Waitms T Tミリ秒間(0.5秒間)そのまま。
8 Porta = &H2 ポートAの出力を「00000010」にする。LED1のみ点灯。
9 Waitms T Tミリ秒間(0.5秒間)そのまま。
10 Porta = &H4 ポートAの出力を「00000100」にする。LED2のみ点灯。
11 Waitms T Tミリ秒間(0.5秒間)そのまま。
12 Porta = &H8 ポートAの出力を「00001000」にする。LED3のみ点灯。
13 Waitms T Tミリ秒間(0.5秒間)そのまま。
14 Porta = &H10 ポートAの出力を「00010000」にする。LED4のみ点灯。
15 Waitms T Tミリ秒間(0.5秒間)そのまま。
16 Porta = &H20 ポートAの出力を「00100000」にする。LED5のみ点灯。
17 Waitms T Tミリ秒間(0.5秒間)そのまま。
18 Porta = &H40 ポートAの出力を「01000000」にする。LED6のみ点灯。
19 Waitms T Tミリ秒間(0.5秒間)そのまま。
20 Porta = &H80 ポートAの出力を「10000000」にする。LED7のみ点灯。
21 Waitms T Tミリ秒間(0.5秒間)そのまま。
22 Porta = &H0 ポートAの出力を「00000000」にする。すべて消灯。
23 End 終わり。

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

 ついでに、ポートの出力を10進数で指定するプログラムも書いておきます。今回は点灯のパターンが単純なので数値が2倍に増えていくだけですが、複雑な点灯パターンにすると換算が面倒なので2進数か16進数で書くのが良いと思います。

 プログラムファイル on_off3b.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 = 1 ポートAの出力を「00000001」にする。LED0のみ点灯。
7 Waitms T Tミリ秒間(0.5秒間)そのまま。
8 Porta = 2 ポートAの出力を「00000010」にする。LED1のみ点灯。
9 Waitms T Tミリ秒間(0.5秒間)そのまま。
10 Porta = 4 ポートAの出力を「00000100」にする。LED2のみ点灯。
11 Waitms T Tミリ秒間(0.5秒間)そのまま。
12 Porta = 8 ポートAの出力を「00001000」にする。LED3のみ点灯。
13 Waitms T Tミリ秒間(0.5秒間)そのまま。
14 Porta = 16 ポートAの出力を「00010000」にする。LED4のみ点灯。
15 Waitms T Tミリ秒間(0.5秒間)そのまま。
16 Porta = 32 ポートAの出力を「00100000」にする。LED5のみ点灯。
17 Waitms T Tミリ秒間(0.5秒間)そのまま。
18 Porta = 64 ポートAの出力を「01000000」にする。LED6のみ点灯。
19 Waitms T Tミリ秒間(0.5秒間)そのまま。
20 Porta = 128 ポートAの出力を「10000000」にする。LED7のみ点灯。
21 Waitms T Tミリ秒間(0.5秒間)そのまま。
22 Porta = 0 ポートAの出力を「00000000」にする。すべて消灯。
23 End 終わり。