更详细的讲解和代码调试演示过程,请参看视频
Linux kernel Hacker, 从零构建自己的内核

前几节,我们花费不少精力在键盘响应的处理之上,到目前为止,我们的内核能够准确的将按键字符合理的显示在指定窗口上。但目前还有一些遗憾,就是当前内核对shift 键的按下不做反应。按理,当shift键按下后,再按数字键1,那么显示的字符应该是”!”而不是“1”,本节我们要处理的就是响应shift键的点击处理,完成本节后,内核效果如下:

我们可以看到,当按下shift键后,再点击数字键1,2,3,显示的不再是数字字符,而是对应的特殊字符.我们看看对应代码的实现,首先需要修改的是write_vga_desktop.c:

static char keytable1[0x80] = {0,   0,   '!', '@', '#', '$', '%','^', '&', '*', '(', ')', '-', '=', '~', 0,   0,'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '`', '{', 0,   0,   'A', 'S','D', 'F', 'G', 'H', 'J', 'K', 'L', '+', '*', 0,   0,   '}', 'Z', 'X', 'C', 'V','B', 'N', 'M', '<', '>', '?', 0,   '*', 0,   ' ', 0,   0,   0,   0,   0,   0,0,   0,   0,   0,   0,   0,   0,   '7', '8', '9', '-', '4', '5', '6', '+', '1','2', '3', '0', '.', 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,0,   0,   0,   '_', 0,   0,   0,   0,   0,   0,   0,   0,   0,   '|', 0,   0};int  key_shift = 0;

首先我们增加了一个输入表keytable1,已经一个变量key_shift, 当shift键被按下时这个变量的值变为非0,当shift键松开后,该变量的值恢复为0.对应的当shift键按下时,显示键盘字符时使用keytable1表,如果shift键没有被按下,那么使用keytable表。

char  transferScanCode(int data) {if (data == 0x2a)  {//left shift key downkey_shift |= 1;}if (data == 0x36) {//right shift key down key_shift |= 2; }if (data == 0xaa) {//left shift key upkey_shift &= ~1;}if (data == 0xb6) {//right shift key upkey_shift &= ~2;}if (data == 0x2a || data == 0x36 || data == 0xaa || data == 0xb6 || data >= 0x54) {return 0;}char c = 0;if (key_shift == 0 && data<0x54 && keytable[data] != 0) {c = keytable[data];} else if (key_shift != 0 && data < 0x80 && keytable1[data] != 0){c = keytable1[data];}else {c = 0;}return c;
}

上面的函数用于处理按键产生的扫描码和断码,当左边的shift键按下时,键盘发出的扫描码是0x2a, 右边的shift键按下时,键盘的扫描码是0x36,当左边的shift按键松开时,键盘发送的断码是0xaa,右边的shift键放开后,键盘发送的断码是0xb6. 一旦左边的shift键按下时,key_shift的值设置为1,右边shift键按下时,key_shift的值为2。当shift按键松开后,key_shift的值变为0.

从代码中也可以看到,如果key_shift的值不等于0,也就是shift键被按下,那么我们到keytable1里面去查找按键对应的字符,如果key_shift值是0,也就是shift键没有被按下,那么我们到 keytable表中去查找按键对应的字符。我们再看看字符是如何显示出来的:

void CMain(void) {
....for(;;) {....else if (key_to == 0) {if (transferScanCode(data) != 0 && cursor_x < 144) {boxfill8(shtMsgBox->buf, shtMsgBox->bxsize, COL8_FFFFFF,cursor_x,28, cursor_x + 7, 43);sheet_refresh(shtctl, shtMsgBox, cursor_x, 28, cursor_x+8, 44);char c = transferScanCode(data);char buf[2] = {c, 0};showString(shtctl,  shtMsgBox, cursor_x, 28, COL8_000000, buf);cursor_x += 8;stop_task_A = 1;boxfill8(shtMsgBox->buf, shtMsgBox->bxsize, cursor_c, cursor_x,28, cursor_x + 7, 43);sheet_refresh(shtctl, shtMsgBox, cursor_x, 28, cursor_x+8, 44);} }
....
}void console_task(struct SHEET *sheet) {
....for(;;) {....else {if (cursor_x < 240  && transferScanCode(i) != 0) {boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cursor_x,28, cursor_x + 7, 43);sheet_refresh(shtctl, sheet, cursor_x, 28, cursor_x+8, 44);s[0] = transferScanCode(i);s[1] = 0;showString(shtctl, sheet, cursor_x, 28, COL8_FFFFFF, s);cursor_x += 8;}....}
}

从上面的代码我们可以看到,无论是控制台窗口还是文本框窗口,在显示字符前,都先调用transferScanCode函数去将键盘发过来的数值进行转换,如果转换的结果不是0,那么将得到的字符显示到窗口中。完成上面代码后,即可得本文开头所描述的运行结果。

更详细的代码讲解和调试,请参看视频。

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:

java开发系统内核:实现shift按键效果相关推荐

  1. java开发系统内核:让内核从严重错误中恢复

    更详细的讲解和代码调试演示过程,请参看视频 用java开发C语言编译器 更详细的讲解和代码调试演示过程,请参看视频 如何进入google,算法面试技能全面提升指南 如果你对机器学习感兴趣,请参看一下链 ...

  2. java开发系统内核:放大招!为系统开发星球大战游戏程序

    当前,我们的系统已经发展到了一定较为完善的程度,当然最为一个练习系统,它不可能跟专业的windows或linux相比,但麻雀虽小五腑俱全,我们的系统还是能支持用户在其上面开发出不少复杂但又有趣的应用程 ...

  3. 用Emacs进行Java开发

    <?xml version="1.0" encoding="utf-8"?> 用Emacs进行Java开发 用Emacs进行Java开发 Table ...

  4. c java 系统开发_java开发系统内核:使用C语言开发系统应用程序

    更详细的讲解和代码调试演示过程,请参看视频 用java开发C语言编译器 如果你对机器学习感兴趣,请参看一下链接: 机器学习:神经网络导论 我们的操作系统通过增添内核接口导出机制后,已经可以作为平台,运 ...

  5. java开发按键精灵_Java 按键精灵

    软件介绍 快速开发工具类,用最简洁的命令实现想要的功能.辅助模拟开发. 纯Java,跨平台,模拟按键.鼠标点击.找图.找色,实现简单按键精灵的功能 DEMO演示 辅助开发配套工具:ScreenCapt ...

  6. 2020春招 / 2021秋招阿里、腾讯、字节、快手、美团 JAVA 开发岗面试高频问题总结

    2020春招 / 2021秋招阿里.腾讯.字节.快手.美团 JAVA 开发岗面试高频问题总结 2.1 进程和线程的区别? 2.2 进程的调度算法有哪些?(主要) 2.3 常用 IO 模型? 2.4 s ...

  7. 玄子Share-BCSP助学手册-JAVA开发

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b2gPyAnt-1676810001349)(./assets/%E7%8E%84%E5%AD%90Share%E4%B ...

  8. 玄子Share-BCSP助学手册之JAVA开发

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rb3mx9IG-1677431488888)(./assets/%E7%8E%84%E5%AD%90Share%E4%B ...

  9. day01--java基础编程:计算机基础知识 ,java语言概述,java开发环境搭建,eclipse概述,创建简单java项目,JDK JRE JVM的关系,java开发中的命名规范,编程风格

    1 Day01–Java开发环境+HelloWorld 1.1 计算机基础知识 资料下载网址:刘沛霞 18600949004 code.tarena.com.cn tarenacode code_20 ...

  10. apache目录 vscode_VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)

    VsCode搭建Java开发环境(Spring Boot项目创建.运行.调试) 安装如下两个主要扩展即可,这两个扩展已关联java项目开发主要使用的maven.springboot等所需要的扩展. 开 ...

最新文章

  1. 计算机cmd入门,ODS(cmd)入门命令大全,果断收藏!!!
  2. 浏览器中可以运行Window2000,WebAssembly 是 JavaScript 的末日?
  3. MSSQLSERVER数据库- SQL交叉表
  4. win7驱动程序未经签名可以使用吗_如何解决高校机房计算机新CPU不支持win7系统的问题...
  5. 【机器学习】如果你不了解机器学习的简史,请看这篇文章
  6. JDK11的新特性:新的HTTP API
  7. Spring Boot——RabbitMQ
  8. Linux学习总结(42)——Linux之Bash脚本入门学习
  9. Configure VNC in RHEL 7
  10. python实例变量命名规则_python变量命名规则
  11. Javascript数据类型检测
  12. 【kaggle注册页面没有显示验证码】
  13. javascript上传文件到服务器,js实现上传图片到服务器
  14. 简述matlab数组和矩阵运算的异同点,matlab矩阵运算和数组运算
  15. 数字化转型提出新要求 新华三IT基础架构如何随需而变?
  16. 学习笔记:《数字媒体技术概论》-5/10 计算机图形与动画技术-中国大学慕课公开课
  17. 搭建 Spring Cloud Alibaba 微服务框架
  18. 筱筱看博客(微信小程序、Lin-ui组件、vant Weapp)
  19. 自动秘钥密码(Autokey)
  20. MATLAB-Simulink中BusCreator/Selector 和 Mux/Demux有什么区别?

热门文章

  1. K8S-污点(taints)与容忍(toleration)
  2. 原创ZooKeeper入门实战教程(一)-介绍与核心概念
  3. wechaty撸一个属于自己的微信机器人(Python版接入文心一言)
  4. c#某幼儿园只收2-6岁的小孩。2-3随入小班,4岁入中班,5~6岁入大班
  5. 人工智能的奥秘:机器学习的各大门派
  6. HDFS RPC处理性能提升之IBR(增量块汇报)的延时批处理
  7. 盐城怎么样才能成为一名健身教练?
  8. 无邪云代挂引导主页HTML代码单页
  9. 如何使用Matlab实现你的量化易略
  10. Codeforces Round 889 (Div. 2)题解