図(OAKS16プログラミングテキストより引用)のようにLED点灯を移動させる動作を無限に繰り返せ.(サンプルを参考にして,タイマー機能を使って0.5秒間隔でLED一つ分移動するようなプログラムを作成せよ.)
p7 = 0xFE; //2進で 1111 1110 (点灯するLEDが右端1つだけにするデータ)->LED(port7番)に書き込み ↓ 0.5秒後 p7 = 0xFD; //2進で 1111 1101 (点灯するLEDが右から2つ目だけにするデータ)->LED(port7番)に書き込み ↓ 0.5秒後 p7 = また1つ分移動したように見せるためのデータ //それをLEDに書き込み ↓ (以下略)
p7 = p7buf = 0xFE; //2進で1111 1110 (初期値)を,p7だけでなくp7bufに書き込んで記憶しておく ↓ 0.5秒後 p7 = p7buf = 前のp7bufを使って計算したデータ //2進で1111 1101 になるように,p7bufに記憶されている直前のデータを1つ移動させる ↓ 0.5秒後 p7 = p7buf = 前のp7bufを使って計算したデータ //以下同様に,1つ移動するように計算 ↓ (以下略)
p7 = p7buf = 初期値; //p7bufに初期値を格納して,LEDを点灯そして次の部分を繰り返せばよい.これを0.5秒に一回だけ実行したいのだから,サンプルプログラムのどの部分に書けばよいのか.
p7 = p7buf = 前のp7bufを使って計算したデータ
00001000 11110111 ↓ ◎ ↓ × 00010000 11101110 ←シフトすると0が埋められてしまう!!
練習課題を少し変更する.右から左へLED点灯が移動して左端まできたら,今度は移動する方向を逆にして,左から右へ移動するようにせよ. そして右端まできたらまた方向を変えて後は同じ動作を繰り返すようにせよ.
例: flagが0なら左シフト,flagが1なら右シフト ←自分で勝手に決めてよい
1/10秒精度のストップウォッチを作成せよ.表示はLEDで1/10秒を二進数の1として表示する.つまり,プログラミングテキストP79のように,1/10秒ごとに二進数をカウントアップさせよ.カウントが8bitからあふれたとき(25.6秒)以降はその分を単純に無視して,また0秒に表示が戻ってしまって構わない.sw9がスタート/ストップボタン、sw10をクリアボタンとする.