ここでは,PIC16F1936を使ってタクトスイッチの状態を得るプログラムを作成します.

  1. 動作例

    下記のビデオをご覧ください.赤色のタクトスイッチ(左端)を押すとカウントアップ,緑色のタクトスイッチ(中央)を押すとカウントダウン,青色のタクトスイッチ(右端)を押すとクリアされます.このようなプログラムをこれから作ります.


  2. 事前準備

    このプログラムは,ドットマトリクスディスプレイ(割込みあり)をもとに作成しますので,プロジェクトをコピーしておいてください.


  3. 回路図

    下記にタクトスイッチとマイコンの接続を表した回路図を示します.赤色タクトスイッチがポートBビット3,緑色タクトスイッチがポートBビット4,青色タクトスイッチがポートAビット0にそれぞれ接続されています.
    Schematic
  4. TactSwitch.c


    タクトスイッチ関連の処理をこのファイルに書きます.
    1. 定数

      タクトスイッチが押された時の信号レベル(HighかLowか)をPRESSとして定義します.同じく話された時の信号レベルをRELEASEとして定義します.
      /* 押された時の信号の状態 */
      #define PRESS (0)
      
      /* 離された時の信号の状態 */
      #define RELEASE (1)

       

    2. TactSwitch_initialize関数

      タクトスイッチの初期化を行います.行うべきことは,デジタル端子にすることと入力ピンにすることです.デジタル端子にするには,ANSxyを0にします.ここでxはポート名,yはビット番号です.入力ピンにするにはTRISxyを1にします.入力は英語でInputですので,「I」→「1」と覚えると良いでしょう.下図に初期化プログラムの流れを示します.
      TactSwitch initialize
    3. TactSwitch_isPressedRedButton関数,TactSwitch_isPressedGreenButton関数,TactSwitch_isPressedBlueButton関数

      これらの関数はそれぞれタクトスイッチが押されたらtrue,押されていなかったらfalseを返します.各端子の状態を調べるには,Rxyレジスタを用います.ここでxはポート名,yはビット番号です.例えば赤いタクトスイッチの場合,ポートBビット3に接続されていますから,RB3レジスタとなります.下の図はTactSwitch_isPressedRedButton関数のアクティビティ図です.これと同様にTactSwitch_isPressedGreenButton関数とTactSwitch_isPressedBlueButton関数を書きましょう.
      TactSwitch isPressedRedButton

  5. Main.c

    メイン関数には,各ボタンが押された時の動作が記されます.赤色タクトスイッチが離されたら値が1カウントアップ,緑色タクトスイッチが離されたら値が1カウントダウン,青色タクトスイッチが離されたら0クリアされるようにします.下の図はその流れ図です.

    main注意点は,先ほどの説明の中で「離されたら」というところです.離すということは,その前に押されていなければなりません.そして,押されたのちには,離されるまで(いいかえれば押されている間)繰り返せばよいのです.このため,プログラムは下のようになります.この例は,赤色タクトスイッチが押され,そして離されるまで待ったのち,値を1カウントアップしているものです.

            /* 赤いボタンが押されたらカウントをアップさせる */
            if(TactSwitch_isPressedRedButton() == true) {
                /* 赤いボタンが押され続けている間繰り返す */
                while(TactSwitch_isPressedRedButton() == true);
                if (value >= 99) {
                    value = 99;
                }
                else {
                    value += 1;
                }
            }
    


    上記と同様に,緑色タクトスイッチおよび青色タクトスイッチが離された時の処理を書きましょう.