📄 keyboard.c
字号:
#include <cpu.h>
#include <usb.h>
/* Esc, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PrtScr */
#define KESC 0x29
#define KF1 0x3A
#define KF2 0x3B
#define KF3 0x3C
#define KF4 0x3D
#define KF5 0x3E
#define KF6 0x3F
#define KF7 0x40
#define KF8 0x41
#define KF9 0x42
#define KF10 0x43
#define KF11 0x44
#define KF12 0x45
#define KPSC 0x46
#define KF19 0x6E
#define KB4 0x33
/* ~, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, BS */
#define KTLD 0x35
#define K1 0x1E
#define K2 0x1F
#define K3 0x20
#define K4 0x21
#define K5 0x22
#define K6 0x23
#define K7 0x24
#define K8 0x25
#define K9 0x26
#define K0 0x27
#define KMIN 0x2D
#define KEQ 0x2E
#define KBSP 0x2A
#define KF20 0x6F
#define KB3 0x2F
/* TAB, q, w, e, r, t, y, u, i, o, p, [, ], \ */
#define KTAB 0x2B
#define KQ 0x14
#define KW 0x1A
#define KE 0x08
#define KR 0x15
#define KT 0x17
#define KY 0x1C
#define KU 0x18
#define KI 0x0C
#define KO 0x12
#define KP 0x13
#define KLBR 0x2F
#define KRBR 0x30
#define KBSL 0x31
#define KEU1 0x32
#define KEU2 0x64
#define KF21 0x70
#define KB6 0x36
/* Caps, a, s, d, f, g, h, j, k, l, ;, ', Enter, RShift */
#define KCAP 0x39
#define KA 0x04
#define KS 0x16
#define KD 0x07
#define KF 0x09
#define KG 0x0A
#define KH 0x0B
#define KJ 0x0D
#define KK 0x0E
#define KL 0x0F
#define KSEM 0x33
#define KQUO 0x34
#define KENT 0x28
#define KRSH 0xE5
#define KF22 0x71
#define KB5 0x2C
/* LShift, z, x, c, v, b, n, m, ,, ., /, ArrUp, PgDwn, End */
#define KLSH 0xE1
#define KZ 0x1D
#define KX 0x1B
#define KC 0x06
#define KV 0x19
#define KB 0x05
#define KN 0x11
#define KM 0x10
#define KLES 0x36
#define KGTR 0x37
#define KQMR 0x38
#define KUAR 0x52
#define KPDN 0x4E
#define KEND 0x4D
#define KF23 0x72
#define KB2 0x08
/* Ctrl, L1( F17), L2 (LGui), LAlt, Space, RAlt, R1( RGui), R2( App), Ins, Del, PgUp, NumLock( F16), Pause, Scroll */
#define KLCT 0xE0
#define KRCT 0xE4
#define KL1 0x6C
#define KL2 0xE3
#define KLAL 0xE2
#define KSPC 0x2C
#define KRAL 0xE6
#define KR1 0xE7
#define KR2 0x65
#define KINS 0x49
#define KDEL 0x4C
#define KPUP 0x4B
#define KNLC 0x6B
#define KBRK 0x48
#define KSLC 0x47
#define KF24 0x73
#define KB1 0x15
/* ArrLeft, ArrDown, ArrRight, ... */
#define KLAR 0x50
#define KDAR 0x51
#define KRAR 0x4F
/* ..., Home, ... */
#define KNUL 0x00
#define KHOM 0x4A
#pragma register_file EP2TxAddr 16
extern volatile void *EP2TxAddr ;
#pragma register_file EP2TxCount 18
extern volatile WORD EP2TxCount ;
#pragma register_file EP2RxAddr 20
extern volatile void *EP2RxAddr ;
#pragma register_file EP2RxCount 22
extern volatile WORD EP2RxCount ;
#pragma register_file EP3TxAddr 24
extern volatile void *EP3TxAddr ;
#pragma register_file EP3TxCount 26
extern volatile WORD EP3TxCount ;
//#pragma register_file EP3RxAddr 28
//extern volatile void *EP3RxAddr ;
//#pragma register_file EP3RxCount 30
//extern volatile WORD EP3RxCount ;
typedef const unsigned char keymap[ 8][ 16] ;
keymap scancode[ 6] = {
{ /* USB European */
{ KTLD, KF1, KF2, K5, K6, KEQ, KF8, KMIN, KF9, KR2, KINS, KPUP, KHOM, KNUL, KF19, KB4},
{ K1, K2, K3, K4, K7, K8, K9, K0, KF10, KF12, KF11, KPDN, KEND, KPSC, KNUL, KB6},
{ KQ, KW, KE, KR, KU, KI, KO, KP, KNUL, KNUL, KNUL, KLCT, KR1, KSLC, KF20, KB3},
{ KTAB, KCAP, KF3, KT, KY, KRBR, KF7, KLBR, KBSP, KNUL, KNUL, KNUL, KNUL, KNUL, KLSH, KB5},
{ KA, KS, KD, KF, KJ, KK, KL, KSEM, KNUL, KNUL, KNUL, KL2, KNUL, KNUL, KF22, KB1},
{ KESC, KEU2, KF4, KG, KH, KF6, KNUL, KQUO, KF5, KNUL, KNUL, KNUL, KUAR, KLAL, KF23, KB2},
{ KZ, KX, KC, KV, KM, KLES, KGTR, KEU1, KENT, KNUL, KBRK, KNUL, KDEL, KF21, KRSH, KNUL},
{ KNUL, KNUL, KL1, KB, KN, KNUL, KNUL, KQMR, KSPC, KRAR, KDAR, KNUL, KLAR, KRAL, KF24, KNUL}
},
{ /* UK -> US */
{ KTLD, KF1, KF2, K5, K6, KEQ, KF8, KMIN, KF9, KR2, KINS, KPUP, KHOM, KNUL, KF19, KB4},
{ K1, K2, K3, K4, K7, K8, K9, K0, KF10, KF12, KF11, KPDN, KEND, KPSC, KNUL, KB6},
{ KQ, KW, KE, KR, KU, KI, KO, KP, KNUL, KNUL, KNUL, KLCT, KR1, KSLC, KF20, KB3},
{ KTAB, KCAP, KF3, KT, KY, KRBR, KF7, KLBR, KBSP, KNUL, KNUL, KNUL, KNUL, KNUL, KLSH, KB5},
{ KA, KS, KD, KF, KJ, KK, KL, KSEM, KNUL, KNUL, KNUL, KL2, KNUL, KNUL, KF22, KB1},
{ KESC, KBSL, KF4, KG, KH, KF6, KNUL, KQUO, KF5, KNUL, KNUL, KNUL, KUAR, KLAL, KF23, KB2},
{ KZ, KX, KC, KV, KM, KLES, KGTR, KEU2, KENT, KNUL, KBRK, KNUL, KDEL, KF21, KRSH, KNUL},
{ KNUL, KNUL, KL1, KB, KN, KNUL, KNUL, KQMR, KSPC, KRAR, KDAR, KNUL, KLAR, KRAL, KF24, KNUL}
},
{ /* GE -> US */
{ KTLD, KF1, KF2, K5, K6, KEQ, KF8, KQMR, KF9, KR2, KINS, KPUP, KHOM, KNUL, KF19, KB4},
{ K1, K2, K3, K4, K7, K8, K9, K0, KF10, KF12, KF11, KPDN, KEND, KPSC, KNUL, KB6},
{ KQ, KW, KE, KR, KU, KI, KO, KP, KNUL, KNUL, KNUL, KLCT, KR1, KSLC, KF20, KB3},
{ KTAB, KCAP, KF3, KT, KZ, KRBR, KF7, KLBR, KBSP, KNUL, KNUL, KNUL, KNUL, KNUL, KLSH, KB5},
{ KA, KS, KD, KF, KJ, KK, KL, KSEM, KNUL, KNUL, KNUL, KL2, KNUL, KNUL, KF22, KB1},
{ KESC, KEU2, KF4, KG, KH, KF6, KNUL, KQUO, KF5, KNUL, KNUL, KNUL, KUAR, KLAL, KF23, KB2},
{ KY, KX, KC, KV, KM, KLES, KGTR, KBSL /* KEU1 */, KENT, KNUL, KBRK, KNUL, KDEL, KF21, KRSH, KNUL},
{ KNUL, KNUL, KL1, KB, KN, KNUL, KNUL, KMIN, KSPC, KRAR, KDAR, KNUL, KLAR, KRAL, KF24, KNUL}
},
{ /* FR -> US */
{ KTLD, KF1, KF2, K5, K6, KEQ, KF8, KMIN, KF9, KR2, KINS, KPUP, KHOM, KNUL, KF19, KB4},
{ K1, K2, K3, K4, K7, K8, K9, K0, KF10, KF12, KF11, KPDN, KEND, KPSC, KNUL, KB6},
{ KA, KZ, KE, KR, KU, KI, KO, KP, KNUL, KNUL, KNUL, KLCT, KR1, KSLC, KF20, KB3},
{ KTAB, KCAP, KF3, KT, KY, KRBR, KF7, KLBR, KBSP, KNUL, KNUL, KNUL, KNUL, KNUL, KLSH, KB5},
{ KQ, KS, KD, KF, KJ, KK, KL, KM, KNUL, KNUL, KNUL, KL2, KNUL, KNUL, KF22, KB1},
{ KESC, KEU2, KF4, KG, KH, KF6, KNUL, KQUO, KF5, KNUL, KNUL, KNUL, KUAR, KLAL, KF23, KB2},
{ KW, KX, KC, KV, KLES, KSEM, KGTR, KBSL /* KEU1 */, KENT, KNUL, KBRK, KNUL, KDEL, KF21, KRSH, KNUL},
{ KNUL, KNUL, KL1, KB, KN, KNUL, KNUL, KQMR, KSPC, KRAR, KDAR, KNUL, KLAR, KRAL, KF24, KNUL}
},
{ /* IT -> US */
{ KBSL, KF1, KF2, K5, K6, KEQ, KF8, KQMR, KF9, KR2, KINS, KPUP, KHOM, KNUL, KF19, KB4},
{ K1, K2, K3, K4, K7, K8, K9, K0, KF10, KF12, KF11, KPDN, KEND, KPSC, KNUL, KB6},
{ KQ, KW, KE, KR, KU, KI, KO, KP, KNUL, KNUL, KNUL, KLCT, KR1, KSLC, KF20, KB3},
{ KTAB, KCAP, KF3, KT, KY, KRBR, KF7, KLBR, KBSP, KNUL, KNUL, KNUL, KNUL, KNUL, KLSH, KB5},
{ KA, KS, KD, KF, KJ, KK, KL, KSEM, KNUL, KNUL, KNUL, KL2, KNUL, KNUL, KF22, KB1},
{ KESC, KEU2, KF4, KG, KH, KF6, KNUL, KQUO, KF5, KNUL, KNUL, KNUL, KUAR, KLAL, KF23, KB2},
{ KZ, KX, KC, KV, KM, KLES, KGTR, KTLD /* KEU1 */, KENT, KNUL, KBRK, KNUL, KDEL, KF21, KRSH, KNUL},
{ KNUL, KNUL, KL1, KB, KN, KNUL, KNUL, KMIN, KSPC, KRAR, KDAR, KNUL, KLAR, KRAL, KF24, KNUL}
},
{ /* SP -> US */
{ KTLD, KF1, KF2, K5, K6, KEQ, KF8, KQMR, KF9, KR2, KINS, KPUP, KHOM, KNUL, KF19, KB4},
{ K1, K2, K3, K4, K7, K8, K9, K0, KF10, KF12, KF11, KPDN, KEND, KPSC, KNUL, KB6},
{ KQ, KW, KE, KR, KU, KI, KO, KP, KNUL, KNUL, KNUL, KLCT, KR1, KSLC, KF20, KB3},
{ KTAB, KCAP, KF3, KT, KY, KRBR, KF7, KLBR, KBSP, KNUL, KNUL, KNUL, KNUL, KNUL, KLSH, KB5},
{ KA, KS, KD, KF, KJ, KK, KL, KSEM, KNUL, KNUL, KNUL, KL2, KNUL, KNUL, KF22, KB1},
{ KESC, KEU2, KF4, KG, KH, KF6, KNUL, KQUO, KF5, KNUL, KNUL, KNUL, KUAR, KLAL, KF23, KB2},
{ KZ, KX, KC, KV, KM, KLES, KGTR, KBSL /* KEU1 */, KENT, KNUL, KBRK, KNUL, KDEL, KF21, KRSH, KNUL},
{ KNUL, KNUL, KL1, KB, KN, KNUL, KNUL, KMIN, KSPC, KRAR, KDAR, KNUL, KLAR, KRAL, KF24, KNUL}
}
} ;
keymap *scanmap ;
BYTE kbd_Buffer[ 8] ;
static BYTE kbd_tmp[ 8] ;
BYTE kbd_idx ;
static BYTE cols[ 16] ;
void KEYBOARD_Send( void) ;
static void kbd_rollover( void)
{
for( kbd_idx = 2 ; kbd_idx < 8 ; kbd_idx++)
{
kbd_Buffer[ kbd_idx] = 0x01 ;
}
}
void kbd_insert( BYTE scan)
{
if( kbd_idx < 8)
{
kbd_Buffer[ kbd_idx++] = scan ;
}
else
{
kbd_rollover() ;
}
}
void do_col( BYTE col, BYTE byt)
{
BYTE scan, row, bit ;
row = 0 ;
for( bit = 0x01 ; bit ; bit <<= 1)
{
if( byt & bit)
{
scan = (*scanmap)[ row][ col] ;
switch( scan)
{
case 0x00:
/* Code non in matrix: Can't be */
break ;
case KLCT: /* 0xE0: */
kbd_Buffer[ 0] |= 0x01 ;
break ;
case KLSH: /* 0xE1: */
kbd_Buffer[ 0] |= 0x02 ;
break ;
case KLAL: /* 0xE2: */
kbd_Buffer[ 0] |= 0x04 ;
break ;
case KL2: /* 0xE3: */
kbd_Buffer[ 0] |= 0x08 ;
break ;
case KRCT: /* 0xE4: */
kbd_Buffer[ 0] |= 0x10 ;
break ;
case KRSH: /* 0xE5: */
kbd_Buffer[ 0] |= 0x20 ;
break ;
case KRAL: /* 0xE6: */
kbd_Buffer[ 0] |= 0x40 ;
break ;
case KR1: /* 0xE7: */
kbd_Buffer[ 0] |= 0x80 ;
break ;
default:
kbd_insert( scan) ;
}
}
row += 1 ;
}
}
BYTE get_key( void)
{
BYTE byt, cnt, tmp ;
// byt = 0x7F ;
// cnt = 0 ;
// while( --cnt)
// {
// byt &= ~P3DR | 0xF0 ;
// byt &= (~P4DR << 4) | 0x0F ;
// }
tmp = cnt = 0 ;
do
{
byt = ~P3DR & 0x0F ;
byt |= (~P4DR << 4) & 0xF0 ;
if( tmp == byt)
{
cnt += 1 ;
}
else
{
tmp = byt ;
cnt = 0 ;
}
} while( cnt < 255) ;
return byt ;
}
void cols_poll( void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -