パラレルポートの制御(2)

プログラムの解説いきます。
実際に制御するのに必要な関数は、iopermとoutbだけです。

流れとしては、
1. iopermでポートの入出力権限を得る。
2. outbで実際に出力する。

ちなみに、Linuxでないと動作しないはずです。
今回は信号を出力するだけですが、入力の場合はinbという関数があります。

#include #include #include 

特別にインクルードするヘッダファイルは、unistd.hとsys/io.hです。
これらは、おそらくiopermのためのもの。

#define addr 0x378

ここが一つめのポイント。
パラレルポートにどんなアドレスがあてられているかは機種に依存します。
だから、BIOSを立ち上げて確認します。

このパソコンの場合は「378」というアドレスなので、0x378と設定。
一般的に、このアドレスである場合が多いようです。

#define size 3

そして、どのくらいの大きさのアドレスを使うかを指定します。
パラレルポートは25ピンで、そのうち1つはグラウンドです。
だから、扱えるのは24bit、つまり3byteです。

int main(){  unsigned char c;  if( ioperm( addr, size, 1 ) )    return -1;

main関数の中に入って、iopermでポートの入出力権限を得ます。
失敗した場合はプログラムを終了するようにしています。

  while( ( c = getchar() ) != '0' )    if( c != 'n' )      outb( c, addr );

ここが2つ目のポイント。
whileとifは、文字の入力の都合なので信号の出力には直接関係ありません。
outbで実際にデータを出力するのですが、ビット単位でなくバイト単位で出力します。
つまり、8bitまとめて出力します。

今回は、文字を入力させて、そのアスキーコードをそのまま出力するようにしています。
たとえば、「a」のアスキーコードは0x61で、ビットに直すと’01100001’です。
これが、9番ピンから2番ピンに向かって、順に出力されるわけです。

  return 0;}

ここは終了処理。

今回作った回路では、2番ピンにLEDをつないでいます。
だから、a(0x61=01100001)が入力された時は点灯。
b(0x62=01100010)が入力された時は消灯・・・といった具合。

11番ピンから24番ピンに出力するときは、出力のアドレスを変えるだけ。
ただ、ピンとの対応関係はまだ分からないので、追って調べてみます。

コメント

タイトルとURLをコピーしました