マイコン独立大作戦
キーボードインターフェースの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
そして作戦その2は、やっぱりキーボードインターフェースしかありませんでしょう。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第14回]
●ND80Z3.5のキー入力プログラム(2)
前回の簡単なプログラムをもとにして、今回は読み込んだスキャンコードを表示するとともに、それをASCIIコードに変換して表示するようにしました。
下が作成したキー入力プログラムです。
2016/10/22 14:13 keypic1c.txt END=8159 ;;; keyboard test program from pic16f87 ;16.10.8 10.20 ; ORG $8100 ; ADISP=$1015 HXDP2=$104B ; 8100 3E8A START0:LD A,8A 8102 D383 OUT (83),A 8104 3EFF LD A,FF 8106 D382 OUT (82),A 8108 0600 LD B,00 810A DB81 START:IN A,(81);keycode 810C B7 OR A 810D CA0A81 JP Z,START 8110 4F LD C,A 8111 CD3281 CALL HEXDP 8114 79 LD A,C 8115 FE1A CP 1A;=Z 8117 C8 RET Z 8118 B8 CP B 8119 CA0A81 JP Z,START;already disp 811C 41 LD B,C 811D DB82 IN A,(82);shift check 811F B7 OR A 8120 FA2C81 JP M,SHFTIN 8123 110092 LD DE,$9200 8126 CD4181 ASCDP:CALL ASCDPS 8129 C30A81 JP START 812C 110093 SHFTIN:LD DE,$9300 812F C32681 JP ASCDP ; 8132 3E5B HEXDP:LD A,5B;[ 8134 CD1510 CALL ADISP 8137 61 LD H,C 8138 CD4B10 CALL HXDP2 813B 3E5D LD A,5D;] 813D CD1510 CALL ADISP 8140 C9 RET ; 8141 210091 ASCDPS:LD HL,$9100 8144 C5 PUSH BC 8145 79 LD A,C 8146 0630 LD B,30 8148 BE ASCDPS2:CP (HL) 8149 CA5381 JP Z,ASCDPS3 814C 23 INC HL 814D 05 DEC B 814E C24881 JP NZ,ASCDPS2 8151 C1 POP BC 8152 C9 RET 8153 62 ASCDPS3:LD H,D 8154 7E LD A,(HL) 8155 CD1510 CALL ADISP 8158 C1 POP BC 8159 C9 RET ; ;END ADISP =1015 ASCDP =8126 ASCDPS =8141 ASCDPS2 =8148 ASCDPS3 =8153 HEXDP =8132 HXDP2 =104B SHFTIN =812C START =810A START0 =8100 |
前回のプログラムに比べるとかなり長いものになりました。
今までのプログラムは読み取ったスキャンコードをそのまま16進数で表示するだけのものだったので、表示が連続して読みにくいものでした。
今回はそこを変更して[XX]というように表示することにしました(HEXDP)。
それからスキャンコードをASCIIコードに変換して表示する部分を付け加えました(ASCDPS)。
この変換部分では[第9回]で作成したコード変換テーブルを使いました。
今回はせっかくのコード変換ですから、[Shift]キーが押されているかどうかを読み取って、それによってコード変換テーブルを使い分けるようにしました。
16進数の表示については今までのプログラムと同様に、読み取る都度そのまま表示しますが、ASCIIコードに変換しての文字表示は、本番のキー入力プログラムを意識して、最初に押されたとき1度だけ表示するようにして、押されている間は連続表示はしないようにしました。
オートリピートはまだありません。
それは本番のキー入力プログラムの中で必要に応じて考えていくことにします。
下が実行結果です。
logfile nd80zlog\10221157.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** ndwr2h.bin loaded,from E23F to E535 >/ld keypic1c.bin,8100 loading KEYPIC1C.BIN ...005a(90)bytes loaded,from 8100 to 8159 >usr($8100) [FF][FF][16]1[16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16][16 ][16][16][16][16][16][16][16][16][16][16][1E]2[1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1 E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][1E][26]3[26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][26][ 26][26][26][26][26][26][26][26][26][1C]a[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C] [1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][32]b[32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32 ][32][32][32][1C]A[1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1 C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][1C][3 2]B[32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][32][ 32][32][32][32][32][32][32][20][21]C[21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21][21] [21][21][21][21][21][21][21][21][22]x[23]d[23][23][23][23][23][23][23][23][23][2 3][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][2 3][23][23][23][23][23][23][23] |
PS/2キーボードで[1][2][3][a][b]と押したあと、[Shift]を押しながら[a][b][c]と押しました。
キー入力した最初の1度だけASCIIコードに変換した文字表示が行なわれています。
あとはそのキーを離すまでASCII文字表示は行なわれません。
[Shift]キーのスキャンコードは表示しません。
うまくいきました。
大成功です。
のはずだったのですが…。
おかしなことに気が付いてしまいました。
下から3行目の
[21][22]x[23]d[23]
というところです。
いや[x]なんか押さなかったはず…。
ここは[Shift]+[c]を押したあと、一旦[Shift]も[c]も離してから、[d]キーを押したはずだったのですが…。
キーボードの配置を見ましたら、[x]は[d]のすぐ左下にあります。
そーか、そーか、きっと[d]を押すときに指がすべって一瞬[x]も押してしまったんだ。
各キーのスキャンコードは次の通りです([第9回]参照)。
[1] 16
[2] 1E
[3] 26
[a] 1C
[b] 32
[c] 21
[d] 23
[x] 22
ところが、ところが。
今度は慎重に気をつけながら同じキー操作をしてみたのですけれど。
やっぱり同じ現象が発生してしまいました。
[21][21][21][21][21][21][21][21][21][21][22]x[23]d[23][23][23][23][23][23][23][2 3][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][2 3][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][2 3][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][2 3][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][2 3][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][2 3][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][23][ |
なんだ?
これは?
実はこれまでのテストでは昔に買ったちょっと調子が悪くて使わなくなったPS/2キーボードを引っ張り出してきて使っていたのでした。
さてはそれが原因か?
で。
amazonから購入した新品のキーボードで同じことをしてみたのですが…。
結果は全く同じでした!
毎回ではないのですが、ときどき同じことがおきてしまいます。
こうなるとシリアルデータの読取ミスでもなさそうですし、かといってプログラムミスとか接続の不具合ということでもなさそうです。
実は。
今気が付いたのですが、まだ他にも異常は発生していました。
さきほどのログリストの下から20行目です。
32][32][32][32][32][32][32][20][21]C[21][21][21][21][21][21][21][21][21][21][21] |
ここは[Shift]+[b]を押した後に続いて[Sfift]+[c]を押したところです。
[32][20][21]C
となっています。
調べてみましたら、[20]なんてスキャンコードはないのですよねえ。
むむむ。
こ、これは、さては、怪奇現象かぁ?
あ、悪霊のたたりじゃあ!
悪霊退散んんーっ!
悪霊のしわざではありませんでした。
原因が判明するまで、半日を費やしてしまいました。
キーボードインターフェースの製作[第14回]
2016.10.24upload
前へ
次へ
ホームページトップへ戻る