LEDの点灯パターンをあらかじめデータとして保存しておき、必要に応じてそれを呼び出して使うプログラムを試してみました。ここではLED0から順に1個ずつ点灯していく動作を「Pattern1」、点灯個数が1個ずつ増えていく動作を「Pattern2」とし、それぞれのデータを決まった場所に保存しておきます。はじめに「Pattern1」を読み込んで実行、続いて「Pattern2」を読み込んで実行します。マイコン回路は「LED点滅テスト用回路」を使用します。
プログラムファイル data1a.bas
| 1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
| 2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
| 3 | Config Porta = Output | ポートAを出力に設定する。 | |
| 4 | Dim N As Byte | データナンバー用の変数「N」を定義する。 | |
| 5 | Dim Led As Byte | LED出力用の変数「Led」を定義する。 | |
| 6 | Restore Pattern1 | 「Pattern1」のデータを呼び出す。 | |
| 7 | For N = 1 To 9 | Forループの範囲ここから。 | |
| 「Pattern1」の1番目から9番目のデータを順に読み込む。 | |||
| 8 | Read Led : Porta = Led | 読み込んだデータを変数Ledに代入。 | |
| 変数Ledの値をポートAに出力。 | |||
| 9 | Waitms 500 | 0.5秒間そのまま。 | |
| 10 | Next N | Forループの範囲ここまで。 | |
| 7行目に戻り、次のデータを読み込む。 | |||
| 11 | Restore Pattern2 | 「Pattern2」のデータを呼び出す。 | |
| 12 | For N = 1 To 9 | Forループの範囲ここから。 | |
| 「Pattern2」の1番目から9番目のデータを順に読み込む。 | |||
| 13 | Read Led : Porta = Led | 読み込んだデータを変数Ledに代入。 | |
| 変数Ledの値をポートAに出力。 | |||
| 14 | Waitms 500 | 0.5秒間そのまま。 | |
| 15 | Next N | Forループの範囲ここまで。 | |
| 12行目に戻り、次のデータを読み込む。 | |||
| 16 | End | メインプログラム終わり。 | |
| 17 | Pattern1 : | ラベル「Pattern1」。 | |
| 18 | Data 1, 2, 4, 8, 16, 32, 64, 128, 0 | 「Pattern1」内のデータ。 | |
| 19 | Pattern2 : | ラベル「Pattern2」。 | |
| 20 | Data 1, 3, 7, 15, 31, 63, 127, 255, 0 | 「Pattern2」内のデータ。 |
まず17行目以降の「データ保管庫」から説明します。17行目の「Pattern1 :」や19行目の「Pattern2 :」はひとまとまりのデータに名前を付けて他と区別するとともに、プログラム中での場所を特定するためのものです。これらはラベル(レーベル)と呼ばれます。ラベル名は予約語以外なら好きな名前を付けることができます。末尾の記号は「:」(コロン)です。ラベルの次の行に「Data」と記し、続いてデータの数値を「,」(カンマ)で区切って入力します。ここではLEDの点灯パターンを示す10進数の数字を入れました。これらの記述は「End」のあとに書く決まりになっています。
6行目の「Restore Pattern1」はラベル「Pattern1」の場所に置かれたデータを呼び出す命令です。7〜10行目はFor 〜 Nextループです。「N = 1 to 9」となっているのは、「Pattern1」内の9個のデータを1番目から順に読み込むためです。8行目の「Read Led」で、まず「Pattern1」の中にある1番目のデータ「1」を変数Ledの値として読み込み(代入)を実行します。次に「Porta = Led」で、読み込んだ値をポートAの出力とします。「Led = 1」なので「Porta =1」となり、LED0が点灯します。8行目には2つの命令があるので、間を「:」(コロン)で区切ります。
0.5秒後のForループ2回目では、「Pattern1」内の2番目のデータ「2」を変数Ledの値として読み込み、ポートAに出力します。「Porta = 2」となるのでLED2が点灯します。同様にして9番目のデータまで順に読み込んでポートAに出力します。これが終わると、ループを抜けて11行目「Pattern2」の呼び出しに移ります。
データの呼び出しに似た機能で変数の配列というのがあります。両者はどう使い分けるのかよくわかりませんが、とりあえず書き方の練習だけしました。動作は上のプログラムと同じです。
プログラムファイル data1b.bas
| 1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
| 2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
| 3 | Config Porta = Output | ポートAを出力に設定する。 | |
| 4 | Dim N As Byte | Forループ用の変数「N」を定義する。 | |
| 5 | Dim Led1(9) As Byte | LED出力用の変数「Led1」を定義する。 | |
| 6 | Dim Led2(9) As Byte | LED出力用の変数「Led2」を定義する。 | |
| 7 | Led1(1) = 1 | 変数「Led1」の1番目は「1」。 | |
| 8 | Led1(2) = 2 | 変数「Led1」の2番目は「2」。 | |
| 9 | Led1(3) = 4 | 変数「Led1」の3番目は「4」。 | |
| 10 | Led1(4) = 8 | 変数「Led1」の4番目は「8」。 | |
| 11 | Led1(5) = 16 | 変数「Led1」の5番目は「16」。 | |
| 12 | Led1(6) = 32 | 変数「Led1」の6番目は「32」。 | |
| 13 | Led1(7) = 64 | 変数「Led1」の7番目は「64」。 | |
| 14 | Led1(8) = 128 | 変数「Led1」の8番目は「128」。 | |
| 15 | Led1(9) = 0 | 変数「Led1」の9番目は「0」。 | |
| 16 | Led2(1) = 1 | 変数「Led2」の1番目は「1」。 | |
| 17 | Led2(2) = 3 | 変数「Led2」の2番目は「3」。 | |
| 18 | Led2(3) = 7 | 変数「Led2」の3番目は「7」。 | |
| 19 | Led2(4) = 15 | 変数「Led2」の4番目は「15」。 | |
| 20 | Led2(5) = 31 | 変数「Led2」の5番目は「31」。 | |
| 21 | Led2(6) = 63 | 変数「Led2」の6番目は「63」。 | |
| 22 | Led2(7) = 127 | 変数「Led2」の7番目は「127」。 | |
| 23 | Led2(8) = 255 | 変数「Led2」の8番目は「255」。 | |
| 24 | Led2(9) = 0 | 変数「Led2」の9番目は「0」。 | |
| 25 | For N = 1 To 9 | Forループの範囲ここから。 | |
| 変数「Led1」の1番目から9番目の値を順に読み込む。 | |||
| 26 | Porta = Led1(n) | 変数「Led1」の値をポートAに出力。 | |
| 27 | Waitms 500 | 0.5秒間そのまま。 | |
| 28 | Next N | Forループの範囲ここまで。 | |
| 25行目に戻り、次の値を読み込む。 | |||
| 29 | For N = 1 To 9 | Forループの範囲ここから。 | |
| 変数「Led2」の1番目から9番目の値を順に読み込む。 | |||
| 30 | Porta = Led2(n) | 変数「Led2」の値をポートAに出力。 | |
| 31 | Waitms 500 | 0.5秒間そのまま。 | |
| 32 | Next N | Forループの範囲ここまで。 | |
| 29行目に戻り、次の値を読み込む。 | |||
| 33 | End | 終わり。 |
変数の配列というのは、データの配列と似ています。変数が取り得る値とその順番をあらかじめ決めておくものです。このプログラムでは「Led1」と「Led2」の2つの変数の配列があり、それぞれの値は下記のようになります。数値は前のプログラムの「Data」と同じです。
| 順番 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| Led1の値 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 0 |
| Led2の値 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 255 | 0 |
5行目と6行目のところで変数が「Led1(9)」「Led2(9)」となっているのは、それぞれ9個の値を取るという意味です。7行目から24行目は、2つの変数の値を順番に列挙しています。25行目「For N = 1 To 9」は変数の1番目から9番目の値を順に読み込んでいく命令です。まず「Led1」の1番目の値「1」をポートAに出力し、0.5秒後に2番目の値「2」をポートAに出力します。9番目の値まで出力したらループを抜けて29行目に移り、今度は「Led2」の値を順に読み込んで出力します。