📄 keyboard.cpp
字号:
#include "keyboard.h"
#include "interrupt.h"
#include "message.h"
#include "kernel.h"
#include "video.h"
#include "kernel.h"
#include "system.h"
struct_pyos_StateKey class_pyos_Keyboard::StateKey ;
bool class_pyos_Keyboard::ex ;
/* 中断实际处理函数 */
void class_pyos_Keyboard::HandleInterrupt()
{
// 从键盘控制器的0x60端口读入扫描码,否则键盘不会第二次中断,因为键盘在等待用户从0x60口读走数据
unsigned char ch = class_pyos_System::FromPort( 0x60 ) ;
// 先过滤掉特殊字节
if( ch == 0x0 ){ // 0x0 表示按键产生错误
return ;
}
else if( ch == 0xe0 ){ // 检测是否是扩展码的前缀
// 设置 扩展码标记位
ex = true ;
// 直接返回,等待下一个中断送来真实的扫描码
return ;
}
else{
// 构造一个键盘消息
struct_pyos_Message message ;
message.MessageType = pyos_message_type_Keyboard ;
if( ex == true ){
message.KeyboardScanCode.KeyboardScanCodeHighChar = 0xe0 ; // 让高字节为扩展码
}
else{
message.KeyboardScanCode.KeyboardScanCodeHighChar = 0 ;
}
ex = 0 ; // 清空扩展码标志
message.KeyboardScanCode.KeyboardScanCodeLowChar = ch ; // 让低字节为送来的真实扫描码
/* 发送消息给应用程序 , ReceiveMessageQueue指向的是接收消息的队列 */
ReceiveMessageQueue->PutData( message ) ;
}
}
/* 翻译键盘扫描码函数 */
char class_pyos_Keyboard::TraslateScanCodeToAsciiCode( struct_pyos_KeyboardScanCode scan_code )
{
/* 默认此键不是功能键,如果此键是功能键时再设置功能键的值 */
StateKey.FunctionKey = keyNotFunctionKey ;
if( scan_code.KeyboardScanCodeLowChar > 0x80 ){
StateKey.Down = false ; // 键被弹起
}
else{
StateKey.Down = true ;
}
if( scan_code.KeyboardScanCodeHighChar == 0xe0 ){
// 对扩展键进行处理
switch( scan_code.KeyboardScanCodeLowChar ){
case 0x1d :
StateKey.CtrlDown = true ;
StateKey.FunctionKey = keyCtrl ;
return 0 ;
case 0x9d :
StateKey.CtrlDown = false ;
StateKey.FunctionKey = keyCtrl ;
return 0 ;
case 0x38 :
StateKey.AltDown = true ;
StateKey.FunctionKey = keyAlt ;
return 0 ;
case 0xb8 :
StateKey.AltDown = false ;
StateKey.FunctionKey = keyAlt ;
return 0 ;
case 0x52 :
case 0xd2 :
StateKey.FunctionKey = keyInsert ;
return 0 ;
case 0x47 :
case 0xc7 :
StateKey.FunctionKey = keyHome ;
return 0 ;
case 0x49 :
case 0xc9 :
StateKey.FunctionKey = keyPageUp ;
return 0 ;
case 0x53 :
case 0xd3 :
StateKey.FunctionKey = keyDelete ;
return 0 ;
case 0x4f :
case 0xcf :
StateKey.FunctionKey = keyEnd ;
return 0 ;
case 0x51 :
case 0xd1 :
StateKey.FunctionKey = keyPageDown ;
return 0 ;
case 0x48 :
case 0xc8 :
StateKey.FunctionKey = keyUpArrow ;
return 0 ;
case 0x4b :
case 0xcb :
StateKey.FunctionKey = keyLeftArrow ;
return 0 ;
case 0x50 :
case 0xd0 :
StateKey.FunctionKey = keyDownArrow ;
return 0 ;
case 0x4d :
case 0xcd :
StateKey.FunctionKey = keyRightArrow ;
return 0 ;
}
}
else{
// 对基本键进行处理
switch( scan_code.KeyboardScanCodeLowChar ){
case 0x1e :
case 0x9e :
return 'a' ;
case 0x30 :
case 0xb0 :
return 'b' ;
case 0x2e :
case 0xae :
return 'c' ;
case 0x20 :
case 0xa0 :
return 'd' ;
case 0x12 :
case 0x92 :
return 'e' ;
case 0x21 :
case 0xa1 :
return 'f' ;
case 0x22 :
case 0xa2 :
return 'g' ;
case 0x23 :
case 0xa3 :
return 'h' ;
case 0x17 :
case 0x97 :
return 'i' ;
case 0x24 :
case 0xa4 :
return 'j' ;
case 0x25 :
case 0xa5 :
return 'k' ;
case 0x26 :
case 0xa6 :
return 'l' ;
case 0x32 :
case 0xb2 :
return 'm' ;
case 0x31 :
case 0xb1 :
return 'n' ;
case 0x18 :
case 0x98 :
return 'o' ;
case 0x19 :
case 0x99 :
return 'p' ;
case 0x10 :
case 0x90 :
return 'q' ;
case 0x13 :
case 0x93 :
return 'r' ;
case 0x1f :
case 0x9f :
return 's' ;
case 0x14 :
case 0x94 :
return 't' ;
case 0x16 :
case 0x96 :
return 'u' ;
case 0x2f :
case 0xaf :
return 'v' ;
case 0x11 :
case 0x91 :
return 'w' ;
case 0x2d :
case 0xad :
return 'x' ;
case 0x15 :
case 0x95 :
return 'y' ;
case 0x2c :
case 0xac :
return 'z' ;
case 0x0b :
case 0x8b :
return '0' ;
case 0x29 :
case 0xa9 :
if( StateKey.ShiftDown ){
return '~' ;
}
else{
return '`' ;
}
case 0x0c :
case 0x8c :
if( StateKey.ShiftDown ){
return '_' ;
}
else{
return '-' ;
}
case 0x0d :
case 0x8d :
if( StateKey.ShiftDown ){
return '+' ;
}
else{
return '=' ;
}
case 0x2b :
case 0xab :
if( StateKey.ShiftDown ){
return '|' ;
}
else{
return '\\' ;
}
case 0x0e :
case 0x8e :
return '\b' ; // 退格键
case 0x39 :
case 0xb9:
return ' ' ;
case 0x0f :
case 0x8f :
return '\t' ;
case 0x3a :
case 0xba :
StateKey.CapsLockDown = !StateKey.CapsLockDown ;
StateKey.FunctionKey = keyCapsLock ;
return 0 ;
case 0x2a :
case 0x36 :
StateKey.ShiftDown = true ;
StateKey.FunctionKey = keyShift ;
return 0 ;
case 0xaa :
case 0xb6 :
StateKey.ShiftDown = false ;
StateKey.FunctionKey = keyShift ;
return 0 ;
case 0x1d :
StateKey.CtrlDown = true ;
StateKey.FunctionKey = keyCtrl ;
return 0 ;
case 0x9d :
StateKey.CtrlDown = false ;
StateKey.FunctionKey = keyCtrl ;
return 0 ;
case 0x38 :
StateKey.AltDown = true ;
StateKey.FunctionKey = keyAlt ;
return 0 ;
case 0xb8 :
StateKey.AltDown = false ;
StateKey.FunctionKey = keyAlt ;
return 0 ;
case 0x1c :
case 0x9c :
return '\n' ;
case 0x01 :
case 0x81 :
return 27 ; // Esc 键
case 0x3b :
case 0xbb :
StateKey.FunctionKey = keyF1 ;
return 0 ;
case 0x3c :
case 0xbc :
StateKey.FunctionKey = keyF2 ;
return 0 ;
case 0x3d :
case 0xbd :
StateKey.FunctionKey = keyF3 ;
return 0 ;
case 0x3e :
case 0xbe :
StateKey.FunctionKey = keyF4 ;
return 0 ;
case 0x3f :
case 0xbf :
StateKey.FunctionKey = keyF5 ;
return 0 ;
case 0x40 :
case 0xc0 :
StateKey.FunctionKey = keyF6 ;
return 0 ;
case 0x41 :
case 0xc1 :
StateKey.FunctionKey = keyF7 ;
return 0 ;
case 0x42 :
case 0xc2 :
StateKey.FunctionKey = keyF8 ;
return 0 ;
case 0x43 :
case 0xc3 :
StateKey.FunctionKey = keyF9 ;
return 0 ;
case 0x44 :
case 0xc4 :
StateKey.FunctionKey = keyF10 ;
return 0 ;
case 0x57 :
case 0xd7 :
StateKey.FunctionKey = keyF11 ;
return 0 ;
case 0x58 :
case 0xd8 :
StateKey.FunctionKey = keyF12 ;
return 0 ;
case 0x1a :
case 0x9a :
if( StateKey.ShiftDown ){
return '{' ;
}
else{
return '[' ;
}
case 0x1b :
case 0x9b:
if( StateKey.ShiftDown ){
return '}' ;
}
else{
return ']' ;
}
case 0x27 :
case 0xa7 :
if( StateKey.ShiftDown ){
return ':' ;
}
else{
return ';' ;
}
case 0x28 :
case 0xa8 :
if( StateKey.ShiftDown ){
return '"' ;
}
else{
return '\'' ;
}
case 0x33 :
case 0xb3 :
if( StateKey.ShiftDown ){
return '<' ;
}
else{
return ',' ;
}
case 0x34 :
case 0xb4 :
if( StateKey.ShiftDown ){
return '>' ;
}
else{
return '.' ;
}
case 0x35 :
case 0xb5 :
if( StateKey.ShiftDown ){
return '?' ;
}
else{
return '/' ;
}
}
}
if( scan_code.KeyboardScanCodeLowChar >= 0x02 && scan_code.KeyboardScanCodeLowChar <= 0x0a ){
// 数字键按下
return scan_code.KeyboardScanCodeLowChar + 0x2f ;
}
if( scan_code.KeyboardScanCodeLowChar >= 0x82 && scan_code.KeyboardScanCodeLowChar <= 0x8a ){
// 数字键被弹起
return scan_code.KeyboardScanCodeLowChar - 0x51 ;
}
}
/* 关闭键盘中断 */
void class_pyos_Keyboard::CloseInterrupt()
{
/* 屏蔽键盘中断,这里其实屏蔽了所有中断 */
class_pyos_System::ToPort( 0x21 , 0xff ) ;
}
/* 打开键盘中断 */
void class_pyos_Keyboard::OpenInterrupt()
{
/* 许可键盘中断 */
class_pyos_System::ToPort( 0x21 , 0xfd ) ;
}
/* 初始化键盘类 */
void class_pyos_Keyboard::Init()
{
/* 初始化状态键 */
StateKey.Down = false ;
StateKey.AltDown = false ;
StateKey.CtrlDown = false ;
StateKey.ShiftDown = false ;
/* 安装键盘中断,中断号为 0x21 */
class_pyos_Interrupt::InstallInterrupt( 0x21 , ( void * )pyos_asm_interrupt_handle_for_keyboard ) ;
/* 这里不许可键盘中断,因为有可能在许可键盘中断前主调用程序会准备一些其它资源,因此当主调用程序把资料
** 准备好之后,自行调用 OpenInterrupt 函数许可中断
*/
}
/* 键盘中断处理函数 */
extern "C" void pyos_interrupt_handle_for_keyboard()
{
class_pyos_Keyboard::HandleInterrupt() ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -