ポート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 | 終わり。 |