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

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

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
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

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