ポートAに接続した8個のLEDを、右(LED0)から順に1個ずつ点灯させるプログラムを実験しました。動作のようすは下の図のようになります。マイコン回路は「LED点滅テスト用回路」を使用します。
時間 | LED7 | LED6 | LED5 | LED4 | LED3 | LED2 | LED1 | LED0 |
0 | ||||||||
1 | ||||||||
2 | ||||||||
3 | ||||||||
4 | ||||||||
5 | ||||||||
6 | ||||||||
7 | ||||||||
8 |
まずは一番ベタな方法として、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進数で指定してみます。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 | 終わり。 |
「その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 | 終わり。 |
ついでに、ポートの出力を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 | 終わり。 |