ブレッドボードラジオAVRマイコン入門

BASCOM-AVR 入力スイッチ(その4)

 入力スイッチを2個使うプログラムをいくつか試してみました。マイコン回路は「入力スイッチテスト用回路」を少し配線変更して使用します。

1. 入力スイッチを押すとLEDが点灯、リセットスイッチを押すと消灯する

 最初に、「入力スイッチテスト用回路」そのままで、入力スイッチをチョンと押すとLED0が点灯、リセットスイッチをチョンと押すと消灯するプログラムをやってみます。図に描くと下記のような動作です。このプログラムは「入力スイッチ(その1)」の「input1c.bas」から「Else」命令を取り去ったものです。

 第1図

 プログラムファイル input4a.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3 Config Porta = Output ポートAを出力に設定する。
4 Config Portb = Input ポートBを入力に設定する。
5 Portb = 1 PB0をプルアップする。
6 Do Doループの範囲ここから。
7  If Pinb.0 = 0 Then 条件分岐のプログラムここから。
もし「Pinb.0 = 0」ならば次行のプログラムを実行。
8  Porta = 1 ポートAを「1」にする。LED0が点灯。
9  End If 条件分岐のプログラムここまで。
10 Loop Doループの範囲ここまで。6行目へ戻る
11 End 終わり。

 「Else」命令( Else : Porta = 0 )がないと、いったん入力スイッチを押してLEDが点灯するとそのまま点灯しっ放しになります。リセットスイッチを押すとプログラムが最初に戻るのでLEDは消灯します。

2. スイッチ1を押すと点灯、スイッチ2を押すと消灯する

 上記と同じ動作をポートBにつないだ2個の入力スイッチでやってみました。回路図を下に掲げます。PB0とPB6(9番ピン)に入力スイッチを接続します。私はリセットスイッチをつなぎ替えてS2にしました。

 第2図

 プログラムファイル input4b.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3 Config Porta = Output ポートAを出力に設定する。
4 Config Portb = Input ポートBを入力に設定する。
5 Portb = &B01000001 PB0とPB6をプルアップする。
6 Do Doループの範囲ここから。
7  If Pinb.0 = 0 Then 条件分岐1ここから。「Pinb.0 = 0」(S1が押された)ならば、
8  Porta = 1 ポートAを「1」にする。LED0が点灯。
9  End If 条件分岐1ここまで。
10  If Pinb.6 = 0 Then 条件分岐2ここから。「Pinb.6 = 0」(S2が押された)ならば、
11  Porta = 0 ポートAを「0」にする。LED0が消灯。
12  End If 条件分岐2ここまで。
13 Loop Doループの範囲ここまで。6行目へ戻る
14 End 終わり。

 5行目「Portb = &B01000001」はポートBの状態を2進数で指定するものです。これでスイッチがつながっているPB0とPB6がプルアップされます。スイッチの状態を判断するプログラムは「Pinb.0」(S1)用と「Pinb.6」(S2)用の2つあります。

3. LEDの順次点灯の移動方向が変わる

 8個のLEDのうち1個だけが点灯しています。S1を1回押す(Pinb.0 = 0になる)たびに、点灯するLEDが右へ1個ずつ移動します。S2を押す(Pinb.6 = 0になる)と左へ移動します。このプログラムは入力スイッチのデバウンス処理が必要です。回路は上記と同じものを使用します。

 プログラムファイル input4c.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3 Config Porta = Output ポートAを出力に設定する。
4 Config Portb = Input ポートBを入力に設定する。
5 Portb = &B01000001 PB0とPB6をプルアップする。
6 Declare Sub Led_right サブルーチン「Led_right」を使用する。
7 Declare Sub Led_left サブルーチン「Led_left」を使用する。
8 Porta = 1 ポートAを「1」にする。LED0が点灯。
9 Do Doループの範囲ここから。
10  Debounce Pinb.0 , 0 , Led_right , Sub 「Pinb.0 = 0」ならばサブルーチン「Led_right」を実行。
11  Debounce Pinb.6 , 0 , Led_left , Sub 「Pinb.6 = 0」ならばサブルーチン「Led_left」を実行。
12 Loop Doループの範囲ここまで。9行目へ戻る
13 End メインプログラム終わり。
14 Sub Led_right サブルーチン「Led_right」ここから。
15  Rotate Porta , right ポートAの状態を1ビット右に回転させる。
16 End Sub サブルーチン「Led_right」ここまで。
17 Sub Led_left サブルーチン「Led_left」ここから。
18  Rotate Porta , Left ポートAの状態を1ビット左に回転させる。
19 End Sub サブルーチン「Led_left」ここまで。