keyboard.c

来自「pyos is a teach operater system build by」· C语言 代码 · 共 76 行

C
76
字号
#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 + =
减小字号Ctrl + -
显示快捷键?