入力スイッチを2個使うプログラムをいくつか試してみました。マイコン回路は「入力スイッチテスト用回路」を少し配線変更して使用します。
最初に、「入力スイッチテスト用回路」そのままで、入力スイッチをチョンと押すとLED0が点灯、リセットスイッチをチョンと押すと消灯するプログラムをやってみます。図に描くと下記のような動作です。このプログラムは「入力スイッチ(その1)」の「input1c.bas」から「Else」命令を取り去ったものです。
プログラムファイル 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は消灯します。
上記と同じ動作をポートBにつないだ2個の入力スイッチでやってみました。回路図を下に掲げます。PB0とPB6(9番ピン)に入力スイッチを接続します。私はリセットスイッチをつなぎ替えてS2にしました。
プログラムファイル 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つあります。
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」ここまで。 |