• zyf's avatar
    update · 3e6ab325
    zyf authored
    3e6ab325
kb.c 3.06 KiB
#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,  /* 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 }