PSoC3 PS/2キーボードのカナサポート

投稿日 2012/06/05

先日PSoC3にPS2キーボード(PS/2 Keyboard)をつないでみましたが、今回はそれにカナとテンキーをサポートしました。

PSoC_PS2Kbd_3.jpg

写真1 PSoC3にPS/2キーボードをつなぐ カナとテンキーをサポート

 

スキャンコードから文字コードへの変換テーブルは以下のようになっています。

 

//scancodes.h
unsigned char ctbl[ ][5] = {
//[0]scode [1]shift [2]normal [3]shif-kana [4]kana
0x1C, 'A', 'a', 0xC1, 0xC1, //'チ'
0x32, 'B', 'b', 0xBA, 0xBA, //'コ'
0x21, 'C', 'c', 0xBF, 0xBF, //'ソ'
0x23, 'D', 'd', 0xBC, 0xBC, //'シ',
0x24, 'E', 'e', 0xA8, 0xB2, //'イ',
0x2B, 'F', 'f', 0xCA, 0xCA, //'ハ',
0x34, 'G', 'g', 0xB7, 0xB7, //'キ',
0x33, 'H', 'h', 0xB8, 0xB8, //'ク',
0x43, 'I', 'i', 0xC6, 0xC6, //'ニ',
0x3B, 'J', 'j', 0xCF, 0xCF, //'マ',
0x42, 'K', 'k', 0xC9, 0xC9, //'ノ',
0x4B, 'L', 'l', 0xD8, 0xD8, //'リ',
0x3A, 'M', 'm', 0xD8, 0xD8, //'モ',
0x31, 'N', 'n', 0xD0, 0xD0, //'ミ',
0x44, 'O', 'o', 0xD7, 0xD7, //'ラ',
0x4D, 'P', 'p', 0xBE, 0xBE, //'セ',
0x15, 'Q', 'q', 0xC0, 0xC0, //'タ',
0x2D, 'R', 'r', 0xBD, 0xBD, //'ス',
0x1B, 'S', 's', 0xC4, 0xC4, //'ト',
0x2C, 'T', 't', 0xB6, 0xB6, //'カ',
0x3C, 'U', 'u', 0xC5, 0xC5, //'ナ',
0x2A, 'V', 'v', 0xCB, 0xCB, //'ヒ',
0x1D, 'W', 'w', 0xC3, 0xC3, //'テ',
0x22, 'X', 'x', 0xBB, 0xBB, //'サ',
0x35, 'Y', 'y', 0xDD, 0xDD, //'ン',
0x1A, 'Z', 'z', 0xAF, 0xC2, //'ツ',
0x45, '0', '0', 0xA6, 0xDC, //'ワ', /* Numerical keys */
0x16, '!', '1', 0xC7, 0xC7, //'ヌ',
0x1E, '"', '2', 0xCC, 0xCC, //'フ',
0x26, '#', '3', 0xA7, 0xB1, //'ア',
0x25, '$', '4', 0xA9, 0xB3, //'ウ',
0x2E, '%', '5', 0xAA, 0xB4, //'エ',
0x36, '&', '6', 0xAB, 0xB5, //'オ',
0x3D, '\'', '7', 0xAC, 0xD4, //'ヤ',
0x3E, '(', '8', 0xAD, 0xD5, //'ユ',
0x46, ')', '9', 0xAE, 0xD6, //'ヨ',
0x29, ' ', ' ', ' ', ' ',
0x41, '<', ',', 0xA4, 0xC8, //'ネ',
0x49, '>', '.', 0xA1, 0xD9, //'ル',
0x4E, '=', '-', 0xCE, 0xCE, //'ホ',
0X55, '~', '^', 0xCD, 0xCD, //'ヘ',
0x4C, '+', ';', 0xDA, 0xDA, //'レ',
0x52, '*', ':', 0xB9, 0xB9, //'ケ',
0x4A, '?', '/', 0xA5, 0xD2, //'メ',
0x54, '`', '@', 0xDE, 0xDE, //'゛',
0x5B, '{', '[', 0xA2, 0xDF, //'゜',
0x6A, '|', '\\', 0xB0, 0xB0, //'-',
0x5D, '}', ']', 0xA3, 0xD1, //'ム',
0x51, '_', '\\', 0xDB, 0xDB, //'ロ',
0x70, '0', '0', '0', '0', //10key 0
0x69, '1', '1', '1', '1', //10key 1
0x72, '2', '2', '2', '2', //10key 2
0x7A, '3', '3', '3', '3', //10key 3
0x6B, '4', '4', '4', '4', //10key 4
0x73, '5', '5', '5', '5', //10key 5
0x74, '6', '6', '6', '6', //10key 6
0x6C, '7', '7', '7', '7', //10key 7
0x75, '8', '8', '8', '8', //10key 8
0x7D, '9', '9', '9', '9', //10key 9
0x7C, '*', '*', '*', '*', //10key *
0x7B, '-', '-', '-', '-', //10key -
0x79, '+', '+', '+', '+', //10key +
0x71, '.', '.', '.', '.', //10key .
0, 0, 0, 0
};


 

PSoC3の開発環境PSoC Creatorのソースエディタはカナ入力ができません。このためカナの文字コードは16進数で直接入れています。

 

PSoC3のコンポーネント、回路は変更ありません。

PSoC_PS2Kbd_4.jpg

写真2 "70"はスキャンコード "K"はKANAオン InsはInsertキーが押されたことを示す

 

LCDの一行目にはCAPS、NUMLOCK、KANAキーの入力状態を表示します。

 

CAPS ONのとき"C"
NUMLOCK ONのとき"N"
カナONのとき"K"

 

文字表示できないキーの場合、そのキー名を表示します。たとえはINsertキーは"Ins、HOMEキーは"HOME"、ファンクションキー1の場合"F1"など。

 

Print ScreenとPauseキーはスキャンコードが特殊なのでサポートしていません。

 

CTRLキーと同時に文字キーを押すと、一般的には文字キーのASCIIコードから0x40を引きます。
つまりRS232Cで同期通信を行う場合の制御コードをつくりますが、サポートはしていません。CTRLキーが押されているかはスキャンコードでわかります。CTRL+ALTなどもサポートしていません。

 

キーボードによってスキャンコードの出し方に若干くせがあるかもしれません。動作確認はあくまでも私の所有するキーボードでの話です。

 

このプログラムでは、アプリケーションへの応用時不便なので、関数で呼べるように、ちゃんとしたハンドラにする予定です。


 

[ソースコード]
スキャンコート、文字コード変換テーブルは上記の通りです。

 

main.cは大きくて5000文字に入らないので、後日公開します。


 

(JF1VRR)