USBキーボードの作り方 〜組立(仕上げ編)〜
作:2010/01/10
改:2010/09/01
1.特殊キー(OPT)対応
FM-7のBREAKキーのように、マトリックスに組み込まれずそれだけで独立しているキーについては、通常5V押下時0Vとなるような回路で対応。
ただ、回路というほどのものではなく、一方を4.7KΩでプルアップしておいて、一方をGNDと接続するだけ。
サンプルのBREAKキーの作りこみを見れば理解できると思う。
特殊キーの割り当ては、keyboard.cの下記を編集する。
左端がUSBのスキャンコードで、そこしか使っていないので、それ以外を書き換えても無意味。
// EEPROM Map:Scancode for Option key
#pragma romdata
eedata2_scn=0xf00080
ROM unsigned char eedata2_values[0x10] =
{
0x35,0xff,0xff,0xff,0xff,0xff,0xff,0xff
,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
};
#pragma romdata
2.Fnキー対応
keyboard.c の下記を書き換える。USBのスキャンコードではなく、キーボードのスキャンコードをセットする。
#define
FN_KEY 0x68 //
HHK like Fn key: 0x68=Caps Lock
Fnキーの対応表は、下記を書き換える。
Fn押下前USBスキャンコード、押下後USBスキャンコードの組み合わせで登録する。
ちなみに下記は、HHKライクな動きをするサンプル。
// EEPROM Map:HHK like Fn key
#pragma romdata
eedata3_scn=0xf00090
ROM unsigned char eedata3_values[0x40] =
{
0x2f,0x52,0x34,0x4f,0x33,0x50,0x38,0x51,0x0F,0x49,0x37,0x4e,0x0e,0x4a,0x36,0x4d,
0x0c,0x46,0x12,0x47,0x13,0x48,0x2a,0x4c,0x2b,0x39,0x30,0x49,0x1e,0x3a,0x1f,0x3b,
0x20,0x3c,0x21,0x3d,0x22,0x3e,0x23,0x3f,0x24,0x40,0x25,0x41,0x26,0x42,0x27,0x43,
0x2d,0x44,0x2e,0x45,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
#pragma
romdata
3.ゴーストキー対応
逆流防止ダイオードが埋め込まれていないキーボードの場合、ゴーストキーの対応をしておいたほうが誤入力が減る。
下記を1にすると有効になる。
#define
GHOST_KEY_REDUCTION 1 // 0...Disabled 1...Enabled
ゴーストキーが発生しないのにゴーストキーリダクションが働くと困るので、キーがマトリックス上存在する・しないところを登録しておく。
それが下記。1になっているところはキーが存在する、0になっているところはキーが存在しない、を表す。
ただし、ビット順が表示の関係で実際のキーマトリックスと合わないように感じるので注意が必要。
// EEPROM Map:GHOST(Phantom) Key reduction
#pragma romdata
eedata4_scn=0xf000D0
ROM unsigned char eedata4_values[0x10] =
{
0b00011111,0b00011111,
0b00011111,0b00011111,
0b00111111,0b00111111,
0b00111111,0b00111111,
0b00111111,0b00011111,
0b00011111,0b00011111,
0b00011111,0b00011111,
0b00011111,0b00011111
};
#pragma
romdata
ちなみにビットの並び順は、すごくあたりまえなのだが
C7 C6 C5 C4 C3 C2 C1 C0 , C15 C14 C13
C12 C11 C10 C9 C8 となる。
C0 C1 C2 C3 C4 C5 C6 C7 , C8 C9 C10 C11 C12 C13 C14
C15 ではないので注意!!
むずかしいかな?キーマトリックスとよーく見比べてください。
参考:【再掲】組立後編のキーマトリックス
// EEPROM Map:KEY MATRIX to
USB SCANCODE
#pragma romdata eedata1_scn=0xf00000
ROM unsigned char
eedata1_values[0x80] =
{
0x29,0x26,0x12,0x0f,0x37,0xff,0xff,0xff
,0x60,0x5f,0x63,0x5d,0x5a,0xff,0xff,0xff,
0x61,0x2a,0x53,0x5e,0x5b,0xff,0xff,0xff
,0x55,0x89,0x28,0x56,0x57,0xff,0xff,0xff,
0x2c,0x24,0x18,0x0d,0x10,0x3a,0xff,0xff
,0x52,0x21,0x15,0x09,0x19,0x3b,0xff,0xff,
0x35,0x23,0x1c,0x0b,0x11,0x3c,0xff,0xff
,0x50,0x25,0x0c,0x0e,0x36,0x3d,0xff,0xff,
0x51,0x27,0x13,0x33,0x38,0x3e,0xff,0xff
,0x4f,0x2e,0x30,0x32,0x54,0xff,0xff,0xff,
0xe0,0x2d,0x2f,0x34,0x87,0xff,0xff,0xff
,0xe1,0x20,0x62,0x5c,0x59,0xff,0xff,0xff,
0xff,0xff,0x14,0x04,0x1d,0xff,0xff,0xff
,0x39,0x22,0x17,0x0a,0x05,0xff,0xff,0xff,
0x2b,0x1e,0x1a,0x16,0x1b,0xff,0xff,0xff
,0xe2,0x1f,0x08,0x07,0x06,0xff,0xff,0xff
};
#pragma
romdata
4.LEDの吸い込み対応
FM−7のキーボードなど、LEDを吸い込みで制御する場合、下記のように設定する。
LATC=hid_report_out[0]&0b00000111;
↓
LATC=(~hid_report_out[0])&0b00000111;
5.CPU使用率がちょっと下がるかも
Microchipのフレームワークは、キーの押下状態が変わらなくても、現在の状態をひたすら送り続けるようになっている。
これを、「前回送信のときと異なる場合のみ、送信する」とすればPCのCPUの使用率が1%程度下がったような気がする。(プラシーボ効果かもしれない)
代わりに安定度は少し落ちるかもしれないが、ぜんぜん気にならないレベルかと思う。
具体的にいうと下記のところ。hid_report_in[0]〜hid_report_in[7]が前回送信と同じときは、HIDTxPacket...の処理をスキップすればいい。まあ、気になる人は試してください。
if(!HIDTxHandleBusy(lastINTransmission))
{
lastINTransmission =
HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x08);
}
top
page