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になるかを見てキーコー
ドを戻してきます。