这里主要是针对键盘鼠标进行编程,并提供相关键盘鼠标接口。并不关心当前是否可输入等这类等待IO的问题,这些交给输入输出子系统完成。
从键盘自身的角度看,键盘是一种输入输出设备,我们敲键盘,按下键盘键,释放键盘按下键,就是对键盘的输入,键盘接收到我们的按键后,会将按键对应的键码输出出去,也就是键盘将按键对应的键码存放在输出缓冲区中,就是对键盘的输出。
键盘内还有个输入缓冲区,我们也可以往键盘的这个输入缓冲区写入数据,这种情况下,对于键盘来说也是一种对键盘的输入,和敲键盘按下或释放按键对键盘输入不同的是,这里的输入数据是我们自己向键盘输入的。
但对于os来说,键盘是一种输入设备,对键盘需要提供的接口就是键盘读操作。键盘提供的读操作接口可以有3个接口。
在读键盘的时候,这里有两种情况,我们要读取键盘输入,首先得是键盘有输入或者有输入的数据让你去读,不管是按下释放键盘键的输入,还是我们往输入缓冲写入的数据,所以我们需要根据输出缓冲区的状态判断键盘是否有输入的数据。判断的依据就是检查输出缓冲区是否为空,为空的话说明没有数据可读,为满的话说明有数据可读。
所以这里第一个就是直接读键盘输入的接口,就是不检查输出缓冲区直接读,当然这种读操作可能不会读到数据,这种读操作也叫异步操作。
第二个读操作就是读之前检查输出缓冲区,知道输出缓冲区满再去读,这种情况也叫同步操作。
第三个是在前面两个思路的基础上提供的读键盘操作,按照前面的思路,键盘有输入的话,我们就把数据从输出缓冲区读出来,再存放在我们自己的一个输出缓冲区中。然后我们这里的读操作是从我们自己的输出缓冲区中去读,而不是直接从键盘内部的输出缓冲区读。
如果开启了键盘中断,读操作也有些差异,之前读键盘的时候,我们是根据输出缓冲区的状态来判断输出缓冲区中是否有数据可读。这里如果开启了键盘中断的话,可以依据键盘中断,如果有键盘输入,就会产生中断,也就是输出缓冲区中有数据可读。可以在键盘中断处理函数中读取键盘输入,把数据从输出缓冲区读出来,再存放在我们自己的一个输出缓冲区中。
PS/2设备
按键
扫描码
Scan Code Set
Scan Code Set规定了每个键盘按键按下或释放时产生的Scan Code,通常,按下或释放一个按键会产生一个对应的扫描码,当然也有一个按键产生多个扫描码的。同一个按键,不同的Scan Code Set产生的扫描码不同。目前主要有3种Scan Code Set。
Scan Code Set即扫描码集。
enum kb_scan_code_set_t { SCAN_CODE_SET_1 = 1, // Scan Code Set 1 SCAN_CODE_SET_2 = 2, // Scan Code Set 2 SCAN_CODE_SET_3 = 3 // Scan Code Set 3 };
大多数键盘在设计的时候都支持Scan Code Set 2。
按键扫描码对应ASCII码映射
通常按下键盘按键,对于显示字符,在显示屏幕上会对应的按键字符。当然,按键产生的是扫描码,并不是直接是显示的字符。所以需要建立按键扫描码到对应显示字符的映射,也就是对应字符的ASCII码,因为将一个字符输出到显示屏幕上显示的时候,实际上是将对应字符的ASCII码输出到显示屏幕上显示。
还有特殊按键,这些按键在按下时,并不会在显示屏幕上显示,它们是一些特殊控制功能键,如Shift,Ctrl,Alt,Enter等,这些也有必要建立对应的ASCII码映射。虽然我们不会直接将它们输出到显示屏幕上,但在响应这些特殊按键时,这么做是有好处的,因为不同的Scan Code Set对于同样的键产生的扫描码是不一样的,这样的话,如果不建立这些扫描码到对应ASCII码的映射,意味着需要针对不同Scan Code Set的按键扫描码进行不同的响应处理,即便按下的是同样的按键,比如,同样按下的是F1键,不同的Scan Code Set产生的扫描码不一样,如果没有对应的统一ASCII码映射,需要针对不同的Scan Code Set产生的扫描码进行响应。如果建立了对应的ASCII码映射,尽管采用的是不同的Scan Code Set,但映射的都是一样的ASCII码,可以采用同样的响应处理。
另外还有按键释放是产生的扫描码。
转换
为了解决不同Scan Code Set之间的兼容性问题,键盘控制器有一个翻译转换功能,可以将Scan Code Set 2翻译转换为Scan Code Set 1。
可以通过设置键盘控制器的配置字节来指定是否开启翻译转换功能,控制键盘控制器是否要将按键输入产生的扫描码翻译转换为Scan Code Set 1。
关于键盘控制器的配置字节可参考键盘控制器那篇文章。
翻译转换是由键盘控制器完成的,我们只是通过开启或关闭这个翻译转换功能,来控制键盘控制器是否需要翻译转换。
Scan Code Set转换
命令
#define KB_CMD_ED 0XED #define KB_CMD_EE 0XEE #define KB_CMD_F0 0XF0 #define KB_CMD_F2 0XF2 #define KB_CMD_F3 0XF3 #define KB_CMD_F4 0XF4 #define KB_CMD_F5 0XF5 #define KB_CMD_F6 0XF6 #define KB_CMD_F7 0XF7 #define KB_CMD_F8 0XF8 #define KB_CMD_F9 0XF9 #define KB_CMD_FA 0XFA #define KB_CMD_FB 0XFB #define KB_CMD_FC 0XFC #define KB_CMD_FD 0XFD #define KB_CMD_FE 0XFE #define KB_CMD_FF 0XFF
确认
#define KB_CMD_ACK 0XFA
怎么接收键盘输入?
键盘鼠标操作
检查键盘
键盘类型
当前采用的是哪种Scan Code Set
键盘控制器是否开启翻译转换功能?
这决定了键盘当前采用的是哪套Scan Code Set。
是否开启键盘中断?
是否开启第1个(first)PS/2端口中断?
检查鼠标
鼠标类型
检查扫描码集
设置扫描码集
键盘鼠标接口
键盘相关接口以"kb_"为前缀,以区分键盘控制器相关接口。
获取当前的扫描码集(Scan Code Set)
int kb_get_scan_code_set() { unsigned char scan_code_set = 0; kb_send(KB_CMD_F0, 0); // command to get current scan code set scan_code_set = kb_read_16(); kprintf("kb: scan code set: 0x%x.\r\n$", scan_code_set); return scan_code_set; }
设置扫描码集(Scan Code Set)
int kb_set_scan_code_set(enum kb_scan_code_set_t scan_code_set) { kb_send(KB_CMD_F0, scan_code_set); // command to set current scan code set return 0; }
相关推荐
网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的...
4. **文件夹整理**:定期整理文件,创建有序的文件夹结构,使用文件命名规则,便于查找和管理文件。 5. **网络优化**:了解并调整网络设置,如DNS解析、路由器的QoS设置,可优化网络速度和稳定性。 6. **安全防护*...
- 数字键盘:输入数字、设置复印份数等。 **控制面板菜单:** - **打印设置:** 调整打印质量、纸张尺寸等。 - **复印设置:** 设置复印份数、复印尺寸等。 - **扫描设置:** 选择扫描格式、分辨率等。 - **传真...
在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统...
在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统...
6. **Keyboard (键盘)**: 输入设备之一,用于输入文本、命令等。 7. **Notepad (记事本)**: Windows自带的一款简单的文本编辑器。 8. **Word (字,词,微软公司生产的文字处理软件)**: Microsoft Word,是一款功能...
这里的IDE设备包括了IDE硬盘和IDE光驱,第一、第二组设备是指主板上的第一、第二根IDE数据线,一般来说靠近芯片的是第一组IDE设备,而主设备、从设备是指在一条IDE数据线上接的两个设备,大家知道每根数据线上可以接...
63. osk------------打开屏幕键盘 64. odbcad32-------ODBC数据源管理器 65. oobe/msoobe /a----检查XP是否激活 66. cmd.exe--------CMD命令提示符 67. regsvr32 /u zipfldr.dll------取消ZIP支持 68. ntbackup...
+-- 第五章 对话框 |------ 5.1 使用资源编辑器编辑对话框 |------ 5.2 创建有模式对话框 |------ 5.3 创建无模式对话框 |------ 5.4 在对话框中进行消息映射 |------ 5.5 在对话框中进行数据交换和数据检查 |------...
【计算机应用基础】第二章测试卷的内容涵盖了计算机操作系统的基础知识,包括操作系统的作用、分类,Windows 7的基本操作,文件管理,以及计算机安全和维护等方面的知识点。 1. 操作系统(OS)是计算机软件系统中不...
1. ENIAC是世界上第一台电子计算机,它于1946年诞生,主要用于数值计算,加减运算速度达到每秒5000次。 2. 信息技术作为现代科技的核心,已经成为推动全球经济社会发展的新动力。 3. 1997年5月11日,IBM的超级...