今までは何となく OUT命令 や WAIT命令 を使ってきましたが、 ここで関連するI/Oポートの説明を行いたいと思います。 I/Oポートとは入力・出力ポートの略称で、ハンディのCPUから見て外部装置に該当するキーボード、 LEDランプ、ブザーなどを制御するためのポート(外部メモリの様なもの)です。 I/Oポートは制御対象毎に別々のアドレスが割り当てられていて、 それへの入力命令が INP関数 で、出力命令が OUTステートメント です。 また、I/Oポートの状態が指定状態になるまでプログラムを止めておく WAITステートメント があります。
以下に私がプログラムで使用したポートについて一覧を記します。 ここに上げた以外のポートは各装置のマニアルを参照して下さい。
例として先ずは、WAIT命令について説明します。
ポート番号で指定された入力ポートの内容を読込し、 AND パターンとXOR パターンで指定された値になるまで、 ユーザプログラムをこの命令で待つ様にします。
指定されたパターンになるまで命令が終わらないので、 指定値が間違っていると、命令から帰って来なくなり、 プログラムが止まってしまいますので、注意して下さい。
以下のソースがWAIT命令の使用例の関数なのですが、 ポート(0000)の0ビット目が1になるまで待っています。 WAIT命令を抜けてきた時点で、キーボードバッファにキー入力が在ることになるので キーデータを1文字取得しています。
次は、INP関数について説明します。
INP関数が返す値は整数型になります。 I/Oポートのデータは1バイトなので、整数型では最大でも255となります。
WAIT命令のところの関数の例をINP関数で置き換えると以下の様になります。
(ちょっと冗長すぎますね)
次は、OUT命令について説明します。
I/Oポートに割り振られていないポート番号を指定すると無視されます。 また、使用されているポート番号でも意味の無いBIT位置にデータを 設定しても無視されます。
最後にTIMER命令について説明します。
ソースの例としては以下の様な感じです。
=====
2016/04/02:の時の情報
以下に私がプログラムで使用したポートについて一覧を記します。 ここに上げた以外のポートは各装置のマニアルを参照して下さい。
ポートNO (HEX) | bit | 制御対象 | R/W | データ | 初期値 | ||
---|---|---|---|---|---|---|---|
.pnEvent |
0 | キーボードバッファ | R |
- | 0 | データ無 | - |
.pvEvKeyOn | 1 | データ有 | |||||
1 | バーコードバッファ | - | 0 | データ無 | - | ||
.pvEvBarOn | 1 | データ有 | |||||
2 | トリガスイッチ | - | 0 | OFF | - | ||
.pvEvTrgOn | 1 | ON | |||||
3 | 受信バッファ | - | 0 | データ無 | - | ||
.pvEvtCmOn | 1 | データ有 | |||||
4 | TIMEA関数 | - | 0 | 関数の値が0以外 | - | ||
.pvEvTma0 | 1 | 関数の値が0 | |||||
5 | TIMEB関数 | - | 0 | 関数の値が0以外 | - | ||
.pvEvTmb0 | 1 | 関数の値が0 | |||||
6 | TIMEC関数 | - | 0 | 関数の値が0以外 | - | ||
.pvEvTmc0 | 1 | 関数の値が0 | |||||
7 | CS(CTS)信号 | - | 0 | 常に0を返す | - | ||
.pvEvCsOn | 1 | - | |||||
.pnLEDCtrl |
0 | 表示LED(赤) | W |
- | 0 | 消灯 | 0 |
.pvLEDRed | 1 | 点灯 | |||||
1 | 表示LED(緑) | - | 0 | 消灯 | 0 | ||
.pvLEDGrn | 1 | 点灯 | |||||
2 | 表示LED(青) | - | 0 | 消灯 | 0 | ||
.pvLEDBle | 1 | 点灯 | |||||
.pnFont |
0 | 表示フォント | R/W |
.pvFtStd | 0 | 標準フォント | 0 |
.pvFtSmall | 1 | 小フォント | |||||
サイズ指定(16,24,30,40) | |||||||
.pnKeyEnt |
0 | キー入力方式 | R/W |
.pvKyNm | 0 | 数字入力 | 0 |
.pvKyAlpNm | 1 | 英数字入力 | |||||
.pnKeyMd |
0 | キー入力状態 | R/W |
.pvKMNm | 0 | 数字 | 0 |
.pvKMAlp | 1 | 英字 |
例として先ずは、WAIT命令について説明します。
WAIT <ポート番号> , <AND パターン>[,XOR パターン]
<ポート番号>:入力ポート番号を指定
<AND パターン>:チェックしたいビットを1 にして、AND パターンに設定
<ポート番号>:入力ポート番号を指定
<AND パターン>:チェックしたいビットを1 にして、AND パターンに設定
ポート番号で指定された入力ポートの内容を読込し、 AND パターンとXOR パターンで指定された値になるまで、 ユーザプログラムをこの命令で待つ様にします。
指定されたパターンになるまで命令が終わらないので、 指定値が間違っていると、命令から帰って来なくなり、 プログラムが止まってしまいますので、注意して下さい。
以下のソースがWAIT命令の使用例の関数なのですが、 ポート(0000)の0ビット目が1になるまで待っています。 WAIT命令を抜けてきた時点で、キーボードバッファにキー入力が在ることになるので キーデータを1文字取得しています。
Function GfGetKey$ Wait 0, &h01 'キー入力待ち GfGetKey$ =Input$(1) '入力されたキーを取得して戻す。 End Function
次は、INP関数について説明します。
INP(<ポート番号>)
<ポート番号>:入力ポート番号を指定
<ポート番号>:入力ポート番号を指定
INP関数が返す値は整数型になります。 I/Oポートのデータは1バイトなので、整数型では最大でも255となります。
WAIT命令のところの関数の例をINP関数で置き換えると以下の様になります。
(ちょっと冗長すぎますね)
Function GfGetKey2$ PRIVATE W% W% = INP(0) WHILE (W% AND 1) = 0 W% = INP(0) WEND GfGetKey2$ =Input$(1) '入力されたキーを取得して戻す。 End Function
次は、OUT命令について説明します。
OUT <ポート番号>,<データ>
<ポート番号>:入力ポート番号を指定 <データ> :ポートに出力するバイトデータ(0~255)
<ポート番号>:入力ポート番号を指定 <データ> :ポートに出力するバイトデータ(0~255)
I/Oポートに割り振られていないポート番号を指定すると無視されます。 また、使用されているポート番号でも意味の無いBIT位置にデータを 設定しても無視されます。
'数字入力方式に設定 OUT .pnKeyEnt, .pvKyAlpNm '英数字入力 OUT .pnKeyMd, .pvKMNm '数字 'フォントサイズ24ドット指定 OUT .pnFont , 24
最後にTIMER命令について説明します。
書式1:(タイマ値を参照するとき)
W% = TIMEA
W% = TIMEB
W% = TIMEC
(W%は宣言済みとする)
書式2:(タイマ値を設定するとき)
TIMEA = <カウント値>
TIMEB = <カウント値>
TIMEC = <カウント値>
<カウント値>:指定可能範囲は0~32767、単位は100ms
タイマは値を設定されてからカウントダウンが始まり、カウント値が0になった時点で動きを止めます。 例えばある時間の待ちを作る場合に、カウンタに値を設定し、カウンタを読込をループで行い その値が0になるのを待ちます。 W% = TIMEA
W% = TIMEB
W% = TIMEC
(W%は宣言済みとする)
書式2:(タイマ値を設定するとき)
TIMEA = <カウント値>
TIMEB = <カウント値>
TIMEC = <カウント値>
<カウント値>:指定可能範囲は0~32767、単位は100ms
ソースの例としては以下の様な感じです。
TIMEA = 100 '10秒設定 'TIMEAが0になったらループ終了 WHILE TIMEA > 0 WEND
=====
2016/04/02:の時の情報
PR
コメント