2016.10.15
前へ
次へ
ホームページトップへ戻る

マイコン独立大作戦
キーボードインターフェースの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
そして作戦その2は、やっぱりキーボードインターフェースしかありませんでしょう。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第5回]


●ND80Z3.5でキー入力テスト

前回はスキャンコードについてほんの少しだけ簡単に説明をしました。
とにかくスキャンコードのままでは使うことはできませんから、ASCIIに変換するなどして使うことになります。
そのためにはプログラムで変換するための変換コード表のようなものをいずれは作らなければなりません。
その表ができましたら、その時点でスキャンコードとASCIIコードの対応表として皆様にお見せすることにします。
それまでスキャンコードについてはしばらくおあずけということにいたしましょう。

さて今回はいよいよ実際にキーボードをつないでキーコードを読み込んでみることにします。
[第2回]でも書きましたが、オシロやカメレオンUSBロジアナで観測したキーボードのPS/2コネクタから出力される波形は、1クロックが約80μsです。
このくらいの速度の信号ならばND80Z3.5の82C55に直接つないでプログラムで読み込むことができそうです。
ということで、即席で下の図のように接続してみました。



そしてこれも即席で作ってしまった、簡単なキー入力テストプログラムです。
    2016/10/1  17:6  keyin.txt
END=814B
              ;;; keyboard test program
              ;16.10.1
              ;
                ORG $8100
              ;
                HXDP2=$104B
              ;
8100 3E9B     START0:LD A,9B
8102 D383       OUT (83),A
8104 CD1781   START:CALL KEYIN
8107 C20481     JP NZ,START
810A 61         LD H,C
810B C5         PUSH BC
810C CD4B10     CALL HXDP2
810F C1         POP BC
8110 79         LD A,C
8111 FE1A       CP 1A;=Z
8113 C8         RET Z
8114 C30481     JP START
              ;
8117 DB80     KEYIN:IN A,(80);bit7 clock
8119 E680       AND 80
811B C0         RET NZ
811C DB80     KEYIN1:IN A,(80)
811E B7         OR A
811F F21C81     JP P,KEYIN1;pass start bit
8122 0608       LD B,08;
8124 DB80     KEYIN2:IN A,(80)
8126 B7         OR A
8127 FA2481     JP M,KEYIN2
812A 1F         RRA;bit0 data
812B 79         LD A,C
812C 1F         RRA
812D 4F         LD C,A
812E DB80     KEYIN3:IN A,(80)
8130 B7         OR A
8131 F22E81     JP P,KEYIN3
8134 05         DEC B
8135 C22481     JP NZ,KEYIN2
              ;pass parity bit
8138 DB80     KEYIN4:IN A,(80)
813A B7         OR A
813B FA3881     JP M,KEYIN4
813E DB80     KEYIN5:IN A,(80)
8140 B7         OR A
8141 F23E81     JP P,KEYIN5
              ;pass stop bit
8144 DB80     KEYIN6:IN A,(80)
8146 B7         OR A
8147 FA4481     JP M,KEYIN6
814A AF         XOR A
814B C9         RET
              ;
              ;END
                HXDP2        =104B  KEYIN        =8117  KEYIN1       =811C  
KEYIN2       =8124  KEYIN3       =812E  KEYIN4       =8138  
KEYIN5       =813E  KEYIN6       =8144  START        =8104  
START0       =8100  

キー入力プログラムというよりも、キーコード解析プログラムといったほうが適切です。
とにかくキーを押すとどのようなコードがどんなふうに送出されるのか、それを確認してみるためのプログラムです。

こちらが実行結果です。
logfile nd80zlog\10041453.txt open
zb3dos3n 2014.4.6 by Chunichidenko

ND80Z3に接続しました
0001 0000 - z
1000 00C3 - *** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/ld keyin.bin,8100
loading KEYIN.BIN ...004c(76)bytes loaded,from 8100 to 814B
>usr($8100)
1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1CF01C323232323232323232323232323232F03212121212
12121212121212121212121212121212121212121212121212121212121221212121212121212121
2121212121212121212121212121F021F01212121212121212122323232323232323232323232323
23232323F023F01212121212121212121212122424242424242424242424242424242424F0122424
24242424242424242424242424242424242424242424242424F0242B2B2B2B2B2B2B2B2B2B343434
34343434343434343434343434343434343434343434343434343434F034F02B1414141414141414
14141414141414141414141414141414141414141414141414141414141414141414141414141422
22222222222222222222222222222222222222222222F022F0141212121212121212121212121212
12121212121212121212121212121212121212121212122C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C
2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2CF02CF0121A
>/exit
0000 00C3 - 
リモート接続を終了しました
logfile closed at Tue Oct 04 15:01:32 2016

キーをA、B、C、D、Eと順番に一定時間押したときに出力された結果です。
途中テストのためにShiftキーも押しています。
ここで表示されているスキャンコードは以下の通りです。
A 1C
B 32
C 21
D 23
E 24
F 2B
G 34
左Shift 12 

最初にAキーを押しました。
押している間スキャンコード1Cが連続して出力され、Aキーを離すとF0、1Cが出力されました。
次に同様にしてBキーを一定時間押し続けてから離しました。
その結果スキャンコード32が連続で出力されたあと、F0、32が出力されました。
その次はちょっと分かりにくいのですが、左Shiftキーを押したあと、そのまま押し続けながらさらにCキーを押しました(つまり[Shift]+[C]のキー操作です)。
Shiftキーのスキャンコード12が連続して出されたあとCキーのスキャンコード21に代わっています。
2行目の後から20字ほど戻ったあたりです。
これはちょっとキーの選択がまずかったようです。
Shift(12)とC(21)ですから境目がわかりにくいです。
2が2回連続して表示されているところが1箇所あります。
そこが境目です。
まだShiftキーも押したままですからF0、12が出されることなく、あとから押したCキーのスキャンコードが代わって出力されています。
このあとCキーを離してからShiftキーを離しましたが、その様子が3行目の真ん中あたりに表示されています。
最初にF0、21が出力されて次にF0、12が表示されています。
そのあと同じようにしてShiftキーとDキーを押して、それから両方のキーを離したことが出力されたスキャンコードから読み取れます。
12、23、F0、23、F0、12というデータの流れのところです。
次は同様にして先にShiftキーを押してからEキーを押したのですが、今度は先にShiftキーを離してからEキーを離しました。
普通はこういうキー操作はしないはずですが、テストのためにやってみました。
すると前2回とは異なるちょっと面白い結果が出ました。
最初にShiftキーを押したときは、そのまま押しているとオートリピートが始まって12が連続して出力されます。
そのあとShiftキーを押したまま文字キーを押すとその文字のスキャンコードがオートリピートされます。
そして先に文字キーを離すとF0に続けてその文字キーのスキャンコードが出されますが、そのあとShiftキーだけを押していてもShiftキーはオートリピートされずにShiftキーが離されるまでキースキャンコードは出力されません。
ところが先にShiftキーを離すとF0、12のあとは押している文字キーのスキャンコードがオートリピート出力されるようになります。

説明の途中ですが時間がなくなってしまいました。
続きは次回にすることにいたします。

キーボードインターフェースの製作[第5回]
2016.10.15upload

前へ
次へ
ホームページトップへ戻る