- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
松原拓也氏著作の[「わかるマイコン電子工作USB機器の製作」|http://www.nicotak.com/usb/index.html]の「ミニキーボードの製作」のプログラムを改造します。ポイントのみ示しています。プログラム全体については本を参照して下さい。
'''改造前の元プログラムbulkloopの著作権はサイプレスセミコンダクタ社にあります。'''
""改造前の元プログラムbulkloopの著作権はサイプレスセミコンダクタ社にあります。
!!キーテーブル
まずは解析結果から、キーテーブルを書き換えます。ミニキーボードは5×5マトリクスですが、このキーボードは8×11です。こんな感じ。
#define ROWMAX 11 // キーボード行数
#define COLMAX 8 // キーボード列数
BYTE xdata keytable[ROWMAX][COLMAX]={
{58,83,60,78,62,64,66,77}, //[F1 ][Num][F3 ][PgD][F5 ][F7 ][F9 ][End]
. . . (中略) . . .
{154,99, 0, 0, 0, 0, 0, 0} //[SRq][Fn ][ ][ ][ ][ ][ ][ ]
};
xdada(またはcode)オプションを付けています。こうしないとレジスタにテーブルを作ろうとしてメモリ不足エラーになります。xdataについては本(P31)に詳しく説明されています。
!!9〜11ラインの処理
IOポートは8ビットなので足りない9〜11ラインはDポートの下位3ビットを割り当てて使います。キースキャンのはじめの辺りのコードは、
for(row=0;row<ROWMAX;row++){
IOA = 0; OEA = 0;
OED = (OED & 0xF0) | (0 & 0x0F); //9〜11ライン用(b0〜b2).上位4ビットに影響を与えない
if(row < 8){
OEA = 1 << row; // スイッチ行の変更
}else{
OED = (OED & 0xF0) | ((1 << (row - 8)) & 0x0F);//上位4ビットに影響を与えない
}
. . . (続く) . . .
Dポートの上位4ビットは後で別の用途で使うため影響を与えないようにしています。ところでこの本は製作例や図は豊富なのですがプログラムの説明はあまり無いですよね。IOAは、IOportA。OEAは、OutEnableAport。という意味らしいです。なので2行目は、Aポートの全ビットをL(0V)、全ビットを出力不可(入力:ハイインピーダンス)にするということです。
!!Alt, Ctrl, Shiftの処理
エンドポイント1INの最初の+0バイト目(キーバッファin[0])に格納します。スイッチ列読み込み部分は、
for(col=0;col<COLMAX;col++){ // スイッチ列読み込み
if((IOB & (1<<col))==0){ // スイッチON
switch(keytable[row][col])
{
case 224: //Ctrl
in[0] |= 1;//bit0
break;
case 225: //ShiftL
in[0] |= 2;//bit1
break;
case 229: //ShiftR
in[0] |= 32;//bit5
break;
case 226: //Alt
in[0] |= 4;//bit2
break;
. . . (続く) . . .
のようにします。
!!キーロールオーバー
本の例では、キーバッファin[4]だけを使っていますが、実際はin[2..7]の6個使える(6キーロールオーバー)のでそのように修正します。dscr.a51のReportDscrの15行目を、
db 95h, 06h ;; Report count (6)
のようにし、キースキャンのプログラムも変更します。キースキャンの前の方でj=2を定義しておき、スイッチ列読み込み部分の先ほどのswitch文のdefault行で、
. . . (続き) . . .
default:
in[j] = keytable[row][col];
if(j < 7)j++;
}
USBキーボードの製作へ戻る
キーボードLEDの情報を取得するへ進む
!!関連リンク
USBキーボードのキーコードほか参考資料
http://www2d.biglobe.ne.jp/~msyk/keyboard/layout/usbkeycode.html
----
{{comment}}