mikroC PS/2 ライブラリ キーボードからの戻り値



スポンサーリンク

mikroC付属のPS/2インターフェイス関連のライブラリは、キーボードとのやり取りを簡単にしてくれて非常に便利です。
サンプルの通り、以下のコードを実行するとキーボードで押されたキーを取得することができます。

// Press Enter to continue:
do {
  if (Ps2_Key_Read(&value, &special, &pressed)) {
    if ((value == 13) && (special == 1)) break;
  }
} while (1);

PICに、PS/2キーボードとLCDを接続してアプリケーションのデバッグ中に不可思議な現象に会いキーボードからの戻り値を調べてみました。
Ps2_Key_Read(&value, &special, &pressed)を実行すると、キーボードの押し下げ状況がvalue,special,pressedに格納されて関数は1を返します。
キーボードからESCが押されると、valueに34 pressedに1がセットされます。キーボードのESCの押し下げによってPIC内のモードを変更する部分で、
ESCを押し下げてもモードが切り替わらない現象がありました。調べてみると、ESCの押し下げで34を返さない場合があることがわかりました。


int iv,isp;
lcd_buf[20];

Ps2_Key_Read(&KeyValue, &KeySpecial, &KeyPressed);
iv=KeyValue;
isp=KeySpecial;
sprinti(lcd_buf,"Val=%d Sp=%d",iv,isp);
Lcd_Out(1,1,lcd_buf); // LCDに表示


上のようなコードで押されたキーをLCD上に表示してみると、NumLockが有効になっているとESCを押し下げても34が格納されず、0が格納されることがわかりました。

電源ON直後はCapsLock,NumLockは無効になっています。この状態でPs2_Key_Readの結果をしらべてみると以下の通りでした。
ESCの結果は34になっています。

電源ON直後
PS/2キーボード KeyValue KeySpecial 備考 コメント
0 48 0 not 10 key
1 49 0 not 10 key
2 50 0 not 10 key
3 51 0 not 10 key
4 52 0 not 10 key
5 53 0 not 10 key
6 54 0 not 10 key
7 55 0 not 10 key
8 56 0 not 10 key
9 57 0 not 10 key
0 17 1 10 key Insert
1 26 1 10 key End
2 33 1 10 key 下矢印
3 15 1 10 key PageDown
4 30 1 10 key 左矢印
5 NA NA 10 key
6 31 1 10 key 右矢印
7 27 1 10 key Home
8 32 1 10 key 上矢印
9 14 1 10 key PageUp
F1 1 1
F2 2 1
F3 3 1
F4 4 1
F5 5 1
F6 6 1
F7 7 1
F8 8 1
F9 9 1
F10 10 1
F11 11 1
F12 12 1
A 97 0 小文字
B 98 0 小文字
Z 122 0 小文字
ESC 34 1
半角全角 96 0
TAB 35 1
CapsLock英数 25 1
SHIFT 21 1
CTRL 20 1
ALT 22 1
無変換 0 0
スペース 32 0
変換 0 0
カタカナひらがな 0 0
PrtSc/SysRq 23 1
ScrollLock 28 1
Pause/Break 29 1
Insert 48 0
Home 55 0
PageUp 57 0
Delete 46 0
End 49 0
PageDown 51 0
上矢印 56 0
左矢印 52 0
下矢印 50 0
右矢印 54 0


電源ON後、キーボードのCapsLockを押して有効にした場合は以下の通りで、アルファベットが大文字になるだけです。

CapsLock有効
PS/2キーボード KeyValue KeySpecial 備考 コメント
0 48 0 not 10 key
1 49 0 not 10 key
2 50 0 not 10 key
3 51 0 not 10 key
4 52 0 not 10 key
5 53 0 not 10 key
6 54 0 not 10 key
7 55 0 not 10 key
8 56 0 not 10 key
9 57 0 not 10 key
0 17 1 10 key Insert
1 26 1 10 key End
2 33 1 10 key 下矢印
3 15 1 10 key PageDown
4 30 1 10 key 左矢印
5 NA NA 10 key
6 31 1 10 key 右矢印
7 27 1 10 key Home
8 32 1 10 key 上矢印
9 14 1 10 key PageUp
F1 1 1
F2 2 1
F3 3 1
F4 4 1
F5 5 1
F6 6 1
F7 7 1
F8 8 1
F9 9 1
F10 10 1
F11 11 1
F12 12 1
A 65 0 大文字
B 66 0 大文字
Z 90 0 大文字
ESC 34 1
半角全角 96 0
TAB 35 1
CapsLock英数 25 1
SHIFT 21 1
CTRL 20 1
ALT 22 1
無変換 0 0
スペース 32 0
変換 0 0
カタカナひらがな 0 0
PrtSc/SysRq 23 1
ScrollLock 28 1
Pause/Break 29 1
Insert 48 0
Home 55 0
PageUp 57 0
Delete 46 0
End 49 0
PageDown 51 0
上矢印 56 0
左矢印 52 0
下矢印 50 0
右矢印 54 0

スポンサーリンク

電源ON後NumLockを押して有効にした状態でPs2_Key_Readの結果を調べて見ると、
ESCを押したときの結果が0になってしまいます。また、Insert,Home,PageUp,Delete,End,PageDown,矢印キーを押した直後に
(おそらく押し下げられたキーが戻るときに)PrtScを押した場合と同じ結果が返されます。

NumLock有効
PS/2キーボード KeyValue KeySpecial 備考 コメント
0 48 0 not 10 key
1 49 0 not 10 key
2 50 0 not 10 key
3 51 0 not 10 key
4 52 0 not 10 key
5 53 0 not 10 key
6 54 0 not 10 key
7 55 0 not 10 key
8 56 0 not 10 key
9 57 0 not 10 key
0 48 0 10 key
1 49 0 10 key
2 50 0 10 key
3 51 0 10 key
4 52 0 10 key
5 53 0 10 key
6 54 0 10 key
7 55 0 10 key
8 56 0 10 key
9 57 0 10 key
F1 1 1
F2 2 1
F3 3 1
F4 4 1
F5 5 1
F6 6 1
F7 7 1
F8 8 1
F9 9 1
F10 10 1
F11 11 1
F12 12 1
A 97 0 小文字
B 98 0 小文字
Z 122 0 小文字
ESC 0 0 NumLockによって戻り値が変化
半角全角 96 0
TAB 35 1
CapsLock英数 25 1
SHIFT 21 1
CTRL 20 1
ALT 22 1
無変換 0 0
スペース 32 0
変換 0 0
カタカナひらがな 0 0
PrtSc/SysRq 23 1
ScrollLock 28 1
Pause/Break 29 1
Insert 48 0 押し下げ後PrtSc/SysRq(23,1)が発生
Home 55 0 押し下げ後PrtSc/SysRq(23,1)が発生
PageUp 57 0 押し下げ後PrtSc/SysRq(23,1)が発生
Delete 46 0 押し下げ後PrtSc/SysRq(23,1)が発生
End 49 0 押し下げ後PrtSc/SysRq(23,1)が発生
PageDown 51 0 押し下げ後PrtSc/SysRq(23,1)が発生
上矢印 56 0 押し下げ後PrtSc/SysRq(23,1)が発生
左矢印 52 0 押し下げ後PrtSc/SysRq(23,1)が発生
下矢印 50 0 押し下げ後PrtSc/SysRq(23,1)が発生
右矢印 54 0 押し下げ後PrtSc/SysRq(23,1)が発生

上の結果から、NumLockに影響されないキーを選択することによって対処することにしました。

mikroCでPS/2キーボードを使うときの留意点
1:キーボード上のLEDを点灯させることはできない1wayの通信。CapsLock状態が見た目でわかりにくい。
2:Ps2_Key_Readはキーを押し下げたときとリリースしたときに値を返す
3:PS/2キーボードの初期状態では、NumLock,CapsLockは無効になっている。
4:SHIFT+AではSHIFTを押したときとAを押したときにPs2_Key_Readが値を返す。リリースしたときも返す
5:CapsLockが無効のときSHIFT+Aでは大文字のAが得られる。プログラム上でSHIFTの押し下げを監視する必要がない。
6:NumLock,CapsLockの状態はキーボード側で記憶している。プログラム上で状態を保持する必要はない。
7:キーボード本体がUSB、PS/2両方対応になっている場合はUSB−PS/2変換コネクタが使える。
  USBキーボードに変換コネクタを接続してもPS/2キーボードとして認識しない。

スポンサーリンク

戻る
TOPへ