鼠标的原理,控制以及编程

合集下载

鼠标 原理

鼠标 原理

鼠标原理
鼠标是一种用于在计算机上控制光标位置和操作的输入设备。

它的工作原理是基于鼠标底部的球体或光学传感器捕捉表面上的运动,然后将这些运动转化为计算机可以理解的信号。

在鼠标底部,通常有两个旋转的滚轮和一个轨迹球或光电传感器。

轨迹球通过感知手指的移动来检测鼠标的运动。

当手指在轨迹球上滚动时,它会带动内部的滚轮旋转,通过编码器将这种旋转转化为数字信号。

这个数字信号将发送给计算机,然后计算机会根据信号的变化来移动光标的位置。

光电传感器是使用类似摄像机的技术来检测鼠标的运动。

它通常由一个红色LED和一个相机组成。

当鼠标在表面上移动时,红色LED发出光线,然后相机记录下光线的反射。

通过比较
连续的图像帧,计算机可以计算出光标的移动方向和速度。

除了检测运动外,鼠标上的按钮也是非常重要的。

鼠标通常有左键、右键和滚轮按钮。

这些按钮的原理是基于按下和松开的电子控制。

当我们按下鼠标按钮时,按钮触点会触发电流流动,然后鼠标的电路板会将这个触发事件转化为计算机可以理解的指令。

总的来说,鼠标的原理是通过检测和转化手指或表面上的运动以及按钮的状态来实现对计算机的控制。

无线鼠标 工作原理

无线鼠标 工作原理

无线鼠标工作原理
无线鼠标的工作原理是通过无线信号传输数据来实现鼠标的移动和点击操作。

以下是一个简要的工作流程:
1. 鼠标通过内置的传感器(例如光学或激光传感器)检测用户在平面上的移动。

这些传感器利用光影、光纹或红外线等技术来感知鼠标在表面上的移动。

2. 传感器将鼠标移动转换为数字信号,并通过鼠标的处理器进行处理。

处理器是鼠标的中央控制单元,负责接收和处理传感器产生的数据。

3. 处理器将处理后的数据通过无线通信模块(通常是一个无线电发射器)转换为无线信号。

无线通信模块通常采用蓝牙、无线USB或红外线等技术来与计算机或其他设备进行无线通信。

4. 无线信号传输到计算机或其他设备的接收器。

接收器可以是一个USB插头、蓝牙接收器或红外线接收头等设备。

5. 接收器将接收到的无线信号转换为数字数据,并通过设备的驱动程序传输到操作系统。

操作系统将这些数据解释为鼠标的移动和点击操作。

6. 根据接收到的数据,计算机或其他设备将相应的操作反馈到屏幕上,实现鼠标的响应和控制。

需要注意的是,无线鼠标通常需要电池供电,因此鼠标内部还
包含有关电池功耗和电量管理的电路。

同时,鼠标和接收器之间需要建立一种加密通信以确保数据的安全性,并通过协议来实现正确的数据传输。

鼠标的工作原理及高DPI使用体验

鼠标的工作原理及高DPI使用体验

鼠标的工作原理及高DPI使用体验鼠标是一种广泛应用于计算机的输入设备,用于控制光标在屏幕上移动,并与计算机进行交互。

它通过精确的光学或者机械传感器来捕捉用户的手势,将其转换为计算机理解的指令,从而实现对计算机操作的控制。

一、鼠标的工作原理鼠标的工作原理可以分为两种类型:机械式鼠标和光学鼠标。

1. 机械式鼠标机械式鼠标是最早出现的一种鼠标,它采用的是基于机械接触的传感器。

当用户移动鼠标时,鼠标底部的球形结构会滚动,而球的运动又通过轴和编码器将运动转化为数字信号。

这些数字信号被传送至计算机,然后计算机根据信号的变化来判断光标的移动方向和速度。

2. 光学鼠标光学鼠标是一种使用红光或激光的光学传感器来跟踪表面细微移动的鼠标。

它基于LED(或激光器)和相对应的光学传感器。

当用户移动鼠标时,LED照射在表面上,光学传感器通过捕捉表面反射回的光信号来确定光标的移动变化。

相比机械式鼠标,光学鼠标的工作原理更为精确和灵敏。

二、高DPI使用体验DPI是“每英寸点数”(Dots Per Inch)的缩写,它用来衡量鼠标的灵敏度,即每英寸内鼠标移动的像素数。

高DPI意味着鼠标可以捕捉更多的细微手势,使光标更加精确地跟踪移动。

高DPI鼠标在游戏和图像编辑等需要精准操作的场景中具有很大的优势。

在游戏中,高DPI鼠标可以实现准确的瞄准和迅速的反应,提升游戏的操作体验。

而在图像编辑软件中,高DPI鼠标可以更精细地控制光标位置,使得编辑和绘画等工作更加精准。

然而,高DPI并不一定适用于所有用户和所有场景。

对于一般用户来说,鼠标的常规DPI已经足够满足日常使用需求。

高DPI鼠标在常规使用时可能会过于灵敏,导致光标的位置不稳定,使用者可能会失去对鼠标的控制。

因此,高DPI鼠标更适合那些需要高精度控制的专业用户或对精确度有较高要求的场景。

此外,高DPI鼠标的使用需要配合合适的鼠标垫。

鼠标垫的材质和质量会影响光学鼠标的跟踪效果,因此在使用高DPI鼠标时,选择一个适合的鼠标垫也是很重要的。

鼠标的组成及工作原理

鼠标的组成及工作原理

鼠标的组成及工作原理鼠标,作为一种常见的计算机外部设备,广泛应用于个人电脑、笔记本电脑及其他智能设备中,为用户提供了方便快捷的操控方式。

鼠标不仅具有小巧精致的外观设计,而且背后隐藏着复杂的内部构造和工作原理。

本文将详细介绍鼠标的组成和工作原理,帮助读者深入了解这个常见而重要的外设。

一、组成部分1.外壳:鼠标的外壳通常由塑料或金属材料制成,具有光滑的表面和人体工学的设计,以提供舒适的手感和操控。

2.按键:鼠标有多个按键,常见的有左键、右键和滚轮。

左右按键用于基础的点击操作,而滚轮则用于上下滚动页面或调整音量等功能。

3.感应器:鼠标的感应器通常位于底部,用于感知鼠标在平面上的移动。

常见的感应器有光学感应器和激光感应器,可以根据不同的表面材质提供精确的跟踪。

4.连接线:鼠标通过连接线与计算机或其他设备连接,传输信号和电力。

连接线通常由塑料或铜制成,具有一定的柔韧性和抗拉性。

5.电路板:鼠标的电路板包含了多个电子元件,如芯片、电容、电阻等,用于控制鼠标的操作和发送信号。

二、工作原理鼠标的工作原理可以分为两种常见的类型:机械式和光电式。

1.机械式鼠标:机械式鼠标通常使用滚球和滚轮来感知鼠标的移动和操作。

滚球位于鼠标底部,当用户移动鼠标时,滚球会滚动并转动两个与滚球相连的轴,通过这种转动将鼠标的移动转化为电信号传输给计算机。

同时,滚轮上下滚动的动作也会发送相应的信号给计算机,实现页面的滚动和音量的调整。

2.光电式鼠标:光电式鼠标利用光学感应技术实现鼠标的移动和操作。

底部感应器通过射出红外线或激光并感应反射光线的变化,来判断鼠标在平面上的移动方向和速度。

感应器会将光线信号转化为数字信号后发送给控制芯片,芯片会处理这些信号并将其转化为计算机可以识别的代码和指令。

光电式鼠标的优势在于精确度高,适用于多种平面表面。

无论是机械式鼠标还是光电式鼠标,鼠标的工作都离不开计算机的支持。

计算机通过鼠标驱动程序来解读接收到的信号,并根据用户的操作来实现相应的功能。

鼠标的工作原理

鼠标的工作原理

鼠标的工作原理
首先,我们需要了解鼠标的结构。

鼠标通常由外壳、滚轮、左键、右键和光电传感器等组成。

其中,光电传感器是鼠标最核心的部件,它能够感知鼠标在桌面上的移动轨迹。

当我们移动鼠标时,鼠标底部的光电传感器会感知桌面上的纹理和颜色变化,然后将这些信息转化为电信号传送给计算机。

计算机通过解析这些信号,就能够准确地计算出鼠标在屏幕上的移动轨迹和速度。

除了移动轨迹,鼠标的点击操作也是非常重要的。

当我们按下鼠标的左键或右键时,鼠标内部的微动开关会被按下,从而产生电信号传送给计算机。

计算机通过解析这些信号,就能够识别出用户的点击操作,并执行相应的指令。

在鼠标的滚轮部分,它通常用来控制屏幕上的滚动条,通过滚动鼠标滚轮,可以实现屏幕上内容的上下滚动。

滚轮也是通过内部的传感器将滚动的信息转化为电信号传送给计算机,从而实现屏幕上内容的滚动操作。

总的来说,鼠标的工作原理就是通过内部的光电传感器和微动开关等部件,将鼠标在桌面上的移动和点击操作转化为电信号传送给计算机,从而实现对计算机屏幕上光标的控制和各种操作。

鼠标作为计算机的重要输入设备,其工作原理的了解可以帮助我们更好地使用和维护鼠标,同时也有助于我们对计算机硬件原理有更深入的了解。

希望本文对大家有所帮助,谢谢阅读!。

鼠标工作原理

鼠标工作原理

鼠标工作原理鼠标是我们日常生活和工作中经常使用的一种输入设备,它可以让我们在电脑上进行各种操作,如点击、拖动、选择等。

那么,鼠标是如何工作的呢?接下来,我们就来详细了解一下鼠标的工作原理。

鼠标的工作原理主要是通过光电传感器和滚轮来实现的。

当我们移动鼠标时,底部的光电传感器会感知到鼠标底面的运动轨迹,并将这些信息传输给电脑。

而滚轮则可以实现鼠标的上下滚动功能。

接下来,我们将分别介绍这两个部分的工作原理。

首先是光电传感器,它通常采用红外线或激光来感知鼠标底面的运动轨迹。

当我们移动鼠标时,底部的传感器会感知到鼠标底面的细微变化,并将这些变化转换成电信号,然后通过鼠标的连接线传输给电脑。

电脑会根据这些信号来计算鼠标的移动方向和速度,并将这些信息转换成屏幕上的光标移动。

其次是滚轮,它通常位于鼠标的中间部分。

滚轮的工作原理是通过内部的传感器来感知滚动的方向和速度,然后将这些信息传输给电脑。

在使用鼠标时,我们可以通过滚轮来实现页面的上下滚动,或者在一些软件中进行放大缩小等操作。

除了光电传感器和滚轮,鼠标的工作原理还涉及到一些其他的技术,如无线传输技术和多点触控技术。

无线鼠标通常采用蓝牙或者无线接收器来与电脑进行连接,而多点触控技术则可以实现在鼠标表面进行手势操作,如双指滑动、捏合等。

总的来说,鼠标的工作原理是通过光电传感器和滚轮来实现的,它能够感知鼠标底面的运动轨迹,并将这些信息传输给电脑,从而实现鼠标在屏幕上的光标移动和滚动功能。

同时,鼠标还可以通过无线传输技术和多点触控技术来实现更多的功能。

希望通过本文的介绍,可以让大家对鼠标的工作原理有一个更加深入的了解。

鼠标的构造和原理

鼠标的构造和原理

鼠标的构造和原理目录1.鼠标的概述2.鼠标的构造1.外部构造2.内部构造3.鼠标的工作原理1.机械式鼠标2.光电式鼠标4.总结1. 鼠标的概述鼠标是一种常见的输入设备,主要用于控制计算机屏幕上的光标移动和操作。

它是计算机的重要组成部分之一,广泛应用于各个领域。

2. 鼠标的构造2.1 外部构造鼠标通常由外壳、左右键、中键、滚轮和连接线等组成。

其中,外壳是鼠标的外部包装,用于保护内部零件。

左右键用于选择和操作,中键用于滚动和其他操作,滚轮则用于向上或向下滚动页面。

2.2 内部构造鼠标的内部由传感器、芯片、电路板和滚轮等组成。

传感器用于感应鼠标的移动和位置信息,芯片则用于处理鼠标传感器的信息,电路板则将信息传递给计算机,滚轮则用于控制鼠标的滚动操作。

3. 鼠标的工作原理3.1 机械式鼠标机械式鼠标是一种使用机械零件来感应鼠标移动的鼠标。

它通常由球体、滚轮、传感器和编码器等组成。

当用户移动鼠标时,球体会旋转,滚轮会感应球体旋转的方向和速度,传感器则将感应到的信息传递给编码器,编码器再将信息传递给计算机进行处理。

3.2 光电式鼠标光电式鼠标是一种使用光电传感器来感应鼠标移动的鼠标。

它通常由光学传感器、LED光源和编码器等组成。

当用户移动鼠标时,光学传感器会感应鼠标移动的方向和速度,LED光源则用于照明,编码器则将信息传递给计算机进行处理。

鼠标是计算机的重要输入设备之一,它的构造和工作原理不仅是了解计算机硬件的基础,也是进行计算机操作的重要知识。

通过本文的介绍,相信读者已经对鼠标的构造和工作原理有了更深入的了解。

鼠标工作原理

鼠标工作原理

鼠标工作原理鼠标是计算机外设的一种,用于控制光标在计算机屏幕上的移动。

它通常由一个可滚动的球体或光学传感器、按钮以及连接计算机的电缆组成。

在本文中,我们将深入探讨鼠标的工作原理,以及它如何实现与计算机的交互。

一、机械鼠标的工作原理机械鼠标是较早期的一种鼠标类型,它含有一个小球,这个小球可以在鼠标底部与桌面接触,随着鼠标在桌面上移动,小球也会随之滚动。

在小球的旁边,鼠标还带有两个感应器,它们可以检测到小球的旋转方向和速度。

当鼠标在桌面上移动时,小球也会滚动,感应器会测量出小球的旋转速度和方向。

这些测量结果会转化为电信号,传送给计算机。

计算机通过分析这些信号来确定光标在屏幕上的移动方向与速度。

此外,机械鼠标还设有按钮,用户通过按下按钮实现点击操作。

机械鼠标的优点是结构简单、成本低廉,但也存在一些缺点。

例如,由于有移动部件,小球易受灰尘、污渍等影响,需要经常清洁。

此外,使用机械鼠标时,较大的摩擦力会导致鼠标的滑动不够灵活。

二、光学鼠标的工作原理光学鼠标是一种较新的鼠标类型,它使用红外线光源和光学传感器来探测鼠标在桌面上的移动。

不同于机械鼠标的小球,光学鼠标底部配备有一个光学传感器,它通过红外线光源照射桌面上的微小纹理进行扫描。

当用户移动鼠标时,光学传感器会连续获取桌面上的图像,并将这些图像与之前的图像进行比对。

通过比对,鼠标可以确定光标的位移,并传输相应的信号给计算机,从而实现光标在屏幕上的移动。

与机械鼠标相比,光学鼠标有很多优点。

首先,它没有移动部件,不需要经常清洁。

其次,由于光学传感器对纹理扫描,光学鼠标的灵敏度更高,可以感知到更微小的移动。

此外,光学鼠标滑动时的摩擦力较小,可以提供更流畅的移动体验。

三、无线鼠标的工作原理无线鼠标是通过无线技术与计算机进行通信的鼠标。

它通过与计算机接收器或蓝牙连接,实现信号的传输与接收。

无线鼠标的工作原理与有线鼠标相似,唯一的区别在于数据的传输方式不同。

无线鼠标通过无线信号将用户的操作传送给计算机,无需使用连接电缆。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

鼠标的原理控制以及编程联想研究院板卡中心臧超飞前言.鼠标作为现代计算机的一个标准配置已经深深的影响了计算机的使用者因此在BIOS中加入鼠标的功能将为计算机提供更好的人机接口为使用者使用计算机带来更大的方便不同类型的鼠标主要不同的表现在数据传输的协议上主要的协议有四种类型1P S/22S erial3U SB4A DB第一部分鼠标与系统架构图1鼠标与系统架构图一是一个典型的现代PC的鼠标配置架构在最底层的硬件层鼠标作为一个单片机通过PS/2协议和系统的KBC进行通讯传递数据和命令第二层BIOS通过KBC上提供的60H和64H口和鼠标进行传递信息由此可以看出KBC封装了PS/2协议使得PS/2协议对于底层编程而言是通明的同样我们本文的主要内容也是基于KBC之上而跨越PS/2协议的第三层BIOS提供了基本的INT15H中断的调用使用者可以通过这个中断的调用给鼠标发送一些基本配置的命令注意INT15H没有提供鼠标的运行命令和数据接受接口第四层次系统Driver可以通过BIOS的INT15H的中断调用或者直接通过KBC的60H64H口控制鼠标同时向上为操作系统和应用程序提供服务第二部分PS/2协议以及鼠标的基本命令1信号定义PS/2协议主要包括两根信号线如图2CLK和DATA还有+5V的电源线和鼠标线DATA线是半双工的正常状态下CLK和DATA被主机端的一个510K的电阻拉高到5V见图3但是鼠标和主机KBC在任何时候都可以将这两个信号拉低当端口处于空闲的状态是LCK和DATA线都处于高电平主机可以在任何时候通过拉低CLK信号切断设备图2PS/2 电缆以及接口信号定义图3鼠标系统原理图2数据传输数据的传输是一个字节一个字节Byte传输的对于每一次的数据传输包括一个开始位a logic 08个数据内容的比特bits一个奇偶校验位odd parity和一个停止位 a logic0我们可以可以很容易看出8个数据位和奇偶校验位一起那么其奇偶性必定是奇的在传输过程中设备首先将CLK信号拉低产生CLK信号传输这十一个位bits传输设备通过拉高或者悬浮DATA信号来传输logic 0或logic 1在传输过程中设备可能处于三种传输状态a.空闲态Idle这时CLK信号和DATA信号都处于高电平态总线上没有传输行为b.抑制态Inhibit这时主机将CLK信号拉低设备将被从数据传输中切断c.请求传输Request to send这时主机将DATA信号拉低报纸CLK信号那么主机就是准备发送命令或者命令参数(1)输出到主机3命令集如果鼠标以及处于流模式Stream Mode而且已经被Enable$F4命令激活那么在给鼠标发送任何命令之前必须先将鼠标Disable$F4这样可以保证命令响应以及数据传输的完整性这一点非常类似于我们在C语言读写文件中间一定要注意关闭文件用以保证将缓冲区中的内容写到磁盘上因此如果我们在这种模式下发送了命令那么鼠标将会放弃而不是中断所有的数据传输包的传输以及命令的响应$FF复位命令Reset这个命令将引起鼠标的软件复位和重新校准鼠标的回应信号是一个ACK FA接着一个AA在重新校准后的300500ms给出00信号$FE重传命令Resend$F6设置缺省值$F5Disable$F4Enalbe$F3设置采样率$F2读设备类型$F0设置远程模式$EB读数据$EA设置流模式Set Stream Mode$E9状态查询$E8设置分辨率$E7设置二维坐标$E6取消二维坐标第三部分KBC以及命令和数据的接收过程前一部分我们介绍了常用的标准的PS/2,其中设计到了很多信号发送响应以及确认等复杂的过程但是对于实际编程而言复杂的工作已经被8042的芯片所封装了因此我们所要做的工作就是了解8042的接口以及操作方法(图4)8042的接口1.8042的接口从图4可以看出8042是一个非扩展的键盘控制器支持一个键盘和一个鼠标辅助接口典型的8042具有一个输出缓冲接口Output Buffer和一个输入缓冲接口输出缓冲是一个8位的只读Read only寄存器我们通过60H访问这个寄存器如果8042从键盘或鼠标读到一个数据信息放到了缓冲区中同时将状态寄存器见图5bit1置1表明此时缓冲区中有数据而且对于鼠标输入而言同时会将状态寄存器的bit5置1表明这个数据是来自鼠标而不是来自键盘输入缓冲是一个8位只写寄存器我们是通过60H和64h口来访问这个缓冲区的我们往64H中写入一个字节8042将它解释成一个命令字节表现在8042自动置状态寄存器bit3为1如果写往60口将被8042解释位数据即是命令的参数表现在8042自动置状态寄存器bit3为0从前面可以看出我们对于KBC是的操作是通过两个I/O端口60H和64H口由此访问系统的输入缓冲和输出缓冲同时又要控制鼠标和接口所以我们的操作要有严格的规范同时我们还要参照8042提供的状态寄存器操作的规范是如果我们60H写入一个字节那么这个字节被送入输入缓冲区且被解释成数据因为输出缓冲是一个只读寄存器所以不会写入输出缓冲同样因为输入缓冲是一个只写寄存器所以我们如果从60H读一个字节那么这个字节将是输出缓冲区的内容而不是我们写往输入缓冲区中的内容同样我们如果写往64H将被解释为一个命令字节我们如果读64H将会读到状态寄存器的内容而不是我们写入的命令的内容图58042状态寄存器因为8042的状态寄存器是一个只读寄存器因此它的内容是8042根据外部条件自动设置的我们重点说明bit0和bit5我们的操作是必须满足同时满足这两位为1才能说明我们从60H读出的数据是来自鼠标否则只根据bit5来判断没有任何的意义28042的命令我们首先说明60H命令和D4H命令这两个命令我们知道当8042从键盘或者鼠标收到一个数据的时候它将状态寄存器的内容同时置位之后向系统发出一个中断如果是键盘则发出IRQ9如果是鼠标那么就发出IRQ12在这里60H命令给我们提供了一个控制这两个中断的接口例如如果我们取消键盘中断我们可以这样写MOV Al60HOUT STAT8042, ALMOV AL, 66HOUT DATA8042,AL其中我们定义STAT8042EQU64H和DATA8042EQU60H首先我们向64H写入60H接着在往60H写入一个字节这个字节将被解释成一个命令参数参数的意义详见图60D4H命令是也是一个带有参数的命令这个命令使得我们可以通过8042向鼠标发送命令例如我们如果想向鼠标发送一个RESET命令即是FFH我们可以这样操作MOV Al0D4HOUT STAT8042, ALMOV AL, 0FFHOUT DATA8042,AL这里我们首先向64H发送一个0D4H命令那么接下来我们送往60H的命令将被送往鼠标当然以上的两个小例子只是简单说明我们编程控制的原理而没有实际的可行性在实图68042的命令际的编程过程中我们要检测状态寄存器的内容决定命令的发送;***************************************************************************** Set_D4_KC_MS PROC NEARmov cl,0d4h; set command bytemov al,0f6h; forced valuecall Send_Command_to_KCjnz short sdkm_err ; error if input buffer fullclcjmp short sdkm_retsdkm_err:stc续图68042的命令sdkm_ret:retSET_D4_KC_MS ENDP;*****************************************************************************上面这段程序是一个设置鼠标初始置的一个例程其中调用了例程Send_Command_to_KC这个例程将把0D4H CL中送往64H而把0F6H送往60H进而送到鼠标;****************************************************************************** ; Procedure Name:Send_Command_to_KC; Call by OUT_AUX,; Inputs:cl = command byte; al = data byte; Output:zf = 0 : keyboard controller error;zf = 1 : successful; Destroy:ax, bh, cx;****************************************************************************** Send_Command_to_KC Proc Nearpush bx; save BXmov ah,20h ; try again countpush cxpush axTry_Again:cli; Disable interruptspop ax ; restore ax, cxpop cxpush cxpush axmov al,cl ;Save commandcall out_8042jnz short Can_Not_Complete_Commandin al,stat8042 ;Read statusjmp $+2 ;IO delayand al,OBF_MS ; AUX OBF+ KB OBFcmp al,OBF_MS ; MOUSE Data ?jz short Clear_Aux_OBFtest al,OBF_8042; Keyboard OBF ?jz short Ready_to_Send; Jump if zerosti; Enable interruptspop axdec ahpush axjnz short Try_Again ; Loop if zf=0, cx>0jmp short can_not_complete_commandClear_AUX_OBF:in al,DATA8042 ; error recoverReady_to_Send:pop axpush axout DATA8042,al ;Send dataxor ah,ah ;Set zero flagstiCan_Not_Complete_Command:pop axpop cxpop bx; restore BXretSend_Command_to_KC EndP本例程尝试20H次完成这个任务首先调用把0D4H CL放入AL中然后调用例程OUT_8042完成这个命令的发送如果完成不了则退出保持标志位ZF位1接着检查鼠标口有没有数据如果有那么取出这个数据然后完成发送如果没有那么检查键盘端口有没有数据如果没有那么可以发送如果有那么打开中断使得键盘的程序可以取走数据然后进行一轮新的循环其中调用的例程out_8042的代码如下;[]=============================================================[]; Procedure Name:out_8042;;Output a command to 8042 port 64h;; Inputs:al = command byte; Output:zf = 0 : keyboard controller error;zf = 1 : successful; Destroy:ax, cx;[]=============================================================[] PUBLIC OUT_8042OUT_8042PROC NEARmov ah,al; save alcall Buffer_8042_Full; wait till buffer empty, thenjnz out_8042_retmov al,ahout STAT8042,al; send commandcall Buffer_8042_Fullout_8042_ret:retOUT_8042ENDP;[]=============================================================[]在这个例程中首先检查输入缓冲是否为空如果不是空的说明还有其他的任务键盘或者鼠标的没有完成我们必须等待如果空了那么我们就可以进行数据的输入了输入以后我们再等待8042对于数据的反映如果完成则退出如果没有完成那么继续等待如果中间出现zf的变化则表明是出现了处理的错误其中调用的Buffer_8042_Full的例程如下;[]=============================================================[]; Procedure Name:buffer_8042_full;Check for 8042 input buffer full; Saves:; Inputs:none; Output:al = status register value;zf = 0 : input buffer full;zf = 1 : no input buffer full; Destroy:al, cx;[]=============================================================[] PUBLIC BUFFER_8042_FULLBUFFER_8042_FULL PROC NEARxor cx,cxinrck1:in al,STAT8042newiodelayand al,IBF_8042loopnz short inrck1retBUFFER_8042_FULL ENDP;*****************************************************************************很明显这里检查状态位的输入缓冲标志是否置1来判断8042是否对于缓冲作出了处理前面我们对于命令的发送的细节做了详细的讨论下面我们对于数据的接受过程做一下讨论原理上8042接到鼠标的数据会将数据放入键盘缓冲区同时去设置状态位的两个标志bit0置1表明输出缓冲区中有内容bit34置1表明这个数据是来自鼠标具体例程见下面;***************************************************************************** ; Procedure Name:get_data;receive data from mouse if Auxiliary device Output Buffer Full; Saves:; Inputs:none; Output:zf = 1 : no data received;zf = 0 : successful;al = data byte received; Destroy:ah;*****************************************************************************GET_DATA PROC NEARpush cxxor cx,cxgd_loop:push cxcall out_aux_full; check AOBFpop cxjnz short receive_dataloop short gd_loopjmp short gd_retreceive_data:in al,data8042gd_ret:pop cxretGET_DATA ENDP;***************************************************************在此例程中首先判断是否有鼠标的数据如果有则接受如果没有则循环如果在0FFFFH 此后没有收到数据那么退出保留了标志位zf为1说明接受失败其中判断是否有鼠标输入引用例程out_aux_full;[]=============================================================[]; Procedure Name:out_aux_full;Check for 8042 auxiliary device output buffer full; Saves:; Inputs:none; Output:al = status register value;zf = 0 : auxiliary device output buffer full;zf = 1 : no auxiliary device output buffer full; Destroy:ax, cx;[]=============================================================[] PUBLIC OUT_AUX_FULLOUT_AUX_FULL PROC NEARcall out_8042_fulljz short no_aux_fulltest al,OBF_AUXno_aux_full:retOUT_AUX_FULL ENDP此例程首先是检查输出缓冲区是否为空如果在规定的时间内没有数据输入那么保留标志位ZF位1退出如果有数据那么再判断这个数据是否是来自键盘其中检查输出缓冲区是调用out_8042_full例程;[]=============================================================[]; Procedure Name:out_8042_full;Check for 8042 output buffer full; Saves:; Inputs:none; Output:al = status register value;zf = 0 : output buffer full;zf = 1 : no output buffer full; Destroy:ax, cx;[]=============================================================[] PUBLIC OUT_8042_FULLOUT_8042_FULL PROC NEARmov ah,12public Out_8042_Full1Out_8042_Full1labelnearotrck:xor cx,cxinrck:in al,STAT8042test al,OBF_8042jnz short onretloop short inrckdec ahjnz short otrckonret:retOUT_8042_FULL ENDP此例程首先设立检查次数位12次在每一次循环中间都是读出状态寄存器的值判断bit0是否为1前面我们主要讨论了60H和0D4H这两个命令并且详细讨论了命令的发送和数据接受的机制我在简单的讨论一下一些常用的命令A7/A8两个命令是用来使失效/使能鼠标接口AD/AE两个命令是用来使失效/使能键盘接口因此我们接受鼠标数据也可以通过使失效键盘接口的方法D2/D3这两个命令是USB的Trap部分用来模拟Ps/2鼠标用的如果我们先发送一个D2命令给64H口在接着向60H写入一个数据那么8042就会将这个数据放入输出缓冲区并且同样的设置状态位和设置中断就像这个数据是键盘发来的一样同样如果我们使用了D2命令就可以模拟鼠标的动作第四部分AWARD BIOS INT 15H鼠标支持简介AWDBIOS本身不支持鼠标的动作但是其提供了一个个中断和一个IRQ12空的例程我们下面来分析一下这些功能和源代码这些代码在文件ATORG.ASM中对于INT 15H的调用方式是在AH中间放入功能号INT15H给鼠标的功能号是C1和C2其中C1是用来得到BIOS扩展数据段的段址而C2则是提供了丰富的对于鼠标的控制调用的方法是将子功能号写入AL中而把参数写入BH寄存器子功能号00是用来使能/使失效鼠标的Stream模式其中BH中放入00则是使失效如果放入01则是使能其实这里就是对应的向鼠标发送F4和F5命令子功能号01则是向鼠标发出Reset命令相当于直接发出FFH子功能号02则是用来设置鼠标的采样率采样率参数放在BH中间相当于直接发命令F3 00; 10 reports/second01; 20 reports/second02; 40 reports/second03; 60 reports/second04; 80 reports/second05; 100 reports/second06; 200 reports/second子功能号03则是用来设置鼠标的分辨率分辨率参数放在BH中间相当于直接发命令E8 BH中的值如下= 00 : 1 count/millimeter= 01 : 2 counts/millimeter= 02 : 4 counts/millimeter= 03 : 8 counts/millimeter子功能号04是用来读取鼠标的ID没有输入参数输出参数的意义如下Output:bp_flag : cf = 0 : no errorcf = 1 : errorbp_errcode (AH) = 00 : no error= 03 : interface error= 04 : resendbp_bh (BH) = device id (mouse:00)子功能号05是用来设置系统包的格式以及使鼠标初始化设置缺省值子功能号06是用来设置鼠标的坐标系统相当于发出E7/E6命令其参数和返回值如下Inputs:bp_bl (BL) = extended command= 00 - Return status= 01 - Set scalling factor to 1:1= 02 - Set scalling factor to 2:1Output:bp_flag : cf = 0 : no errorcf = 1 : errorbp_errcode (AH) = 00 : no error= 01 : invalid function子功能号07是用来设置对于驱动程序的远程调用前面讨论了Awdbios对于鼠标操作的支持下面我们讨论一下awdbios提供的一个缺省的irq12的例程Public Dummy_IRQ12_HandlerDummy_IRQ12_Handler:push axcliin al,DATA8042; get mouse datamov al,END_OF_INTout B8259,al ; EOI to slave 8259NEWIODELAYout A8259,al; EOI to master 8259pop axiretFCODE ENDS这段程序基本上的任务就是清除鼠标数据基本上是没有做任何的动作注意后面的向两个8259发出的EOI命令业界的规范与设置BIOS扩展数据段扩展数据段定义在639640K之间为系统应用鼠标提供了一个标准的协议其定义如下EXT_BIOS_DATA STRUCEXTSIZE DB?;00 = Number of bytes allocated in multiples; of K (Byte);R02 RESERVED1DB32 DUP(?);01-21 = ReservedRESERVED1DB33 DUP(?);01-21 = Reserved;R02FCOFFSET DW?;22 = Device Driver Far Call Offset (Word)FCSEGMENT DW?;24 = Device Driver Far Call Segment (Word)PDFLG_1DB?;26 = Pointing Device Flag (1st Byte); 7 = Command in Progress; 6 = Resend; 5 = Acknowledge; 4 = Error; 3 = Reserved = 0; 2-0 = Index CountPDFLG_2DB?;27 = Pointing Device Flag (2nd Byte); 7 = Device Driver Far Call flag; 6-3 = Reserved; 2-0 = Package SizeAUXDATA DB8 DUP(?);28-2F = Auxiliary Data BufferEXT_BIOS_DATA ENDS第五部分编程的具体实例具体的编程部分包括以下几个部分1鼠标设备的初始化检测KBC使能复位设置2拦截硬件中断3流模式使能4数据接受以及对于错误的数据包的处理5鼠标的显示Zangcf@Doraemong@。

相关文档
最新文档