热门标签 | 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,运行,按下不可打印的键,什么都没打印出来。


推荐阅读
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • 第十一章 Python基本数据类型及内置方法
    一、概述数据类型是用来记录事物状态的,而事物的状态是不断变化的(如:一个人年龄的增长(操作int类型),单个人名的修改(操作str类型),学生列表中增加学生(操作list类型)等) ... [详细]
  • 题意题目大意很简单,很容易找出对应字母的ASCII码值的关系,但是有一点需要注意,请看代码:读字符串必须要用getline ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • 1、字符型常量字符型常量指单个字符,是用一对单引号及其所括起来的字符表示。例如:‘A’、‘a’、‘0’、’$‘等都是字符型常量。C语言的字符使用的就是 ... [详细]
  • 大数据基础:JavaSE_day06 ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • 本文探讨了C++中如何正确使用+运算符来处理字符串和数字的拼接问题,分析了为何某些操作有效而另一些则会引发编译错误。 ... [详细]
  • 题目描述了一个病毒检测问题,要求使用AC自动机算法统计目标文本中多个模式串的出现次数。 ... [详细]
  • 本文介绍了如何在C语言中通过自定义函数来实现字符串的比较,而不需要依赖标准库中的strcmp函数。文章详细解释了字符串比较的基本原理,并提供了具体的代码示例。 ... [详细]
  • 高效处理大文件:单线程与多线程下的词频统计方法
    本文探讨了在处理大文件时,如何通过单线程和多线程的方式使用Buffer流进行词频统计,以避免一次性加载文件导致的内存溢出问题,并提供了具体的实现代码。 ... [详细]
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社区 版权所有