C言語ケーススタディ プリンタポートの制御4(スイッチ検出)




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



このページのプログラムを実行するにはStudy C Ver2.2を使用する必要があります。
プリンタポートの制御には、I/Oポートへの出力が必要です。 Windows(NT以降)は、そのままではI/Oポートを制御することができません。 Study Cでは、フリーソフトのgiveio.sysを使用することで、I/Oポートの制御を可能としています。
giveio.sysインストール手順を参考にしてください。
※I/Oポート制御は、ご使用になるPCやOSによって正しく動作しない可能性があります。
I/Oポート制御の目的でご購入の場合は、ご使用になるPCと接続する装置の組み合わせで動作に問題ないことをStudy Cサンプル版でご確認ください。


改造前
LEDを点灯させる基盤(↑)改造し押しボタンスイッチ(↓)を付けました。
スイッチを追加
スイッチを追加するにあたり、ACK/BUSY/PE/SELECT/GNDの5本の配線も追加しました。
回路の変更点は以下のようになります。
・D6(緑色LEDを接続しようと思っていたI/O)を常にONの状態で使うこととし、VCCとして使用しました。
・ACKをプルアップ抵抗経由でVCC(D6)に接続しました。
・ACKを押しボタンスイッチ経由でGNDに接続しました。
押しボタンスイッチの解放時は、プルアップ抵抗があるためACKが1となります。 また、押しボタンスイッチを押したときは、ACKが0となります。
押しボタンスイッチの押し下げを検出するプログラムを作成してみます。
検出のためには、D6をONにセットしておく必要があります。 この状態で、ステータスポートを_inp()関数で調べることでスイッチの状態を検出することができます。 ステータスポートは、下記の8ビットの内容が読み込まれます。
・8ビット:BUSY
・7ビット:ACK
・6ビット:PE
・5ビット:SELECT
・4ビット:ERROR
・1-3ビットは未使用
ACKなら6ビット目の値を調べることで状態を検出することができます。
下記のプログラムでは、まずD6(PULLUP_SWITCH)をONにセット押します。 この状態でACKの状態を調べスイッチが押されていればD7(RED_SWITCH)、D8(YELLOW_SWITCH)をONにし、押されていなければOFFにします(この時、D6がOFFにならないように注意する必要があります)。 これをループ内で繰り返し行っています。これで、スイッチを押したときは全LEDが点灯し、押していないときは全LEDが消灯します。
const unsigned short data_port    = 0x0378;
const unsigned short status_port  = 0x0379;
const unsigned short control_port = 0x037A;

//const unsigned short data_port    = 0x0278;
//const unsigned short status_port  = 0x0279;
//const unsigned short control_port = 0x027A;

//const unsigned short data_port    = 0x03BC;
//const unsigned short status_port  = 0x03BD;
//const unsigned short control_port = 0x03BE;

#define RED_SWITCH              0x80
#define YELLOW_SWITCH           0x40
#define PULLUP_SWITCH           0x20
#define SWITCH_MASK             0xE0

#define LED1                    0x1E    // 1-1110
#define LED2                    0x1D    // 1-1101
#define LED3                    0x1B    // 1-1011
#define LED4                    0x17    // 1-0111
#define LED5                    0x0F    // 0-1111
#define LED1_4                  0x16    // 1-0110
#define LED_MASK                0x1F

#define ALL_OFF                 0xFF

#define ACK                     0x40


int main()
{
        _outp(control_port, 0xCC); //出力モードにする
        _outp(data_port, ALL_OFF);

        printf("押しボタンを押している間、全LEDが点灯します.\n");
        printf("何かキーを押すと終了します.\n");

        _outp(data_port, PULLUP_SWITCH);

        for( ; ; )
        {
                if ((_inp(status_port) & ACK) != 0)
                {
                        _outp(data_port, PULLUP_SWITCH);
                }
                else
                {
                        _outp(data_port, RED_SWITCH|YELLOW_SWITCH|PULLUP_SWITCH);
                }
                if (kbhit() != 0)
                {
                        break;
                }
        }
        return 0;
}

このページではStudy Cを使っての機器制御を説明しました。 しかし、通常は小さいマイコンボード内で動作するプログラムが機器制御を行います。 このような制御プログラムもほぼC言語で作成されています。 この領域のプログラムは「C言語、組み込み」と呼ばれています。 ほとんどがC言語なので単に「組み込み」とも言われます(横文字で「embedded=組み込み」と呼ばれることもあります)。
フリーランス、フリーエンジニアの為のIT求人【エンジニアナビ】
このリンク先を開いて「言語から探す」の「C C++」にチェックを入れて検索してみてください。 案件の何割かには、「組み込み」とかかれていると思います(本ページ執筆時には、〜80万円といった案件もあります)。 このページは、ほんのさわりですが「組み込み」系のプログラミングになります。当サイトの下記の関連ページも参考にしてください。
プリンタポート制御2(LED点灯)
プリンタポート制御3(LED点灯)
プリンタポート制御4(スイッチ検出)

実際のマイコンボードでの制御については、このサイトでは説明しておりません。 マイコンボードでの制御については、下記の書籍が分かり易いと思うので参考にしてみてください。

【送料無料】 ディジタル・デザイン・テクノロジ ハードウェアを制御するソフトウェアを書いて、動かして、理解する No.4 特集 組み込みC言語超入門 【単行本】

価格:1,890円
(2013/1/27 10:28時点)
感想(0件)

【1000円以上送料無料】赤外線制御で学ぶPICとC言語 組み込みシステムをステップアップ方式で理解する/竹内浩一

価格:2,940円
(2013/1/27 10:06時点)
感想(0件)

[an error occurred while processing this directive]