⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard.c

📁 用ST92163开发的鼠标
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -