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

📄 kbd.c

📁 用于汇编领域的,运用于OS的MAIN函数.基于硬件基础的源代码
💻 C
字号:
#include "hos.h"/* Current shift state */#define LEFT_SHIFT	0x01#define RIGHT_SHIFT	0x02#define LEFT_CTRL	0x04#define RIGHT_CTRL	0x08#define LEFT_ALT	0x10#define RIGHT_ALT	0x20#define SHIFT_MASK	(LEFT_SHIFT | RIGHT_SHIFT)#define CTRL_MASK	(LEFT_CTRL | RIGHT_CTRL)#define ALT_MASK	(LEFT_ALT | RIGHT_ALT)/* Translate from scan code to key code, when shift is not pressed. */static const keycode scan_table[] = {	KEY_UNKNOWN, ASCII_ESC, '1', '2',	/* 0x00 ~ 0x03 */	'3', '4', '5', '6',			/* 0x04 ~ 0x07 */	'7', '8', '9', '0',			/* 0x08 ~ 0x0B */	'-', '=', ASCII_BS, '\t',		/* 0x0C ~ 0x0F */	'q', 'w', 'e', 'r',			/* 0x10 ~ 0x13 */	't', 'y', 'u', 'i',			/* 0x14 ~ 0x17 */	'o', 'p', '[', ']',			/* 0x18 ~ 0x1B */	'\r', KEY_LCTRL, 'a', 's',		/* 0x1C ~ 0x1F */	'd', 'f', 'g', 'h',			/* 0x20 ~ 0x23 */	'j', 'k', 'l', ';',			/* 0x24 ~ 0x27 */	'\'', '`', KEY_LSHIFT, '\\',		/* 0x28 ~ 0x2B */	'z', 'x', 'c', 'v',			/* 0x2C ~ 0x2F */	'b', 'n', 'm', ',',			/* 0x30 ~ 0x33 */	'.', '/', KEY_RSHIFT, KEY_PRINTSCRN,	/* 0x34 ~ 0x37 */	KEY_LALT, ' ', KEY_CAPSLOCK, KEY_F1,	/* 0x38 ~ 0x3B */	KEY_F2, KEY_F3, KEY_F4, KEY_F5,		/* 0x3C ~ 0x3F */	KEY_F6, KEY_F7, KEY_F8,	KEY_F9,		/* 0x40 ~ 0x43 */	KEY_F10, KEY_NUMLOCK, KEY_SCRLOCK, KEY_KPHOME,	/* 0x44 ~ 0x47 */	KEY_KPUP, KEY_KPPGUP, KEY_KPMINUS, KEY_KPLEFT,	/* 0x48 ~ 0x4B */	KEY_KPCENTER, KEY_KPRIGHT, KEY_KPPLUS, KEY_KPEND,	KEY_KPDOWN, KEY_KPPGDN, KEY_KPINSERT, KEY_KPDEL,	KEY_SYSREQ, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,};int key_entered;  // used to detect key press#define SCAN_TABLE_SIZE		(sizeof(scan_table) / sizeof(keycode))void kbd_isr(void);static int convert(unsigned code){	if(code > 0x80)		return 0;	if(code >= SCAN_TABLE_SIZE)		return 0;	return scan_table[code];}void kbd_handler(void){	unsigned scancode, temp;	scancode = inbyte(0x60);	temp = convert(scancode);	if(temp != 0)			put_char(temp);    key_entered=1; // used for wait_for_anykey()	/* EOI */	outbyte(0x20, 0x20);}void init_kbd(void){	unsigned short irqmask;	printk("[kernel] Initializing keyboard...\n");	set_intr_gate(0x21, &kbd_isr);	unmask_irq(1);}void wait_for_anykey(){// if the user hits anykey, return   key_entered=0;  // will become 1 inside kbd handler   for(;;){      if (key_entered==1) return;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -