• ベストアンサー

PIC CLITEでデジタルカウンタを作りたい

7セグLEDを使って,押しボタンスイッチの押した回数(0~9)を7セグで表示するプログラムをHitec社のPIC CLiteで作りたいのですが,押しボタンを押しても回数がランダムで表示されてしまいます.どういったところを直したらいいでしょうか? ***プログラム*** ボタンスイッチを押したぶんだけ数値をカウントする main{ while(1){ if(RA0==0){   …押しボタンのポート ++a; { if(a>=10){   …10回押したら0になる a=0; } ↓7セグに出力 RB4=a%2; RB5=(a/2)%2; RB6=(a/4)%2; RB7=a/4; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • techa
  • ベストアンサー率60% (41/68)
回答No.1

コンパイラの問題よりも、ハードウエア構成が全く提示されていないので 答えようがないですね。 とりあえず、PB4~7の各ビットに7セグデコーダでもついているのでしょうか? この部分が問題ないと仮定し、質問内容が「押しボタン回数がランダムに 記録されている」というところに限定しておきますね。 回路がどのように構成されているかはわかりませんが、最初の押しボタン検出ループで、押されている間はず~~とカウントアップするわけですね。 作成意図はたぶん押された回数を取得したいということでしょうから、これでは意図した結果にならないとおもいます。 ではどうすればよいのでしょうか。オーソドックスな解答では 微分をとればよい、ということになるのでしょう。 つまり、 前回のキーセンスでは押されていない かつ 今回のキーセンスでは押されている という条件をみればよいのです。 ただし、ハード的にボタンのチャタリングがとれていれば、の話ですが。 チャタリング防止回路がないばあいには、チャタリングがとれるのに十分な時間をおいて複数回の検出をおこなうことになるとおもいます。 とりあえず、答えられるのはこれくらいでしょうか。 がんばってくださいね。

Aei_aoi
質問者

お礼

ありがとうございます. チャッタリング防止回路がないので,十分な時間を取ることにしました. if(RA0==0){ DelayMs(10); if(RA0==0){ ++up_1; } }

その他の回答 (1)

  • ore100
  • ベストアンサー率54% (34/62)
回答No.2

ボタンスイッチのポートの読み方がよくありません。 ポートを直接読んでいるのが誤りです。 ボタンスイッチのポートの読みをスイッチの立ち上がりエッジでスイッチONとするような処理を入れないとうまく行きません。 インターバル・タイマーを使ってボタンスイッチのポートの読みを立ち上がりエッジで捕らえるように改造するとうまく行くと思います。

関連するQ&A