热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【第7章】解析扫描码【六】

还有一个问题仍然遗留着,就是如果按下一些不可打印的键,如F1键,Home键等等,按下这些键并不需要打印任何东西,它们对应的只是一些功能而已,我们前面的代码直接打印出来,出现的是一些莫名

     还有一个问题仍然遗留着,就是如果按下一些不可打印的键,如F1键,Home键等等,按下这些键并不需要打印任何东西,它们对应的只是一些功能而已,我们前面的代码直接打印出来,出现的是一些莫名其妙的东东。

     我们还注意到,映射表的每一项的数据类型是一个u32,实际上一个u8就足够了,因为一个ASCII码也只有8位,那么其余的位可以用来额外表示一些信息,比如说这个键按下的时候有没有按下shift键,有没有按下ctrl键,或者这个键是否是可以打印的。

     我们来看看keyboard.h的一些代码片段,里面定义了一些在keymap.h中用到的宏:

Code:
  1. #define FLAG_EXT    0x0100      /* Normal function keys     */   
  2.     #define FLAG_SHIFT_L    0x0200      /* Shift key            */   
  3.     #define FLAG_SHIFT_R    0x0400      /* Shift key            */   
  4.     #define FLAG_CTRL_L 0x0800      /* Control key          */   
  5.     #define FLAG_CTRL_R 0x1000      /* Control key          */   
  6.     #define FLAG_ALT_L  0x2000      /* Alternate key        */   
  7.     #define FLAG_ALT_R  0x4000      /* Alternate key        */   
  8.     #define FLAG_PAD    0x8000      /* keys in num pad      */   
  9.        
  10.     #define MASK_RAW    0x01FF      /* raw key value = code passed to tty & MASK_RAW   
  11.                            the value can be found either in the keymap column 0   
  12.                            or in the list below */   
  13.        
  14.     /* Special keys */  
  15.     #define ESC     (0x01 + FLAG_EXT)   /* Esc      */   
  16.     #define TAB     (0x02 + FLAG_EXT)   /* Tab      */   
  17.     #define ENTER       (0x03 + FLAG_EXT)   /* Enter    */   
  18.     #define BACKSPACE   (0x04 + FLAG_EXT)   /* BackSpace    */   
  19.        
  20.     #define GUI_L       (0x05 + FLAG_EXT)   /* L GUI    */   
  21.     #define GUI_R       (0x06 + FLAG_EXT)   /* R GUI    */   
  22.     #define APPS        (0x07 + FLAG_EXT)   /* APPS */   
  23.        
  24.     /* Shift, Ctrl, Alt */  
  25.     #define SHIFT_L     (0x08 + FLAG_EXT)   /* L Shift  */   
  26.     #define SHIFT_R     (0x09 + FLAG_EXT)   /* R Shift  */   
  27.     #define CTRL_L      (0x0A + FLAG_EXT)   /* L Ctrl   */   
  28.     #define CTRL_R      (0x0B + FLAG_EXT)   /* R Ctrl   */   
  29.     #define ALT_L       (0x0C + FLAG_EXT)   /* L Alt    */   
  30.     #define ALT_R       (0x0D + FLAG_EXT)   /* R Alt    */  

     其中定义的每个不可打印的键的key都并上了一个FLAG_EXT的宏,这个宏表示0x100,刚好是key的第9位,前8位表示ASCII码,在打印的时候判断一下就OK了,如果key的第9位置1,就代表不可打印,还注意到左shift键用了第10位,右shift键用了第11位,还有一些ctrl键,alt键先不管那么多先。

     我们先前的代码如果碰到的键是不可打印的,就把key置0,表示不可打印,在后面判断一下,如果key为0,则不可打印。但现在在key本身就包含了这个信息,就不用置0,下面来修改代码:

Code:
  1. switch(key)       
  2.           {       
  3.               case SHIFT_L:       
  4.                   Shift_L = make;          
  5.                   break;       
  6.               case SHIFT_R:       
  7.                   Shift_R = make;        
  8.                   break;       
  9.               default:       
  10.                   break;   
  11.           }       
  12.       }       
  13.              
  14.       if(make)       
  15.       {       
  16.          key |= (Shift_L ? FLAG_SHIFT_L : 0);
             key |= (Shift_R ? FLAG_SHIFT_R : 0);
  17.   
  18.          In_Process(key);   
  19.       }       

     我们看到,最后还判断了一下,如果此时按下了shift键,无论是左还是右,都在key的相应位有所表示。

     还有一点就是,Keyboard_Read这个函数只是负责读取对应键的key值,至于如何处理那是上层的事,所以我们新添了一个In_Process函数来处理,这个函数在tty.c中定义:

Code:
  1. #include "keyboard.h"   
  2.   
  3. void In_Process(u32 key_value)   
  4. {   
  5.     char disp[2];
  6.     Memory_Set(disp,2,0);
  7.     if(!(key_value & FLAG_EXT))   
  8.     {   
  9.         disp[0] = key_value & 0xff;   
  10.         Disp_Color_Str(disp,0xa);   
  11.     }   
  12. }   

     别忘了在proto.h中添加函数声明:

Code:
  1. void In_Process(u32 key_value);  

     修改MAKEFILE,运行,按下不可打印的键,什么都没打印出来。


推荐阅读
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
author-avatar
banli
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有