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」の値を順に読み込んで出力します。