1 / 12

キー処理とカウンタの作成

キー処理とカウンタの作成. 改訂版  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];

cree
Download Presentation

キー処理とカウンタの作成

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. キー処理とカウンタの作成 改訂版 2009/10/28

  2. 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

  3. レジスタの設定 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

  4. 完全な動作を保障する • オーバーフロー時の動作 • if (timer % 1000) と記述した場合を考える 4294967000 0xFFFFFED8 4294967295 0xFFFFFFFF 0000000000 0x00000000 • 4,294,967秒(≒49.7日)に一度動作が乱れる

  5. キー処理 • 人間が一回swを押す • 一回押す間にプログラムは何回も回ってる SW_OFF SW_ON x+1 x+1 x+1 void main(){  : if(!P7DR.BIT.B7) x++; : }

  6. スイッチの判定 • スイッチを押すごとにカウントアップする • スイッチを押し続けても1だけカウントアップする

  7. エッジの検出 • エッジ(立上がり、立下り)を検出する • フラグを利用する オン オフ SW_OFF SW_ON 立下りエッジ 立上がりエッジ フラグON カウント+1 フラグOFF

  8. || 使用例 • PCのキーボード • 押したままにしない限り、一文字ずつ入力 エッジ検出しない場合:   一度押しただけでも、長押しと同様に同じ文字が並ぶ (k → kkkkkkkk・・・) • ミュージックプレーヤーの再生・一時停止ボタン • 再生ボタンを一度押したら再生、もう一度で停止 エッジ検出しない場合:   一度押しただけでも、再生と一時停止を繰り返し押している状態になる   (    →          ・・・ ) || ||

  9. 課題に必要となる技術 • スイッチを押す • 7SEG LEDに数字を表示する • ブザーを鳴らす • タイマーカウント

  10. 演習のヒント1 • タイマーのスタートストップ • reset関数でITU.TSTR.BIT.STR0 = 1;という記述でタイマーをスタートとさせているが、 ITU.TSTR.BIT.STR0 をmain関数で操作することは好ましくない。 • タイマーを用いて7SEGの表示もしている • ヒント:表示する数値のカウントだけ止める方法を考える • If文で場合分け

  11. 演習のヒント2 • hhmmssとは時分秒のこと • 3時間25分8秒であれば、03.25.08 という風に表示 • display関数の中身は変更しない • 時分秒への直し方 • timerの値を,hour(時),min(分),sec(秒)に直して使う

  12. 課題のヒント • キー処理 • “押して離す”という一連の操作で”1カウント”と考える • main関数は何度も実行される

More Related