120 likes | 332 Views
キー処理とカウンタの作成. 改訂版 2009/10/28. scan 関数 void scan(void){ PADR.BYTE = PADR.BYTE&0x10+line; P4DR.BYTE = led[line]; if(line == 5){ line = 0; }else{ line++; } }. display 関数 void display(unsigned long x){ led[0] = seg_table[(x/ 1) % 10]; led[1] = seg_table[(x/ 10) % 10];
E N D
キー処理とカウンタの作成 改訂版 2009/10/28
scan関数 void scan(void){ PADR.BYTE = PADR.BYTE&0x10+line; P4DR.BYTE = led[line]; if(line == 5){ line = 0; }else{ line++; } } display関数 void display(unsigned long x){ led[0] = seg_table[(x/ 1) % 10]; led[1] = seg_table[(x/ 10) % 10]; led[2] = seg_table[(x/ 100) % 10]; led[3] = seg_table[(x/ 1000) % 10]; led[4] = seg_table[(x/ 10000) % 10]; led[5] = seg_table[(x/100000) % 10]; } 先週の回答例1
レジスタの設定 ITU0.TCR.BYTE = 0xa0;//分周比とGRA0コンペアマッチのクリア条件の設定 ITU0.GRA = 16000; //GRA0の値を設定。マイコンは16Mhzで動いている。 ITU.TSTR.BIT.STR0 = 1; //タイマーのスタート タイマー if(ITU.TISRA.BIT.IMFA0 = 1){ //1/1000秒でIMFA0の値が1になる scan(); timer++; //1/1000秒でカウントアップ display(timer/1000); //timerの値を秒に直しdisplay関数に引き渡す ITU.TISRA.BIT.IMFA0 = 0; //IMFA0を手動で0に戻す } 先週の回答例2
完全な動作を保障する • オーバーフロー時の動作 • if (timer % 1000) と記述した場合を考える 4294967000 0xFFFFFED8 4294967295 0xFFFFFFFF 0000000000 0x00000000 • 4,294,967秒(≒49.7日)に一度動作が乱れる
キー処理 • 人間が一回swを押す • 一回押す間にプログラムは何回も回ってる SW_OFF SW_ON x+1 x+1 x+1 void main(){ : if(!P7DR.BIT.B7) x++; : }
スイッチの判定 • スイッチを押すごとにカウントアップする • スイッチを押し続けても1だけカウントアップする
エッジの検出 • エッジ(立上がり、立下り)を検出する • フラグを利用する オン オフ SW_OFF SW_ON 立下りエッジ 立上がりエッジ フラグON カウント+1 フラグOFF
|| 使用例 • PCのキーボード • 押したままにしない限り、一文字ずつ入力 エッジ検出しない場合: 一度押しただけでも、長押しと同様に同じ文字が並ぶ (k → kkkkkkkk・・・) • ミュージックプレーヤーの再生・一時停止ボタン • 再生ボタンを一度押したら再生、もう一度で停止 エッジ検出しない場合: 一度押しただけでも、再生と一時停止を繰り返し押している状態になる ( → ・・・ ) || ||
課題に必要となる技術 • スイッチを押す • 7SEG LEDに数字を表示する • ブザーを鳴らす • タイマーカウント
演習のヒント1 • タイマーのスタートストップ • reset関数でITU.TSTR.BIT.STR0 = 1;という記述でタイマーをスタートとさせているが、 ITU.TSTR.BIT.STR0 をmain関数で操作することは好ましくない。 • タイマーを用いて7SEGの表示もしている • ヒント:表示する数値のカウントだけ止める方法を考える • If文で場合分け
演習のヒント2 • hhmmssとは時分秒のこと • 3時間25分8秒であれば、03.25.08 という風に表示 • display関数の中身は変更しない • 時分秒への直し方 • timerの値を,hour(時),min(分),sec(秒)に直して使う
課題のヒント • キー処理 • “押して離す”という一連の操作で”1カウント”と考える • main関数は何度も実行される