nobcha23の日記

PICマイコンやArduinoを使う電子回路遊びを紹介します

ピポパ電話機用押しボタン(その5)

AVRでのi2cキーパッドスレーブの話をばんとさんから紹介
受けて、pic村界隈で真似するプロジェクトです。

丁度i2c端子とかlcdが付いたPIC16F1827プリント基板をこ
の間作ったところなので、これにキーパッド追加し実験し
ます。

回路図は昨日。http://d.hatena.ne.jp/nobcha23/20120917/1347852852

まずはキーパッド入力のデバッグからスタートします。そ
の3で示したようにLCDの4ビット接続データ駆動信号線を
共用し、4コラム(d-g)を0レベルで駆動。、3ライン(a-c)
の0レベル判定し、クロスマトリックスから押されたキー
を判定することにしました。キー駆動、キーセンスはタイ
マー1を利用した同期駆動5-10msぐらいの予定。対チャタ
リングは2回センスでキー入力とみなし、長押しカウンタ
は100回で判定とします。

キー駆動、キーセンスはこんなコードになる予定。
割り込みサービスの中で・・
  if(TMR1IF==1){
   cnt_up--;
    if(cnt_up==0){ // FOR DEBUG TIMING
     cnt_up=100; // 100*5ms
      for(pos=0;pos<=3;pos++){ // 1110-1101-1011-0111
       key_in=key_col_scan(pos);  // key scan
        if(key_in) break; // ANY KEY
      }
      if(key_in==0){        // no key
        key_in_p=0;
        key_in_cnt=0;       // key in count reset
      }
      else {            // Any key
       if(key_in!=key_in_p) { // new KEY-in ?
        key_in_p=key_in;     // pre key buffer refresh
        key_in_cnt=0;       // key in count reset
       }
       else if(key_in_cnt<127) key_in_cnt++; // if same key, cnt up
      }
      if(key_in_cnt>100) key_in=(key_in | 0x80); // set long keying flag
      }
      cnt_setup();          // tmr1 REFRESH
}


key_col_scan(pos)という関数はD-Gの位置を指定して
0にした後、A-C信号のどれが0になるかを見てキーコー
ドを戻してきます。