驱动程序开发技术-过滤键盘驱动

驱动程序开发技术-过滤键盘驱动
驱动程序开发技术-过滤键盘驱动

《驱动程序开发技术》大作业

——过滤键盘驱动

姓名:梁海杰

学号:2009441624

班级:计科普0902

摘要

Kbdclass.sys是键盘的类驱动,无论是USB键盘,还是PS/2键盘都要经过它的处理;在键盘类驱动之下,和实际硬件打交道的驱动叫做“端口驱动”,比如:i8042prt.sys是ps/2键盘的端口驱动,Kbdhid.sys是USB键盘的端口驱动。键盘中断导致键盘中断服务例程被执行,导致最终i8042prt的I8042KeyboardInterruptService被执行。在I8042KeyboardInterruptService中,从端口读取扫描码,放到一个KEYBOARD_INPUT_DATA 结构中。并把这个结构放到i8042prt的输入队列中。最后会调用内核api函数KeInsertQueueDpc。在这个调用中会调用上层KbdClass.sys中处理输入的回调函数KeyboardClassServiceCallback,取走i8042prt的输入数据队列里的数据。利用驱动分层机制,使用过滤驱动捕获键盘的扫描码并保存下来;应用程序定时访问驱动程序取回扫描码,转换成相应的按键名称并显示;通过应用程序设定按键映射,应用程序将指令传送给驱动程序,以实现将指定的按键消息转换成其他按键。

关键词:过滤键盘;驱动分层;映射;扫描码

过滤键盘驱动

一、主要设计思路

利用驱动分层机制,使用过滤驱动捕获键盘的扫描码并保存下来;应用程序定时访问驱动程序取回扫描码,转换成相应的按键名称并显示;通过应用程序设定按键映射,应用程序将指令传送给驱动程序,以实现将指定的按键消息转换成其他按键。

键盘过滤驱动是工作在异步模式下的。系统为了得到一个按键操作,首先要发送一个IRP_MJ_READ消息到驱动的设备栈,驱动收到这个IRP后,会一直保持这个IRP为未确定(pending)态,因为当时并没有按键操作。直到一个键被真正的按下,驱动此时就会立刻完成这个IRP,并将刚按下的键的相关数据做为该IRP的返回值。在该IRP带着对应的数据返回后,操作系统将这些值传递给对应的事件系统来处理,然后系统紧接着又会立刻发送一个IRP_MJ_READ请求,等待下次的按键操作,重复以上的步骤。

为了实现截获键盘消息,需要在过滤驱动程序中创建一个挂接到物理键盘设备上层的过滤驱动设备。系统发送的IRP_MJ_READ消息会首先到达过滤驱动设备,这样就可以有机会给IRP_MJ_READ设置指定的完成例程,然后将消息下传给物理键盘设备。当有按键动作发生时,IRP_MJ_READ消息在完成后就会调用指定的完成例程,这时就可以在完成例程中读出键盘动作的内容,或者修改这些信息,以实现按键的映射。

表.2:截获键盘消息

标准的按键扫描码和ASCII码没有直接的对应关系,大部分按键的扫描码为一个字节;部分功能键为两个字节,且都以0xE0为高字节。但实验中发现,IRP中返回的按键信息和标准的扫描码并不全等。在KEYBOARD_INPUT_DATA结构中,MakeCode字段仅包含了一个字节的编码,还要同时参照Flags字段的内容才能判断出按键的扫描码。

下表是KEYBOARD_INPUT_DATA结构中两个字段的内容与其所代表的按键动作的对应关

系。当Flags=0或1时,说明按下的按键是扫描码为一个字节的按键;若Flags=2或3,则

说明按下的是扫描码为两个字节的按键,而MakeCode中只保留扫描码的低字节。

表.3:按键动作的对应关系

若使用指定的内容改写返回值中的KEYBOARD_INPUT_DATA结构,就可以改变按键的作用,实现按键映射的功能。

除了IRP_MJ_READ以外,对于其他发送给键盘设备的消息,到达过滤驱动设备时就可以不做处理,直接下传给键盘设备,以保证系统的正常工作。

在完成例程中将每次捕获得到的扫描码保存起来,应用程序每隔一定的时间(100ms)读取一次并将其清空,再根据扫描码查表得到相应按键的名称,这样就可以做到在应用程序中实时的显示键盘动作。用户在应用程序中设定好按键映射的对应关系后,可以通过IRP_MJ_DEVICE_CONTROL消息将映射关系发送给过滤驱动程序,还是在完成例程中实现按键

的映射替代。

二、模块的划分、实现及说明

具体实现分为驱动程序和应用程序两大部分。驱动程序用C和WindowsXP DDK实现,应用程序通过VC++ 6.0基于MFC实现。在调试和测试中使用了DriverMonitor和Dbgview等工具。

下面分别介绍其中主要部分的实现:

(一)驱动程序部分

1.DEVICE_EXTENSION的定义

2.DriverEntry

主要任务是填写MajorFunction数组、设置卸载例程,并调用CreateDevice函数。对所关心的一些消息分别设置回调函数,为其他消息设置通用处理函数。

3.DispatchGeneral

对于不关心的那些消息,返回成功值并传递给下一层的键盘设备,本层不作处理。

4.CreateDevice

建立设备对象,初始化DEVICE_EXTENSION结构,建立符号链接,将过滤驱动设备挂接到物理键盘设备之上。

5.DispatchRead

在收到IRP_MJ_READ的IRP后,为其设置指定的完成例程ReadComplete,然后再将IRP 发送给物理键盘设备。

6.ReadComplete

在IRP完成时会调用ReadComplete例程,此时用KEYBOARD_INPUT_DATA结构读取IRP中的返回值,得到按键事件的扫描码并保存。同时若符合按键映射规则,则改写IRP中的返回值,实现按键的替换。

7.DeviceIOControl

实现与应用程序之间的通信。当应用程序通过DeviceIoControl读扫描码时,利用IRP 中的https://www.360docs.net/doc/3614590964.html,rmation字段返回一个ULONG类型的扫描码。当应用程序设定按键映射规则时,同样使用DeviceIoControl通过系统内存缓冲区传递两个ULONG型的扫描码到pDevExt->SetCode数组中。

(二)应用程序部分

使用MFC实现应用界面,在程序启动时打开过滤驱动设备。

开辟新的工作线程,实现定时(100ms)读取捕获到的键盘扫描码,将扫描码翻译成按键名称,并按时间顺序将按键动作显示在ListBox中。

设定按键映射规则时,通过DeviceIoControl将两个DWORD类型的扫描码通过系统缓冲IO的方式传递给驱动程序。

三、遇到的问题及解决方法

键盘过滤驱动的卸载问题。

在使用常规的驱动卸载步骤时,会发生系统蓝屏重启的故障。通过分析和查阅相关资料,终于得出了解决的办法。

由于IRM_MJ_READ是异步的,在给IRP_MJ_READ设置了完成例程的情况下,该IRP完成后会调用过滤驱动所指定的完成例程,使得有了处理返回数据的机会。但也正是因为这样,当动态御载了键盘过滤驱动,也就卸载掉了完成例程,而之后的再次按键动作在完成了这个IRP后还是会调用那个已经不存在了的完成例程,因而引发错误。

同理可知,在安装过滤驱动时,就已经有一个IRP在键盘设备驱动中等待按键了,而该IRP并没有被设置完成例程。因此可知,在驱动运行之后的第一个按键动作是不会被截获的。在实验中的确证实了这个推想。

动态卸载的实现,是在设备扩展对象中加入一个IrpPendingCount计数器,用来记录正在运行中的(pending状态)IRP数量。当收到一个IRM_MJ_READ时计数器加1,在完成一个IRP之后计数器减1。

在驱动卸载例程中,先用IoDetachDevice解除过滤驱动的绑定,使得之后的IRP不会再被设置完成例程;然后要等待到计数器为0,即已被设置了完成例程的IRP都已完成之后才卸载设备和驱动对象。因此,在进入驱动卸载例程之后,还需要等待一次额外的按键操作才能正常的完成驱动程序的卸载。

四、程序运行结果及使用说明

图.1:使用DriverMonitor打开和加载驱动程序

图.2:设备对象KeyFilterDriver已被正确创建,并挂接到了键盘设备上

图.3:显示经过翻译的按键动作

输入按键映射规则,如要将按键A替换成B,则在映射码中输入A的扫描码:0x1E,在目标码中输入B的扫描码:0x30,点击设置,之后的按键A就会被替换成按键B。

关闭应用程序后,在DriverMonitor中卸载驱动,驱动卸载正常(需要一次额外的按键操作)。

图.4:在DriverMonitor中卸载驱动,驱动卸载正常

五、总结

对于设备驱动这门课程我感觉自己学的不太好,对于一些知识点比较模糊,估计是自己花在这门课程的时间相对较少,这次的大作业对我来说难度不小,但是通过同学和老师的帮助以及在网上的反复查找使我对Windows驱动程序的基本结构有了大致的了解,对IRP的传递和操作方式有了一定的认识和理解,对内核模式和应用模式之间的数据交换有了初步的认识。在以后的学习生活当中,我会改掉自己学习中的一些坏习惯,对于模糊的知识要尽快去弄清楚,不要一而再再而三的拖下去。

键盘键与虚拟键码对照表

键盘键与虚拟键码对照表 字母和数字键数字小键盘的键功能键其它键 键键码键键码键键码键键码 A 65 0 96 F1 112 Backspace 8 B 66 1 97 F2 113 Tab 9 C 67 2 98 F3 114 Clear 12 D 68 3 99 F4 115 Enter 13 E 69 4 100 F5 116 Shift 16 F 70 5 101 F6 117 Control 17 G 71 6 102 F7 118 Alt 18 H 72 7 103 F8 119 Caps Lock 20 I 73 8 104 F9 120 Esc 27 J 74 9 105 F10 121 Spacebar 32 K 75 * 106 F11 122 Page Up 33 L 76 + 107 F12 123 Page Down 34 M 77 Enter 108 -- -- End 35

N 78 - 109 -- -- Home 36 O 79 . 110 -- -- Left Arrow 37 P 80 / 111 -- -- Up Arrow 38 Q 81 -- -- -- -- Right Arrow 39 R 82 -- -- -- -- Down Arrow 40 S 83 -- -- -- -- Insert 45 T 84 -- -- -- -- Delete 46 U 85 -- -- -- -- Help 47 V 86 -- -- -- -- Num Lock 144 W 87 X 88 Y 89 Z 90 0 48 1 49 2 50

基于FPGA的键盘扫描电路 EDA课程设计

信息科学与技术学院 EDA 课程设计报告 题目名称:基于FPGA 的键盘扫描电路 学生姓名:王彪 学 号:2010508115 专业年级:电信10级(2)班 指导教师:钟福如老师 时 间: 2010.1.13

目录 1 课程设计综述—————————————————————— 2 1.1 课程设计的题目———————————————————— 2 1.2 题目要求——————————————————————— 2 2 方案选择———————————————————————— 2 3 整体电路的设计及分析——--——————————————— 3 3.1 顶层电路图—————————————————————— 3 3.2 各模块功能原理分析—————————————————— 4 4 心得体会——————————————————————— 12

1.课程设计综述 1.1 课程设计的题目 基于FPGA的键盘扫描电路。 1.3 题目要求 (1)、键盘按钮数为4,系统时钟10MHz。 (2)、能识别出所按按钮。 (3)、按钮被按下后,视为此按钮输入一次,若按钮长时间不松,(时限1S)后每隔0.5S 视为再次输入,直至按钮松开。 (4)、要求能对按钮按下时指令的抖动能正确处理。对持续时间小于50ms的输入不作响应。 (5)、各键设置不同优先级,多键同时按下时,视为优先级较高的按键被按下。2.方案选择 根据题目要求,需要4个按钮的键盘,通过查阅资料我选择通用的2*2行列式键盘,判断键盘中有无按键按下是通过行线送入扫描信号,然后从列线读取状态得到的。其方法是依次给行线送低电平,检查列线的输入。如果列线信号全为高电平,则代表低电平信号所在的行中无按键按下;如果列线有输入为低电平,则低电平信号所在的行和出现低电平的列的交点处有按键按下。原理框图如下所示:

USB键盘驱动程序

/* * $Id: usbkbd.c,v 1.27 2001/12/27 10:37:41 vojtech Exp $ * * Copyright (c) 1999-2001 Vojtech Pavlik * * USB HIDBP Keyboard support */ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Should you need to contact me, the author, you can do so either by * e-mail - mail your message to <>, or by paper mail: * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic */ #include #include #include #include #include #include #include /* * Version Information */ #define DRIVER_VERSION "" #define DRIVER_AUTHOR "Vojtech Pavlik <>" #define DRIVER_DESC "USB HID Boot Protocol keyboard driver" #define DRIVER_LICENSE "GPL"

显示和键盘流程图及程序

3.2 部分软件设计 3.2.3显示子程序 动态显示程序框图如图所示。显示程序的要点有两个:一是代码转换。因为直接驱动LED 显示器的是字形码,而人们习惯的是0、1、2、…、F 等字符,因此,必须将待显示的字符转换成字形码。转换用查表的方法进行。二是通过软件实现逐位轮流点亮每个LED 。 为了实现代码转换,首先开辟一个显示缓冲区,将待显示的字符预先存放在缓冲区中。由于有4位LED 显示器,故不妨假设显示缓冲区长度为4个字节。显示缓冲区地址为DIS 0~DIS 3 ,DIS 0单元与最左边一位LED 相对应,DIS 3单元与最右边一位LED 相对应。 程序清单如下: DIS : ORG 0500H MOV A ,#00000011B MOV DPTR ,#7F00H MOVX @DPTR ,A MOV R0,#78H MOV R3,#7FH MOV A ,R3 LD : MOV DPTR ,#7F01H 开 始 结 束 8051初始化 指向下个显示缓冲单元 显示下一位 延时1mS 段选码送入 查段选表 送位选字 动态显示初始化 3位显示完?

有键闭合吗? 确有键闭合吗 闭合键释放吗 返 回 MOVX @DPTR ,A INC DPTR MOV A ,@R0 ADD A ,#0DH MOVC A ,@ DPTR ACALL DLY MOV A ,R3 JNB A ,R0 RR A ,LD1 MOV R3,A INC R0 AJMP LD0 LD1: SJMP LD1 DSEG :DB 3FH ,06H ,5BH ,4FH ,66H ,6DH 7DH ,07H ,7FH ,6FH DLY : MOV R7,#02H DL : MOV R6,#0FFH DL1: DJNZ R6,DL1 DJNZ R7,DL RET 3.2.4键盘子程序 键盘扫描子程序框图如图 图3-4 键盘扫描子程序框图 开 始 两次调用 延时子程序 判断闭合键号 键号 → A 调用延时子程序

设备驱动程序

驱动程序 驱动程序一般指的是设备驱动程序(Device Driver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被比作“硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。 中文名 驱动程序 外文名 Device Driver 全称 设备驱动程序 性质 可使计算机和设备通信的特殊程序 目录 1定义 2作用 3界定 ?正式版 ?认证版 ?第三方 ?修改版 ?测试版 4驱动程序的开发 ?微软平台 ?Unix平台 5安装顺序 6inf文件 1定义 驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 惠普显卡驱动安装 正因为这个原因,驱动程序在系统中的所占的地位十分重要,一般当操作系统安装完毕后,首要的便是安装硬件设备的驱动程序。不过,大多数情况下,我们并不需要安装所有硬件设备的驱动程序,例如硬盘、显示器、光驱等就不需要安装驱动程序,而显卡、声卡、扫描仪、摄像头、Modem等就需要安装驱动程序。另外,不同版本的操作系统对硬件设

备的支持也是不同的,一般情况下版本越高所支持的硬件设备也越多,例如笔者使用了Windows XP,装好系统后一个驱动程序也不用安装。 设备驱动程序用来将硬件本身的功能告诉操作系统,完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。 所以简单的说,驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称为“硬件和系统之间的桥梁”。 戴尔电脑驱动盘 驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。 当你在安装新硬件时总会被要求放入“这种硬件的驱动程序”,很多人这时就开始头痛。不是找不到驱动程序的盘片,就是找不到文件的位置,或是根本不知道什么是驱动程序。比如安装打印机这类的硬件外设,并不是把连接线接上就算完成,如果你这时候开始使用,系统会告诉你,找不到驱动程序。怎么办呢参照说明书也未必就能顺利安装。其实在安装方面还是有一定的惯例与通则可寻的,这些都可以帮你做到无障碍安装。 在Windows系统中,需要安装主板、光驱、显卡、声卡等一套完整的驱动程序。如果你需要外接别的硬件设备,则还要安装相应的驱动程序,如:外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Modem甚至ISDN、ADSL的驱动程序。说了这么多的驱动程序,你是否有一点头痛了。下面就介绍Windows系统中各种的不同硬件设备的驱动程序,希望能让你拨云见日。 在Windows 9x下,驱动程序按照其提供的硬件支持可以分为:声卡驱动程序、显卡驱动程序、鼠标驱动程序、主板驱动程序、网络设备驱动程序、打印机驱动程序、扫描仪驱动程序等等。为什么没有CPU、内存驱动程序呢因为CPU和内存无需驱动程序便可使用,不仅如此,绝大多数键盘、鼠标、硬盘、软驱、显示器和主板上的标准设备都可以用Windows 自带的标准驱动程序来驱动,当然其它特定功能除外。如果你需要在Windows系统中的DOS 模式下使用光驱,那么还需要在DOS模式下安装光驱驱动程序。多数显卡、声卡、网卡等内置扩展卡和打印机、扫描仪、外置Modem等外设都需要安装与设备型号相符的驱动程序,否则无法发挥其部分或全部功能。驱动程序一般可通过三种途径得到,一是购买的硬件附

字符设备驱动程序

字符设备驱动程序 字符设备驱动程序与块设备不同。所涉及的键盘驱动、控制台显示驱动和串口驱动以及与这些驱动有关的接口、算法程序都紧密相关。他们共同协作实现控制台终端和串口终端功能。 下图反映了控制台键盘中断处理过程。 以上为总的处理流程,下面对每一个驱动分开分析。首先是键盘驱动。键盘驱动用汇编写的,比较难理解,牵涉内容较多,有键盘控制器804X的编程,还有扫描码(共3套,这里用第二套)和控制命令及控制序列(p209~210有讲解)。由于键盘从XT发展到AT到现在PS/2,USB,无线键盘,发展较快,驱动各有不同,此版本驱动为兼容XT,将扫描码映射为XT再处理,因此仅供参考。CNIX操作系统的键盘驱动实现为C语言,可读性更好。 键盘驱动 键盘驱动就是上图键盘硬件中断的过程。keyboard.S中的_keyboard_interrupt 函数为中断主流程,文件中其他函数均被其调用。

以上打星处为键盘驱动的核心,即主要处理过程,针对不同扫描码分别处理,并最终将转换后所得ASCII 码或控制序列放入控制台tty 结构的读缓冲队列read_q 中。 键处理程序跳转表为key_table ,根据扫描码调用不同处理程序,对于“普通键”,即只有一个字符返回且没有含义变化的键,调用do_self 函数。其他均为“特殊键”:1. crtrl 键的按下和释放 2. alt 键的按下和释放 3. shift 键的按下和释放 4. caps lock 键的按下和释放(释放直接返回,不作任何处理) 5. scroll lock 键的按下 6. num lock 的按下 7. 数字键盘的处理(包括alt-ctrl+delete 的处理,因为老式键盘delete 键在数字小键盘上。还包括对光标移动键的分别处理) 8. 功能键 (F1~F12)的处理 9. 减号的处理(老键盘’/’与’-’以0xe0加以区分,可能其中一键要按shift ) do_self 是最常用的流程,即跳转表中使用频率最高的流程:

手机虚拟键盘和手机虚拟qwerty键盘到底有什么区

手机虚拟键盘和手机虚拟qwerty键盘到底有什么区 手机虚拟键盘是指用于全触摸手机的虚拟于屏幕的按键虚拟键盘。可直接把触摸屏上的虚拟键盘当实质键盘使用。 手机虚拟键盘为一种以CCITT的标准键,结合多个功能键组成实际键盘及键值表,产生虚拟键盘,以改善数据键入的方法,至少包含以下步骤:依据预设的键盘状态值显示对应的虚拟键;判断是否有实际键被按下,若被按下键为CCITT标准键其中之一时,查询键值表以得到键值;然后以预设的键盘状态值及键值,查询键值表以得到虚拟键值;若虚拟键值为虚拟键盘切换键则依据虚拟键盘切换键的键值改变键盘状态值并呼叫键盘显示模组以显示对应的虚拟键盘,并且去除键值;否则,呼叫键盘显示模组以显示该虚拟键值。 QWERTY键盘,也称全键盘,即第一行开头6个字母是Q、W、E、R、T、Y的键盘布局,也就是现在普遍使用的电脑键盘布局。 “QWERTY”是主键盘字母区左上角6个字母的连写我们现在使用的键盘都称为QWERTY 柯蒂键盘。最初,打字机的键盘是按照字母顺序排列的,但如果打字速度过快,某些键的组合很容易出现卡键问题,于是克里斯托夫.拉森.授斯(Christopher Latham Sholes)发明了QWERTY键盘布局,他将最常用的几个字母安置在相反方向,“在不至卡住的前提下尽量提高打字速度”。授斯在1868年申请专利,1873年使用此布局的第一台商用打字机成功投放市场。这就是为什么有今天键盘的排列方式。键盘的键位设计一款键盘的键位设计包含了两个概念,一是主体的英文和数字键位设计,二是各种附属键位设计。最通常的英文与数字键位设计方案就是俗称的“QWERTY”柯蒂键盘。这是Christopher Latham Sholes于1868年发明的键位方案。众所周知,柯蒂键盘主要的设计目的就是使击键的速度不至太快。不过在很多文章中的说法有一个小小的错误,这就是——柯蒂键盘的键位设计并不是要“使击键的速度不至太快导致卡住”,而是“在不至卡住的前提下尽量提高打字速度”。这两种说法中有一个微妙的差异,这就是说,减慢打字速度不是最终目的,QWERTY键盘并不是在一味的减低速度,它固然有把ED这样的常见组合放在一个手指上的减低速度设计,但也有很多诸如ER这样的加速组合键位。实际上这样设计的根本原因在于机械式打字机的结构,其铅字杠杆的结构决定了当两个位置接近的铅字同时按下的时候就会卡死,但相对的两个相距较远的铅字就不会发生同样的问题,相信有过英文打字机使用经验的人应该都会有所体会。在柯蒂键盘上,一些常用的字母被放在无名指、小拇指等位置上,这一向被认为是用小拇指等的不灵活性来减低速度,但这种说法没有考虑到机械式打字机的实际情况,食指固然是最灵活的,但食指键位上的按键也是最容易卡死的,所以将常用字母放在边缘以保证在高速打字时不会卡死也就是理所当然的。所以说,设计柯蒂键盘的最终目的并不是为了单纯的减低打字速度,事实上,柯蒂键盘的设计方案恰恰是为了提高打字速度,只不过是“在不会卡死的情况下尽力提高打字速度”。 QWERTY键盘,也称全键盘。即第一行开头6个字母是Q、W、E、R、T、Y的键盘布局,也就是现在普遍使用的电脑键盘布局。QWERTY键盘是为了降低打字速度最初,打字机的键盘是按照字母顺序排列的,但如果打字速度过快,某些键的组合很容易出现卡键问题,于是克里斯托夫·拉森·授斯(Christopher Latham Sholes)发明了QWERTY键盘布局,他将最常

VB键盘常量大全 256个虚拟键码

Public Const VK_LBUTTON = &H1 Public Const VK_RBUTTON = &H2 Public Const VK_CANCEL = &H3 Public Const VK_MBUTTON = &H4 Public Const VK_BACK = &H8 Public Const VK_TAB = &H9 Public Const VK_CLEAR = &HC Public Const VK_RETURN = &HD Public Const VK_SHIFT = &H10 Public Const VK_CONTROL = &H11 Public Const VK_MENU = &H12 Public Const VK_PAUSE = &H13 Public Const VK_CAPITAL = &H14 Public Const VK_ESCAPE = &H1B Public Const VK_SPACE = &H20 Public Const VK_PRIOR = &H21 Public Const VK_NEXT = &H22 Public Const VK_END = &H23 Public Const VK_HOME = &H24 Public Const VK_LEFT = &H25 Public Const VK_UP = &H26 Public Const VK_RIGHT = &H27 Public Const VK_DOWN = &H28 Public Const VK_Select = &H29 Public Const VK_PRINT = &H2A Public Const VK_EXECUTE = &H2B Public Const VK_SNAPSHOT = &H2C Public Const VK_Insert = &H2D Public Const VK_Delete = &H2E Public Const VK_HELP = &H2F Public Const VK_0 = &H30 Public Const VK_1 = &H31 Public Const VK_2 = &H32 Public Const VK_3 = &H33 Public Const VK_4 = &H34 Public Const VK_5 = &H35 Public Const VK_6 = &H36 Public Const VK_7 = &H37 Public Const VK_8 = &H38 Public Const VK_9 = &H39 Public Const VK_A = &H41 Public Const VK_B = &H42 Public Const VK_C = &H43 Public Const VK_D = &H44

矩阵键盘设计实验报告

南京林业大学 实验报告 基于AT89C51 单片机4x4矩阵键盘接口电路设计 课程机电一体化设计基础 院系机械电子工程学院 班级 学号 姓名

指导老师杨雨图 2013年9月26日

一、实验目的 1、掌握键盘接口的基本特点,了解独立键盘和矩 阵键盘的应用方法。 2、掌握键盘接口的硬件设计方法,软件程序设计 和贴士排错能力。 3、掌握利用Keil51软件对程序进行编译。 4、用Proteus软件绘制“矩阵键盘扫描”电路,并用测试程序进行仿真。 5、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果 能做出分析和解释,能写出符合规格的实验报告。 二、实验要求 通过实训,学生应达到以下几方面的要求: 素质要求 1.以积极认真的态度对待本次实训,遵章守纪、团结协作。 2.善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立 工作能力。 能力要求 1.模拟电路的理论知识 2.脉冲与数字电路的理念知识 3.通过模拟、数字电路实验有一定的动手能力 4.能熟练的编写8951单片机汇编程序 5.能够熟练的运用仿真软件进行仿真 三、实验工具 1、软件:Proteus软件、keil51。 2、硬件:PC机,串口线,并口线,单片机开发板 四、实验内容

1、掌握并理解“矩阵键盘扫描”的原理及制作,了解各元器件的参数及格 元器件的作用。 2、用keil51测试软件编写AT89C51单片机汇编程序 3、用Proteus软件绘制“矩阵键盘扫描”电路原理图。 4、运用仿真软件对电路进行仿真。 五.实验基本步骤 1、用Proteus绘制“矩阵键盘扫描”电路原理图。 2、编写程序使数码管显示当前闭合按键的键值。 3、利用Proteus软件的仿真功能对其进行仿真测试,观察数码管的显示状 态和按键开关的对应关系。 4、用keil51软件编写程序,并生成HEX文件。 5、根据绘制“矩阵键盘扫描”电路原理图,搭建相关硬件电路。 6、用通用编程器或ISP下载HEX程序到MCU。 7、检查验证结果。 六、实验具体内容 使用单片机的P1口与矩阵式键盘连接时,可以将P1口低4位的4条端口线定义为行线,P1口高4位的4条端口线定义为列线,形成4*4键盘,可以配置16个按键,将单片机P2口与七段数码管连接,当按下矩阵键盘任意键时,数码管显示该键所在的键号。 1、电路图

基于51单片机的PS2键盘的单片机编程

PS2键盘的单片机编程 在单片机系统中,经常使用的键盘都是专用键盘.此类键盘为单独设计制作的,成本高、使用硬件连接线多,且可靠性不高,这一状况在那些要求键盘按键较多的应用系统中更为突出.与此相比,在PC系统中广泛使用PS/2键盘具有价格低、通用可靠,且使用连接线少(仅使用2根信号线)的特点,并可满足多种系统的要求.因此在单片机系统中应用PS/2键盘是一种很好的选择. 文中在介绍PS/2协议和PS/2键盘工作原理与特点的基础上,给出了一个在单片机上实现对PS/2键盘支持的硬件连接与驱动程序设计实现.该设计实现了在单 片机系统中对PS/2标准104键盘按键输入的支持.使用Keil C51开发的驱动程序接口和库函数可以方便地移植到其他单片机或嵌入式系统中.所有程序在 Keil uVision2上编译通过,在单片机AT89C51上测试通过. 1 PS/2协议 目前,PC机广泛采用的PS/2接口为mini-DIN 6pin的连接器,如图1所示. PS/2设备有主从之分,主设备采用Female插座,从设备采用Male插头.现在广泛使用的PS/2键盘鼠标均在从设备方式下工作.PS/2接口的时钟 与数据线都是集电极开路结构,必须外接上拉电阻(一般上拉电阻设置在主设备中).主从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生. 1.1 从设备到主设备的通信 当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平.如果是高电平,从设备就可以开始传输数据;反之,从设备要等待获得总线的控制权,才能开始传输数据.传输的每一帧由11位组成,发送时序及每一位的含义如图2 所示. 每一帧数据中开始位总是为0,数据校验采用奇校验方式,停止位始终为1.从设 备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在时钟 下降沿读人数据线状态.

基于图像处理技术的虚拟键盘设计与实现

开发研究 基于图像处理技术的虚拟键盘设计与实现 李中宇钟如意彭煜陈敏” (江西理工大学,江西赣州330013) 摘要:基于图像处理技术的虚拟键盘设计由激光 投影、图像采集器单元组成。采集器对用户在虚拟键 盘上的按键过程进行图像采集,先通过过滤隔离排除 外部环境的影响,再通过角点识别和图像分割对用户 点击的目标按键进行精确定位。做到识别设备与键盘 一体,解决传统键盘设备移动不便、体验性差、携带 不方便等问题,实现人机更加灵活交互。 关键词:角点识别;图像分割;图像定位 0引言 输入设备分为2种:一种是实体输入设备;另一种是虚拟输入设备。本项目研究的输入方式以图像识别技术 为核心,用其实现指尖定位来完成虚拟式输入,此过程中, 仅仅需要一个键盘的投影图像作为参考输入。 1技术路线与原理 虚拟键盘对传感器位置有一定的要求,所以在结构 上会进行简单的设计。在供电、通信接口上需进行整合, 对硬件进行设计,在虚拟键盘的硬件系统设计完进行测 距算法的代码实现,则需要使用到图像识别技术,图像的 获取来自摄像头。 在激光测距领域,常用的测距有脉冲法、相位法和三 角法。脉冲法、相位法测距的成本相对来说都较高,且在测距精度有溢出,不利于研究,而在第3种测距中,测距 虽然精度相比之上2种相差甚远,但该方法成本低廉,且在实际使用在虚拟键盘中,精度合适,不会造成溢出,所 以三角测距法最适合使用在该研究中。 三角测距的方法硬件准备相对简单,仅仅需要激光 发射器、摄像头。 2按键识别算法实现 因为使用的摄像头为广角摄像头,拍摄出的图像是 扭曲的,造成图像有一定的失真,变形的图像在实际计算 结果时会使得指尖定位越偏离中心,误差越大。在这里使用视变换来将原始图像进行矫正,使用perspecti-基金项目:江西省及江西理工大学大学生创新创业项目T■于图像处理技术的虚拟键盘的设计与实现(XZG-16-08-39)。 作者简介:李中宇(1999-),女,本科在读,研究方向:软件工程专业机械电子。钟如意(1997-),女,本科在读,研究方向:软件工程专业机械设计制造及自动化。 通讯作者:陈敏(1972-),男,硕士,江西理工大学,副教授,主要研究方向:移动机器人及机电一体化系统。veTransform()函数来实现变换。 在图像被采集过来时,图像数据一般是无法直接使用的,在实际环境中有许多外界因素影响,采集时并不能保证采集到的数据适合直接计算,在此之前需要进行中 值滤波、RGB灰度图转化、二值化、腐蚀操作、图像轮廓分割等一系列的预处理,使得数据适合于按键识别的基本要求。 为了表示指尖的位置,本项目中选择了中心矩作为其位置表示。它是一个计算重心坐标的算法,中心矩是根据x、y与重心的相对位置求去取得矩。公式如下: %=乞&(1)x y 在获取了位置P(X,y)之后,就需要将指尖的实际位置与键盘按键位置进行匹配,在匹配之前,需要进行映射。这样键盘在实际空间位置就确定了,当手指触摸时,摄像头将信息采集到,把图像信息传入,进行矫正、预处理、边缘检测、定位等操作,最后将获取到的键盘位置信息与上面的键盘映射表进行匹配,匹配完后便产生一个键盘敲击事件。 3结束语 整个系统的识别率相对较高,在便携性上比起传统键盘来说具有很大的优势,在使用上没有反馈而使得按键时没有触感。对以上的不足需投入更多的精力去解决,以求完善虚拟键盘设备。 参考文献: [1]柳涛.PC输入设备易用性研究[D].天津:河北工业大学, 2006. [2]孙乐晨.基于Android和OpenCV的嵌入式物件检测系统 的研究与设计[D].上海:华东师范大学,2017. [3]李鹏翔.基于机器视觉的嵌入式虚拟键盘研究[D].广州: 华南理工大学,2016. 4]钱春妍.基于OpenCV的实时手势识别与应用研究[D].重庆:重庆大学,2015. [5]孟国庆.基于OpenCV的手势识别技术研究【D].西安:西安 科技大学,2014. ⑹吴少龙.基于OpenCV的运动目标检测和跟踪技术的研究 [D1.青岛:青岛大学,2015. (收稿日期=2019-05-20) 《湖北农机化》2019年第14期

矩阵键盘电路设计

课程设计 题目矩阵键盘电路设计教学院计算机学院 专业计算机应用技术班级 姓名 指导教师 2010 年01 月12 日

前言.................................................................... 第一章需求分析......................................................... 功能描述......................................................... 功能分析......................................................... 第二章系统的原理及分析................................................. 用到的知识点的介绍,知识点使用的总体思路 第三章详细设计......................................................... 硬件设计 系统结构图,元器件的选择等 软件设计 所设计的软件关键模块的程序流程 第四章测试............................................................ 运行结果分析等 第五章总结............................................................. 参考文献................................................................ 附录 关键程序代码........................................................

检测到不兼容的键盘驱动程序。该对话框已被停用的解决方法

检测到不兼容的键盘驱动程序。该对话框已被停用的解决方法在 Windows XP 系统中单击语言栏的设置弹出“检测到不兼容的键盘驱动程序”的错误提示对话框,如遇到此问题的朋友可通过下面的方法来解决。 到一台正常 WindowsXP系统的机器,单击"开始”菜单中的“运行”命令 在“打开”框中键入“ regedit ”命令,单击“确定”按钮 打开“注册表编辑器”窗口,在左侧窗口(注册表树)定位到以下分支 Control\Keyboard Layouts 右击“ Keyboard Layouts ”主键,打开的快捷 菜单单击“导出”命令 选择要导出注册表文件的位置,并在文件名框 中输入任意名称,单击“保存”按钮 将生成的reg 文件拷贝到存储设备里,在出问 题的机器上双击该注册表文件,导入注册表信息

在 Windows XP 系统中单击语言栏的设置弹出“检测到不兼容的键盘驱动程序”的错误提示对话框,如遇到此问题的朋友可通过下面的方法来解决。 到一台正常 WindowsXP系统的机器,单击"开始”菜单中的“运行”命令 在“打开”框中键入“ regedit ”命令,单击“确定”按钮 打开“注册表编辑器”窗口,在左侧窗口(注册表树)定位到以下分支 Control\Keyboard Layouts 右击“ Keyboard Layouts ”主键,打开的快捷 菜单单击“导出”命令 选择要导出注册表文件的位置,并在文件名框 中输入任意名称,单击“保存”按钮 将生成的reg 文件拷贝到存储设备里,在出问 题的机器上双击该注册表文件,导入注册表信息

在 Windows XP 系统中单击语言栏的设置弹出“检测到不兼容的键盘驱动程序”的错误提示对话框,如遇到此问题的朋友可通过下面的方法来解决。 到一台正常 WindowsXP系统的机器,单击"开始”菜单中的“运行”命令 在“打开”框中键入“ regedit ”命令,单击“确定”按钮 打开“注册表编辑器”窗口,在左侧窗口(注册表树)定位到以下分支 Control\Keyboard Layouts 右击“ Keyboard Layouts ”主键,打开的快捷 菜单单击“导出”命令 选择要导出注册表文件的位置,并在文件名框 中输入任意名称,单击“保存”按钮 将生成的reg 文件拷贝到存储设备里,在出问 题的机器上双击该注册表文件,导入注册表信息

Windows驱动开发入门

接触windows驱动开发有一个月了,感觉Windows驱动编程并不像传说中的那么神秘。为了更好地为以后的学习打下基础,记录下来这些学习心得,也为像跟我一样致力于驱动开发却苦于没有门路的菜鸟朋友们抛个砖,引个玉。 我的开发环境:Windows xp 主机+ VMW ARE虚拟机(windows 2003 server系统)。编译环境:WinDDK6001.18002。代码编辑工具:SourceInsight。IDE:VS2005/VC6.0。调试工具:WinDBG,DbgView.exe, SRVINSTW.EXE 上面所有工具均来自互联网。 对于初学者,DbgView.exe和SRVINSTW.EXE是非常简单有用的两个工具,一定要装上。前者用于查看日志信息,后者用于加载驱动。 下面从最简单的helloworld说起吧。Follow me。 驱动程序的入口函数叫做DriverEntry(PDRIVER_OBJECT pDriverObj,PUNICODE_STRING pRegisgryString)。两个参数,一个是驱动对象,代表该驱动程序;另一个跟注册表相关,是驱动程序在注册表中的服务名,暂时不用管它。DriverEntry 类似于C语言中的main函数。它跟main的差别就是,main完全按照顺序调用的方法执行,所有东西都按照程序员预先设定的顺序依次发生;而DriverEntry则有它自己的规则,程序员只需要填写各个子例程,至于何时调用,谁先调,由操作系统决定。我想这主要是因为驱动偏底层,而底层与硬件打交道,硬件很多都是通过中断来与操作系统通信,中断的话就比较随机了。但到了上层应用程序,我们是看不到中断的影子的。说到中断,驱动程序中可以人为添加软中断,__asm int 3或者Int_3();前者是32位操作系统用的,后者是64位用的。64位驱动不允许内嵌汇编。下面是我的一个helloworld的源码:

键盘虚拟键值编码表 使用keybd

键盘虚拟键值编码表使用keybd_Event 也是在cnblogs上找的,怕到时忘了,先记下来 原文章:https://www.360docs.net/doc/3614590964.html,/nemolog/archive/2005/10/30/265035.ht ml 模拟键盘输入首先要用到一个API函数:keybd_event。 我们是菜鸟,所以不必具体去理解它的详细用法,只要按以下方法使用即可了!呵呵! 模拟按键有两个基本动作,即按下键和放开按键,所以我们每模拟一次按键就要调用两次该API函数,其方法是: 例子1:模拟按下'A'键 keybd_event(65,0,0,0); keybd_event(65,0,KEYEVENTF_KEYUP,0); 例子2:模拟按下'ALT+F4'键 keybd_event(18,0,0,0); keybd_event(115,0,0,0); keybd_event(115,0,KEYEVENTF_KEYUP,0); keybd_event(18,0,KEYEVENTF_KEYUP,0); 例子3:在启动一个程序之前清空屏幕(按Win +D) [DllImport("User32.dll")] public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwEx traInfo); keybd_event(0x5b, 0, 0, 0); keybd_event(68, 0, 0, 0); keybd_event(0x5b, 0, 0x2, 0); keybd_event(68, 0, 0x2, 0); 附:常用模拟键的键值对照表。 键盘键与虚拟键码对照表

基于FPGA的键盘扫描程序的设计

摘要 在现代电子工业的控制电路中,键盘扫描和显示电路对系统的调试和设置有着重要的作用。随着EDA技术的发展,基于FPGA的扫描键盘因其结构简单,能有效防止机械键盘按键抖动带来的数据错误等优点在许多电子设备中都得到了广泛的应用。 本文主要是设计一个基于FPGA的键盘扫描程序,该设计在EDA工具Quarutus II9.0上开发完成,以Creat-SOPC2000实验箱上的4*4矩阵键盘为硬件实体,设计键盘扫描程序,将程序划分为时序产生模块、键盘扫描模块、弹跳消除模块、键值译码模块四个模块,时序产生模块为键盘扫描和弹跳消除模块产生时钟信号,键盘扫描模块采用行扫描法对4*4矩阵键盘进行扫描,键值译码模块将所按键值译码为共阳极8位7段数码管的显示码,几个模块组合起来实现键盘扫描的设计要求。最后对程序进行仿真分析和硬件验证。仿真结果表明,该系统具有集成度高、稳定性好、设计灵活和设计效率高等优点。 关键词: FPGA,Quartus II,VHDL,键盘扫描

ABSTRACT In the modern electronics industry controlling-circuit, the keyboard scanning and display circuit plays an important role in debugging and setting the system. With the development of EDA technology, FPGA-based scanning keyboard have been widely used in many electronic devices because of its simple structure, and it also can effectively prevent mechanical keyboard jitter caused by data errors. This article primarily designed an FPGA-based keyboard scan procedures, this design is developed on the EDA tools—— Quarutus II9.0 and designed the keyboard scan program, using the Creat-SOPC2000 experimental box 4 * 4 matrix keyboard as the hardware entity .the program is divided into four modules as the timing generation module, a keyboard scanning module, bounce cancellation module and the decoding module. The timing generation module generates the clock signal for the keyboard scanning and bounce elimination module, the keyboard scanning module using the line scanning method to sweep the 4* 4 matrix keyboard, key decoder module decodes the key value for the common anode eight 7-segment display code. Several modules assembles together to meet the keyboard scanning design requirements. Finally, conducting simulation analysis by the program and verifying the hardware.Simulation results show that the system has many advantages such as high integration, good stability, high efficiency, flexible design and high design efficiency. Keywords: FPGA,Quartus II,VHDL,keyboard scanning

相关文档
最新文档