key_map和shift_map分别是一般情况和shift键按下时对应的按键,这是直接从linux代码拷贝过来的
mode 是键盘按下状态标志
位7:caps键按下, 位6:caps键的状态,位5:右alt键按下, 位4:左alt键按下
位3:右ctrl键按下,位2:左ctrl键按下,位1:右shift键按下,位0:左shift键按下
e0用来标识是e0还是e1
#include <linux/head.h> #include <asm/io.h> char key_map[]={ 0,27, '1','2','3','4','5','6','7','8','9','0','-','=', 127,9, 'q','w','e','r','t','y','u','i','o','p','[',']', 13,0, 'a','s','d','f','g','h','j','k','l',';','\'', '`',0, '\\','z','x','c','v','b','n','m',',','.','/', 0,'*',0,32, /* 36-39 */ 16,1,0, /* 3A-49 */ '-',0,0,0,'+', /* 4A-4E */ 0,0,0,0,0,0,0, /* 4F-55 */ '<', 10,1,0 }; char shift_map[]={ 0,27, '!','@','#','$','%','^','&','*','(',')','_','+', 127,9, 'Q','W','E','R','T','Y','U','I','O','P','{','}', 13,0, 'A','S','D','F','G','H','J','K','L',':','\"', '~',0, '|','Z','X','C','V','B','N','M','<','>','?', 0,'*',0,32, /* 36-39 */ 16,1,0, /* 3A-49 */ '-',0,0,0,'+', /* 4A-4E */ 0,0,0,0,0,0,0, /* 4F-55 */ '>', 10,1,0 }; /* *mode 是键盘按下状态标志 *位7:caps键按下, 位6:caps键的状态,位5:右alt键按下, 位4:左alt键按下 *位3:右ctrl键按下,位2:左ctrl键按下,位1:右shift键按下,位0:左shift键按下 */ u8 mode = 0; u8 leds = 2; u8 e0 = 0; void none(void) { //disp_str("none"); } void do_self(unsigned char scan_code) { char output[2]; if(mode&0x20)//右alt按下 { disp_str("Ralt"); } else if(mode & 0x03)//shift键按下 { output[0] = shift_map[scan_code]; disp_str(output); } else { output[0] = key_map[scan_code]; disp_str(output); } } void ctrl(void) { if(e0&0x01)//右侧按下 { mode =mode | 0x8; } else { mode =mode | 0x4; } } void lshift(void) { mode =mode | 0x1; } void rshift(void) { mode =mode | 0x2; } void minus(unsigned char scan_code) { do_self(scan_code); } void alt(void) { if(e0&0x01)//右侧按下 { mode =mode | 0x20; } else { mode =mode | 0x10; } } void caps(void) { disp_str("caps"); } void func(void) { disp_str("func"); } void num(void) { disp_str("num"); } void scroll(void) { disp_str("scroll"); } void cursor(void) { disp_str("cursor"); } void unctrl(void) { if(e0)//右侧按下 { mode =mode & 0xf7; } else { mode =mode & 0xfb; } } void unlshift(void) { mode =mode & 0xfe; } void unrshift(void) { mode =mode & 0xfd; } void unalt(void) { if(e0)//右侧按下 { mode =mode & 0xdf; } else { mode =mode & 0xef; } } void uncaps(void) { disp_str("uncaps"); } typedef void (*function)(unsigned char scan_code); #define Function(address) (*(function)address)(unsigned char scan_code) static function key_table[] = { none,do_self,do_self,do_self /* 00-03 s0 esc 1 2 */ ,do_self,do_self,do_self,do_self /* 04-07 3 4 5 6 */ ,do_self,do_self,do_self,do_self /* 08-0B 7 8 9 0 */ ,do_self,do_self,do_self,do_self /* 0C-0F + ' bs tab */ ,do_self,do_self,do_self,do_self /* 10-13 q w e r */ ,do_self,do_self,do_self,do_self /* 14-17 t y u i */ ,do_self,do_self,do_self,do_self /* 18-1B o p } ^ */ ,do_self,ctrl,do_self,do_self /* 1C-1F enter ctrl a s */ ,do_self,do_self,do_self,do_self /* 20-23 d f g h */ ,do_self,do_self,do_self,do_self /* 24-27 j k l | */ ,do_self,do_self,lshift,do_self /* 28-2B { para lshift , */ ,do_self,do_self,do_self,do_self /* 2C-2F z x c v */ ,do_self,do_self,do_self,do_self /* 30-33 b n m , */ ,do_self,minus,rshift,do_self /* 34-37 . - rshift * */ ,alt,do_self,caps,func /* 38-3B alt sp caps f1 */ ,func,func,func,func /* 3C-3F f2 f3 f4 f5 */ ,func,func,func,func /* 40-43 f6 f7 f8 f9 */ ,func,num,scroll,cursor /* 44-47 f10 num scr home */ ,cursor,cursor,do_self,cursor /* 48-4B up pgup - left */ ,cursor,cursor,do_self,cursor /* 4C-4F n5 right + end */ ,cursor,cursor,cursor,cursor /* 50-53 dn pgdn ins del */ ,none,none,do_self,func /* 54-57 sysreq ? < f11 */ ,func,none,none,none /* 58-5B f12 ? ? ? */ ,none,none,none,none /* 5C-5F ? ? ? ? */ ,none,none,none,none /* 60-63 ? ? ? ? */ ,none,none,none,none /* 64-67 ? ? ? ? */ ,none,none,none,none /* 68-6B ? ? ? ? */ ,none,none,none,none /* 6C-6F ? ? ? ? */ ,none,none,none,none /* 70-73 ? ? ? ? */ ,none,none,none,none /* 74-77 ? ? ? ? */ ,none,none,none,none /* 78-7B ? ? ? ? */ ,none,none,none,none /* 7C-7F ? ? ? ? */ ,none,none,none,none /* 80-83 ? br br br */ ,none,none,none,none /* 84-87 br br br br */ ,none,none,none,none /* 88-8B br br br br */ ,none,none,none,none /* 8C-8F br br br br */ ,none,none,none,none /* 90-93 br br br br */ ,none,none,none,none /* 94-97 br br br br */ ,none,none,none,none /* 98-9B br br br br */ ,none,unctrl,none,none /* 9C-9F br unctrl br br */ ,none,none,none,none /* A0-A3 br br br br */ ,none,none,none,none /* A4-A7 br br br br */ ,none,none,unlshift,none /* A8-AB br br unlshift br */ ,none,none,none,none /* AC-AF br br br br */ ,none,none,none,none /* B0-B3 br br br br */ ,none,none,unrshift,none /* B4-B7 br br unrshift br */ ,unalt,none,uncaps,none /* B8-BB unalt br uncaps br */ ,none,none,none,none /* BC-BF br br br br */ ,none,none,none,none /* C0-C3 br br br br */ ,none,none,none,none /* C4-C7 br br br br */ ,none,none,none,none /* C8-CB br br br br */ ,none,none,none,none /* CC-CF br br br br */ ,none,none,none,none /* D0-D3 br br br br */ ,none,none,none,none /* D4-D7 br br br br */ ,none,none,none,none /* D8-DB br ? ? ? */ ,none,none,none,none /* DC-DF ? ? ? ? */ ,none,none,none,none /* E0-E3 e0 e1 ? ? */ ,none,none,none,none /* E4-E7 ? ? ? ? */ ,none,none,none,none /* E8-EB ? ? ? ? */ ,none,none,none,none /* EC-EF ? ? ? ? */ ,none,none,none,none /* F0-F3 ? ? ? ? */ ,none,none,none,none /* F4-F7 ? ? ? ? */ ,none,none,none,none /* F8-FB ? ? ? ? */ ,none,none,none,none /* FC-FF ? ? ? ? */ }; void do_keyboard(void) { register unsigned char scan_code; scan_code=inb_p(0x60); if(scan_code==0xe0) { disp_str("0xe0"); e0=e0|0x1; //scan_code=inb_p(0x60); } else if(scan_code==0xe1) { disp_str("0xe1"); e0=e0|0x2; //scan_code=inb_p(0x60); } else { key_table[scan_code](scan_code); e0=0; } }