LEDを連続して点滅させるプログラムを各種試してみました。マイコン回路は「LED点滅テスト用回路」を使用します。
ポートAの1番(PA0)につないだLED(LED0)を0.5秒間隔で連続して点滅させるプログラムです。永久ループとよばれる「Do〜Loop」を使います。BASCOM-AVRがインストールされたパソコンで下記リンクをクリックしてファイルをダウンロードすると、BASCOM-AVR IDEが自動的に立ち上がって画面内にプログラムが表示されます。
プログラムファイル blink1a.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta = Output | ポートAを出力に設定する。 | |
4 | Do | Doループの範囲ここから。 | |
5 | Porta.0 = 1 | PA0の出力を「1」にする。LED0が点灯。 | |
6 | Waitms 500 | 0.5秒間そのまま。 | |
7 | Porta.0 = 0 | PA0の出力を「0」にする。LED0が消灯。 | |
8 | Waitms 500 | 0.5秒間そのまま。 | |
9 | Loop | Doループの範囲ここまで。4行目へ戻る。 | |
10 | End | 終わり。 |
4行目「Do」と9行目「Loop」がDoループと呼ばれるもので、この2つにはさまれた部分のプログラムを無限に繰り返します。今回の例ではLED0が0.5秒間点灯、続いて0.5秒間消灯するプログラムが入っていますので、LED0は0.5秒毎に点灯、消灯を繰り返すことになります。
LEDを点灯・消灯させるのに「Toggle」という命令を使うことができます。「Toggle」は、ポート出力が「0」なら「1」に、「1」なら「0」に変える命令です。
プログラムファイル blink1b.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta = Output | ポートAを出力に設定する。 | |
4 | Do | Doループの範囲ここから。 | |
5 | Toggle Porta.0 | PA0の出力を反転する。 LED0が点灯していたら消灯、消灯していたら点灯する。 | |
6 | Waitms 500 | 0.5秒間そのまま。 | |
7 | Loop | Doループの範囲ここまで。4行目へ戻る。 | |
8 | End | 終わり。 |
プログラムがスタートした時点ではLEDは消灯しています(Porta.0 = 0)。5行目の「Toggle Porta.0」でPA0の状態が反転して「1」になり、LEDは点灯します。ループ2回目の「Toggle Porta.0」でまた「0」に戻ってLEDは消灯します。これの繰り返しでLEDは点滅します。
プログラムのスタート地点に名前(ラベル)を付けておき、プログラムの最後に「Goto (ラベル)」と書くことによって、プログラムはラベルとGotoの間を無限にループします。
プログラムファイル blink1c.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta = Output | ポートAを出力に設定する。 | |
4 | Main: | この場所に「Main」という名前を付ける。 | |
5 | Toggle Porta.0 | PA0の出力を反転する。 | |
LED0が点灯していたら消灯、消灯していたら点灯する。 | |||
6 | Waitms 500 | 0.5秒間そのまま。 | |
7 | Goto Main | 4行目「Main」へ戻る。 | |
8 | End | 終わり。 |
先のプログラムの「Do 〜 Loop」が「Main: 〜 Goto Main」に変わっただけです。「Main:」のところは自分の好きな名前を付けることができますが、こういうプログラムの場合は「Main」というラベル名にするのが慣例になっているようです。ラベルの最後には「:」(コロン)を付けます。「Main: 〜 Goto Main」という書き方は「古臭い」という人もいます。
8個のLEDがLED0から順に1個ずつ点灯していく動作を無限に繰り返すプログラムです。LED7が点灯すると次は最初に戻ってLED0が点灯します。
プログラムファイル blink1d.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta = Output | ポートAを出力に設定する。 | |
4 | Dim N As Byte | バイト型変数「N」を定義する。 | |
5 | Porta.0 = 1 | PA0を「1」にする。LED0が点灯。 | |
6 | Do | Doループの範囲ここから。 | |
7 | For N = 1 to 8 | Forループの範囲ここから。 | |
変数Nに1から8を順に代入する。 | |||
8 | Waitms 500 | 0.5秒間そのまま。 | |
9 | Rotate Porta , Left | ポートAの出力を1ビット左に回転させる。 | |
左隣のLEDが点灯する。 | |||
10 | Next N | Forループの範囲ここまで。 | |
7行目へ戻り、Nに1を加えて繰り返し。 | |||
11 | Loop | Doループの範囲ここまで。6行目へ戻る。 | |
12 | End | 終わり。 |
7行目から10行目のForループは「LEDの点灯・消灯(その4)」の「on_off4a.bas」と同じです。この部分でLED0〜LED7が順に点灯し、8巡目でLED0に戻ります。このプログラムが「Do 〜 Loop」に挟まれているので、LEDは順次点滅を無限に繰り返します。