An error occurred while loading the file. Please try again.
-
zyf authored3e6ab325
#include <system.h>
/* 键盘修饰键定义 */
#define KB_SHIFT 0x11
#define KB_ALT 0x12
#define KB_CTRL 0x13
/* 键盘状态位,用于记录 Shift、Ctrl 和 Alt 键的状态 */
unsigned short key_status = 0x0000;
/* 美国键盘布局的扫描码表 */
unsigned char us_keyboard_layout[128] = {
0, 27, '1', '2', '3', '4', '5', '6', '7', '8', /* 9 */
'9', '0', '-', '=', '\b', /* 退格键 */
'\t', /* 制表符 */
'q', 'w', 'e', 'r', /* 19 */
't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', /* Enter键 */
0, /* 29 - Control */
'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* 39 */
'\'', '`', 0, /* 左Shift */
'\\', 'z', 'x', 'c', 'v', 'b', 'n', /* 49 */
'm', ',', '.', '/', 0, /* 右Shift */
'*',
0, /* Alt */
' ', /* 空格键 */
0, /* 大写锁定 */
0, /* 59 - F1键 ... > */
0, 0, 0, 0, 0, 0, 0, 0,
0, /* < ... F10 */
0, /* 69 - Num lock */
0, /* 滚动锁定 */
0, /* Home键 */
0, /* 上箭头 */
0, /* Page Up */
'-',
0, /* 左箭头 */
0,
0, /* 右箭头 */
'+',
0, /* 79 - End键 */
0, /* 下箭头 */
0, /* Page Down */
0, /* Insert键 */
0, /* Delete键 */
0, 0, 0,
0, /* F11键 */
0, /* F12键 */
0, /* 所有其他键都是未定义的 */
};
/**
* 键盘中断处理函数
* @param r 保存的寄存器上下文
*/
void keyboard_handler(struct regs* r) {
unsigned char scancode;
// 从键盘数据端口读取扫描码
scancode = inportb(0x60);
// 检查扫描码的最高位,判断是按键按下还是释放
if (scancode & 0x80) {
// 按键释放处理
unsigned char released_key = us_keyboard_layout[scancode & 0x7F]; // 去掉最高位得到对应按键
if (released_key == KB_SHIFT) {
key_status &= ~0x0100; // 清除 Shift 状态
} else if (released_key == KB_CTRL) {
key_status &= ~0x0010; // 清除 Ctrl 状态
} else if (released_key == KB_ALT) {
key_status &= ~0x0001; // 清除 Alt 状态
71727374757677787980818283848586878889909192939495969798
}
} else {
// 按键按下处理
unsigned char pressed_key = us_keyboard_layout[scancode];
if (pressed_key == KB_SHIFT) {
key_status |= 0x0100; // 设置 Shift 状态
} else if (pressed_key == KB_CTRL) {
key_status |= 0x0010; // 设置 Ctrl 状态
} else if (pressed_key == KB_ALT) {
key_status |= 0x0001; // 设置 Alt 状态
}
// 检查是否按下 Shift 键,使用对应的字符表输出
if (key_status & 0x0100) { // 如果 Shift 被按下
putch(us_keyboard_layout[scancode + 128]); // 使用大写字符或特殊符号
} else {
putch(us_keyboard_layout[scancode]); // 输出普通字符
}
}
}
/**
* 安装键盘中断处理程序
*/
void keyboard_install() {
irq_install_handler(1, keyboard_handler); // 将键盘中断处理程序挂载到 IRQ1
}