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

Study C Ver2販売開始のお知らせ

 C言語の勉強や教育用に最適です。
 2004/8/23よりStudy C Ver2の販売を開始しました。
 Study C Ver2の新しい機能については
 こちらをご参照ください。
C言語でゲームプログラマーを目指す方へ
 ■C言語ゲームプログラミング講座
 C言語でのゲームプログラミングを解説する講座
 始めました。

このページのプログラムを実行するにはStudy C Ver2.2を使用する必要があります。
プリンタポートの制御には、I/Oポートへの出力が必要です。 Windows(NT以降)は、そのままではI/Oポートを制御することができません。 Study Cでは、フリーソフトのgiveio.sysを使用することで、I/Oポートの制御を可能としています。
giveio.sysインストール手順を参考にしてください。





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;
}

お問い合わせ先 C言語のトップページに戻る Copyright(C) 2008 潟Iーキッド