C言語ケーススタディ プリンタポートの制御2(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サンプル版でご確認ください。


今回もプリンタポートの制御1に引き続きLEDの点灯を行います。
今回は、LEDの色と回数を指定するとルーレットのようにLEDが回転して点灯するプログラムを作成します。 原理は単純でLED1→LED2→...と点灯するLEDを切り換えているだけです。 間に少し待ち時間を入れないと早すぎてしまうのでSleep()関数を作成し待機時間を作っています。

run red 10

などと実行すると赤色のLEDが、10回分回転します。
先頭行付近のdata_port = ...の部分は先ほど調べたアドレスに合わせて変更する必要があります。
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 LED_MASK                0x1F

#define ALL_OFF                 0xFF

void    goLamp(int times, unsigned char color);
void    Sleep(int val);


int main(int argc, char *argv[])
{
        char    folder[1024];
        int     times;

        if (argc != 3)
        {
                printf("Usage : led [red|yellow] times\n");
                return -1;
        }
        times = atoi(argv[2]);

        _outp(control_port, 0xCC/*0*/); //出力モードにする
        _outp(data_port, ALL_OFF);
        if (stricmp(argv[1], "red") == 0)
        {
                goLamp(times, RED_SWITCH);
        }
        if (stricmp(argv[1], "yellow") == 0)
        {
                goLamp(times, YELLOW_SWITCH);
        }
        _outp(data_port, ALL_OFF);

        return 0;
}


void    goLamp(int times, unsigned char color)
{
        int     i1;

        for (i1 = 0; i1 < times; i1++)
        {
                _outp(data_port, color|LED1);
                Sleep(100);
                _outp(data_port, color|LED2);
                Sleep(100);
                _outp(data_port, color|LED3);
                Sleep(100);
                _outp(data_port, color|LED4);
                Sleep(100);
                _outp(data_port, color|LED5);
                Sleep(100);
        }
        _outp(data_port, ALL_OFF);
}


void    Sleep(int val)
{
        long    start;

        start = GetTickCount();
        for (;;)
        {
                if (GetTickCount() > start + val)
                {
                        break;
                }
        }
}

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