C言語ケーススタディ プリンタポートの制御1(LED点灯)




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サンプル版でご確認ください。


プリンタポートは、0378〜037A、0278〜027A、03BC〜03BEのいずれかのI/Oポートをアクセスすることで制御します。 上記のどのアドレスかは使用しているコンピュータによって異なっております。 アドレスは、「マイコンピュータ→右ボタンメニューの管理→デバイスマネージャ→ ポート(COMとLPT)→ECPプリンタポート(LPT1)→プロパティ→リソース」で確認することができます。

ポートアドレスを確認したらStudy Cの「ツールメニュー→I/O範囲の設定」で該当するアドレスのチェックボックスをチェックしてください。 プリンタポートのI/Oポートアドレスは、初期値として表示されています(削除してしまうと表示されません)。 プリンタポートのアドレスが0378-037Fの場合は以下のように設定します。


プリンタポートに接続してLEDを点灯させる以下のような基板を作成しました。

赤色LEDと黄色LEDを5個ずつプリンタポートに接続しただけの簡単な回路です(抵抗を入れてありますが)。

回路概要は以下のようになります。
・D8に赤色LED5個の全てのアノードを接続します(抵抗を入れてあります)。
・D7に黄色LED5個の全てのアノードを接続します(同様に抵抗を入れてあります)。
・D6には緑色LEDを接続しようと思いましたが基板スペースが足りなかったので未使用となっております。
・D1-D5は赤色/黄色LEDのカソードに別々に接続されています(D1ならば赤色LED一個、黄色LED一個の計2個に接続されています)。

次のプログラムは、作成した基板を制御しLEDを点灯させます。
最初に何かキーを押すと以下のようにプリンタポートがセットされます。
 D8:1 赤色のLEDを点灯対象とする
 D7:0 黄色のLEDは点灯対象としない
 D6:0 未使用
 D5:1 LED5は点灯しない
 D4:1 LED4は点灯しない
 D3:1 LED3は点灯しない
 D2:0 LED2は点灯する
 D1:1 LED1は点灯しない
この結果、赤色LED2のみ点灯します。

次に何かキーを押すと以下のようにプリンタポートがセットされます。
 D8:1 赤色のLEDを点灯対象とする
 D7:0 黄色のLEDは点灯対象としない
 D6:0 未使用
 D5:1 LED5は点灯しない
 D4:0 LED4は点灯する
 D3:1 LED3は点灯しない
 D2:1 LED2は点灯しない
 D1:1 LED1は点灯しない
この結果、赤色LED2のみ点灯します。

次に何かキーを押すと以下のようにプリンタポートがセットされます。
 D8:0 赤色のLEDを点灯対象としない
 D7:1 黄色のLEDは点灯対象とする
 D6:0 未使用
 D5:1 LED5は点灯しない
 D4:0 LED4は点灯する
 D3:1 LED3は点灯しない
 D2:1 LED2は点灯しない
 D1:0 LED1は点灯する
この結果、黄色LED1と4が点灯します。

プログラム終了時には全て1にセットし終了しています。
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 GREEN_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


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

        printf("何かキーを押すと赤色LEDが1個点灯(2番)します.");
        getch();
        printf("\n");
        _outp(data_port, RED_SWITCH|LED2);

        printf("何かキーを押すと赤色LEDが別の1個点灯(4番)します.");
        getch();
        printf("\n");
        _outp(data_port, RED_SWITCH|LED4);

        printf("何かキーを押すと黄色LEDが2個点灯(1/4番)します.");
        getch();
        printf("\n");
        _outp(data_port, YELLOW_SWITCH|LED1_4);

        printf("何かキーを押すとプログラムが終了します.");
        getch();
        printf("\n");
        _outp(data_port, ALL_OFF);

        return 0;
}


次のプログラムは、色別にLEDを全部点灯させます。
最初に何かキーを押すと以下のようにプリンタポートがセットされます。
 D8:1 赤色のLEDを点灯対象とする
 D7:0 黄色のLEDは点灯対象としない
 D6:0 未使用
 D5:0 LED5は点灯する
 D4:0 LED4は点灯する
 D3:0 LED3は点灯する
 D2:0 LED2は点灯する
 D1:0 LED1は点灯する
この結果、赤色LEDを全て点灯します。

次に何かキーを押すと以下のようにプリンタポートがセットされます。
 D8:0 赤色のLEDを点灯対象としない
 D7:1 黄色のLEDは点灯対象とする
 D6:0 未使用
 D5:0 LED5は点灯する
 D4:0 LED4は点灯する
 D3:0 LED3は点灯する
 D2:0 LED2は点灯する
 D1:0 LED1は点灯する
この結果、黄色LEDを全て点灯します。

次に何かキーを押すと以下のようにプリンタポートがセットされます。
 D8:1 赤色のLEDを点灯対象とする
 D7:1 黄色のLEDは点灯対象とする
 D6:0 未使用
 D5:0 LED5は点灯する
 D4:0 LED4は点灯する
 D3:0 LED3は点灯する
 D2:0 LED2は点灯する
 D1:0 LED1は点灯する
この結果、赤色/黄色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 GREEN_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


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

        printf("何かキーを押すと赤色のLEDが点灯します.");
        getch();
        printf("\n");
        _outp(data_port, RED_SWITCH);

        printf("何かキーを押すと黄色LEDが点灯します.");
        getch();
        printf("\n");
        _outp(data_port, YELLOW_SWITCH);

        printf("何かキーを押すと赤色/黄色の全LEDが点灯します.");
        getch();
        printf("\n");
        _outp(data_port, RED_SWITCH|YELLOW_SWITCH);

        printf("何かキーを押すとプログラムが終了します.");
        getch();
        printf("\n");
        _outp(data_port, ALL_OFF);

        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]