プログラムの解説いきます。
実際に制御するのに必要な関数は、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番ピンに出力するときは、出力のアドレスを変えるだけ。
ただ、ピンとの対応関係はまだ分からないので、追って調べてみます。
コメント