ポートAに接続した8個のLEDを同時に点灯・消灯するプログラム、及び、4個ずつ交互に点灯するプログラムを実験しました。マイコン回路は「LED点滅テスト用回路」を使用します。
ICのポートAにつないだ8個のLED(LED7〜LED0)すべてを0.5秒おきに2回点灯させるプログラムです。プログラムを実行するとLEDは下の図のように点灯・消灯します。赤丸が点灯、白丸が消灯を表わしています。
時間 | LED7 | LED6 | LED5 | LED4 | LED3 | LED2 | LED1 | LED0 |
0 | ||||||||
1 | ||||||||
2 | ||||||||
3 |
ポートの出力を10進数で指定します。IC内部で8桁の2進数に変換され、PB7〜PB0が「1」または「0」になります。
プログラムファイル on_off2a.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta = Output | ポートAを出力に設定する。 | |
4 | Dim T As Word | 待ち時間設定用の変数「T」を定義する。 | |
5 | T = 500 | 変数Tの値を500にする。(待ち時間500mS) | |
6 | Porta = 255 | ポートAの出力を「255」(11111111)にする。すべてのLEDが点灯。 | |
7 | Waitms T | Tミリ秒間(0.5秒間)そのまま。 | |
8 | Porta = 0 | ポートAの出力を「0」(00000000)にする。すべてのLEDが消灯。 | |
9 | Waitms T | Tミリ秒間(0.5秒間)そのまま。 | |
10 | Porta = 255 | ポートAの出力を「255」(11111111)にする。すべてのLEDが点灯。 | |
11 | Waitms T | Tミリ秒間(0.5秒間)そのまま。 | |
12 | Porta = 0 | ポートAの出力を「0」(00000000)にする。すべてのLEDが消灯。 | |
13 | End | 終わり。 |
プログラム6行目の「Porta = 255」はポートAの出力を「255」にする命令です。10進数の255を8桁の2進数で表わすと「11111111」ですから、PA7〜PA0の出力がすべて「1」となり、8個のLEDすべてが点灯します。8行目の「Porta = 0」はポートAの出力を「0」、つまり「00000000」にする命令です。これによりすべてのLEDが消灯します。
今度はポートの出力を2進数で指定してみます。8個のLEDの並び順そのままの形で点灯・消灯の指定ができます。
プログラムファイル on_off2b.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta = Output | ポートAを出力に設定する。 | |
4 | Dim T As Word | 待ち時間設定用の変数「T」を定義する。 | |
5 | T = 500 | 変数Tの値を500にする。(待ち時間500mS) | |
6 | Porta = &B11111111 | ポートAの出力を「11111111」にする。すべてのLEDが点灯。 | |
7 | Waitms T | Tミリ秒間(0.5秒間)そのまま。 | |
8 | Porta = &B00000000 | ポートAの出力を「00000000」にする。すべてのLEDが消灯。 | |
9 | Waitms T | Tミリ秒間(0.5秒間)そのまま。 | |
10 | Porta = &B11111111 | ポートAの出力を「11111111」にする。すべてのLEDが点灯。 | |
11 | Waitms T | Tミリ秒間(0.5秒間)そのまま。 | |
12 | Porta = &B00000000 | ポートAの出力を「00000000」にする。すべてのLEDが消灯。 | |
13 | End | 終わり。 |
6行目の「Porta = &B11111111」がポートの出力を2進数で指定する命令です。プログラム中に2進数を表記するときは頭に「&B」をつけます。これがないとマイコンは10進数の「11111111」と判断してしまいます。「&B11111111」は、PB7〜PB0の出力の状態をそのまま表わしています。今回は8個のLEDすべてを同時に点灯・消灯させていますが、例えばひとつおきに点灯させたいときは「&B10101010」と書けばいいわけで、直感的にわかりやすい書き方だと思います。
初めにLED3〜LED0の4個を点灯、次にLED7〜LED4の4個を点灯、続いて8個すべてを点灯、最後にすべて消灯して終わるプログラムです。下図のような動作になります。
時間 | LED7 | LED6 | LED5 | LED4 | LED3 | LED2 | LED1 | LED0 |
0 | ||||||||
1 | ||||||||
2 | ||||||||
3 |
最初に、上でやったようにポートの出力状態を10進数、あるいは2進数で指定するやり方でやってみます。説明は不要だと思うので、プログラム文だけ示します。
行 | 10進数で指定 | 2進数で指定 |
1 | $regfile = "at26def.dat" | $regfile = "at26def.dat" |
2 | $crystal = 1000000 | $crystal = 1000000 |
3 | Config Porta = Output | Config Porta = Output |
4 | Porta = 15 | Porta = &B00001111 |
5 | Waitms 500 | Waitms 500 |
6 | Porta = 240 | Porta = &B11110000 |
7 | Waitms 500 | Waitms 500 |
8 | Porta = 255 | Porta = &B11111111 |
9 | Waitms 500 | Waitms 500 |
10 | Porta = 0 | Porta = &B00000000 |
11 | End | End |
次に、ポートの出力を16進数で指定するプログラムを作ってみました。16進数というのは、16倍毎にひと桁繰り上がる数え方です。0〜9までの数字、及びA〜Fまでの文字を使って表わします。マイコンのプログラムでは16進数による数字の表記がよく登場します。下に、10進数、16進数、及び2進数の対照表を掲げます。
10進数 | 16進数 | 2進数 | 10進数 | 16進数 | 2進数 |
0 | 0 | 0000 0000 | 16 | 10 | 0001 0000 |
1 | 1 | 0000 0001 | 17 | 11 | 0001 0001 |
2 | 2 | 0000 0010 | 18 | 12 | 0001 0010 |
3 | 3 | 0000 0011 | 19 | 13 | 0001 0011 |
4 | 4 | 0000 0100 | 20 | 14 | 0001 0100 |
5 | 5 | 0000 0101 | 21 | 15 | 0001 0101 |
6 | 6 | 0000 0110 | 22 | 16 | 0001 0110 |
7 | 7 | 0000 0111 | 23 | 17 | 0001 0111 |
8 | 8 | 0000 1000 | 24 | 18 | 0001 1000 |
9 | 9 | 0000 1001 | 25 | 19 | 0001 1001 |
10 | A | 0000 1010 | 26 | 1A | 0001 1010 |
11 | B | 0000 1011 | 27 | 1B | 0001 1011 |
12 | C | 0000 1100 | 28 | 1C | 0001 1100 |
13 | D | 0000 1101 | 29 | 1D | 0001 1101 |
14 | E | 0000 1110 | 30 | 1E | 0001 1110 |
15 | F | 0000 1111 | 31 | 1F | 0001 1111 |
10進数 | 16進数 | 2進数 | 10進数 | 16進数 | 2進数 |
32 | 20 | 0010 0000 | 241 | F1 | 1111 0001 |
48 | 30 | 0011 0000 | 242 | F2 | 1111 0010 |
64 | 40 | 0100 0000 | 243 | F3 | 1111 0011 |
80 | 50 | 0101 0000 | 244 | F4 | 1111 0100 |
96 | 60 | 0110 0000 | 245 | F5 | 1111 0101 |
112 | 70 | 0111 0000 | 246 | F6 | 1111 0110 |
128 | 80 | 1000 0000 | 247 | F7 | 1111 0111 |
144 | 90 | 1001 0000 | 248 | F8 | 1111 1000 |
160 | A0 | 1010 0000 | 249 | F9 | 1111 1001 |
176 | B0 | 1011 0000 | 250 | FA | 1111 1010 |
192 | C0 | 1100 0000 | 251 | FB | 1111 1011 |
208 | D0 | 1101 0000 | 252 | FC | 1111 1100 |
224 | E0 | 1110 0000 | 253 | FD | 1111 1101 |
240 | F0 | 1111 0000 | 254 | FE | 1111 1110 |
255 | FF | 1111 1111 |
最初のうちは、何で16進数なんだろうと思ったのですが、上の表をながめているうち、16進数は8桁の2進数を短く表現するのに便利な方法だと気付きました。8桁の2進数のうち、上位4桁が16進数の16の位(左側の数字)に、また下位の4桁が16進数の1の位(右側の数字)に対応しています。
LEDを4個ずつ点灯させるプログラムを16進数で書くと下のようになります。プログラム文中に16進数の数字を書くときは頭に「&H」を付けます。「&HF」「&H0」はそれぞれ「&H0F」「&H00」と書いても同じです。
プログラムファイル on_off2c.bas
1 | $regfile = "at26def.dat" | ATtiny26Lを使用する。 | |
2 | $crystal = 1000000 | クロック周波数を1MHzに設定。 | |
3 | Config Porta = Output | ポートAを出力に設定する。 | |
4 | Porta = &HF | ポートAの出力を「00001111」にする。LED3〜0が点灯。 | |
5 | Waitms 500 | 0.5秒間そのまま。 | |
6 | Porta = &HF0 | ポートAの出力を「11110000」にする。LED7〜4が点灯。 | |
7 | Waitms 500 | 0.5秒間そのまま。 | |
8 | Porta = &HFF | ポートAの出力を「11111111」にする。すべてのLEDが点灯。 | |
9 | Waitms 500 | 0.5秒間そのまま。 | |
10 | Porta = &H0 | ポートAの出力を「00000000」にする。すべてのLEDが消灯。 | |
11 | End | 終わり。 |