📄 keyboard.c
字号:
#include "interrupt.h"
#include "io.h"
#include "message.h"
#include "kernel.h"
/*****************************************************
* 下面是声明 *
*****************************************************/
void keyboard_asm_handle_for_keyboard_interrupt() ;
void keyboard_handle_for_keyboard_interrupt() ;
/*****************************************************
* 下面是定义 *
*****************************************************/
static const int KEYBOARD_KEYBOARD_INTERRUPT_NUMBER = 0x21 ;
static const int KEYBOARD_KEYBOARD_INTERRUPT_IRQ_NUMBER = 1 ;
static int keyboard_is_extention_key_scan_code ;
/*****************************************************
* 下面是函数的实现 *
*****************************************************/
void keyboard_init()
{
keyboard_is_extention_key_scan_code = 0 ;
// 安装中断处理函数
interrupt_install_handle_for_interrupt( KEYBOARD_KEYBOARD_INTERRUPT_NUMBER , keyboard_asm_handle_for_keyboard_interrupt ) ;
// 设置中断屏蔽字
interrupt_set_interrupt_mask_word( KEYBOARD_KEYBOARD_INTERRUPT_IRQ_NUMBER , 1 ) ;
}
// 键盘中断处理函数
void keyboard_handle_for_keyboard_interrupt()
{
unsigned char ch = io_read_from_io_port( 0x60 ) ;
// 先过滤掉特殊字节,扩展码,及弹起键
if( ch == 0x0 || ch > 0x80){ // 0x0 表示按键产生错误 > 0x80 表示弹起键(包括 0xe0 的扩展键)
return ;
}
else{
// 翻译键盘消息,并构造一个消息,发送给内核
switch( ch ){
case 0x1 :
ch = 'r' ; // 本来是 ESC 键,这里用 R 表示
break ;
case 0x17 :
ch = 'i' ;
break ;
case 0x24 :
ch = 'j' ;
break ;
case 0x25 :
ch = 'k' ;
break ;
case 0x26 :
ch = 'l' ;
break ;
default :
ch = 0 ;
}
if( ch ){
struct message_message_struct message ;
message.message_type = MESSAGE_KEYBOARD_MESSAGE ;
message.key = ch ;
message_put_message( &kernel_message_queue , message ) ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -