1、 鼠标是一种快速定位器,通过移动鼠标可以快速定位屏幕上的对象,是计算机图形界面交互的必用外部设备。通常,鼠标通过微机中的串口或 PS/2 鼠标插口与主机连接。当在平面上移动鼠标时,通过机械或光学的方法把鼠标滚轮移动的距离和方向转换成脉冲信号传送给计算机,计算机鼠标驱动程序将脉冲个数转换成鼠标的水平方向和垂直方向的位移量,从而控制显示屏上光标箭头随鼠标的移动而移动。根据此原理,我们可利用鼠标的上位机驱动程序来设计测控系统中的编码器读取软件。1 串行鼠标的原理及数据协议鼠标一般划分为以下功能模块:微控制器、按键检测、位置移动检测、RS232 信号产生、5V 电源产生器。串行鼠标的功能框图如图 1
2、所示。微软公司与 Mouse System 公司的鼠标都采用串行输入技术。微软公司的协议格式为3 个字节:第 1 字节的 6、7 位固定为 1,4,5 位分别为左右键状态,2、3 位为上下移动数据的高 6、7 位,0 、1 位为左右移动数据的高 6、7 位;第 2、第 3 字节发送的都是左右上下的其余 6 位数据,其中 Y 表示上下、X 表示左右移动的数据位。Mouse System 公司的协议格式为 5 个字节:1 个字节用于描述 3 个按键的状态, 2 个字节为 Y 方向的相对坐标,另外 2 个字节为 X 方向的相对坐标,具体协议如表 1 所列。由表 1 我们可以方便地制作鼠标。表 1 鼠
3、标系统数据信息协议Mouse System 格式 Microsoft 格式数字位 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0字节 1 1 0 0 0 0 L M R 1 1 L R Y7 Y6 X7 X6字节 2 X7 X6 X5 X4 X3 X2 X1 X0 0 0 X5 X4 X3 X2 X1 X0字节 3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 0 0 Y5 Y4 Y3 Y2 Y1 Y0字节 4 X7 X6 X5 X4 X3 X2 X1 X0 字节 5 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 L=左键状态 M=中键状态 R=右键状态 1= 按下 0=释
4、放X7 X0=X 轴(左右)运动数据 Y7Y0=Y 轴(上下)运动数据2 AT89C51 构成的鼠标电路AT89C2051 构成的鼠标接口电路如图 2 所示。硬件接口分配如下:P1 口完成对按键及 X、 Y 方向的运动扫描;P3.1 完成数据发送。为较好地跟踪鼠标状态,采用 12MHz 晶振,AT89C2051 每 s 执行 1 条指令,能满足实时跟踪的要求。图 2 电路原理图3 软件设计设计的软件要完成按键扫描、X 方向/Y 方向运动扫描、数据发送等任务。在记数光电管产生脉冲的同时,将数据按照规定格式发送到主机。脉冲的个数反映了移动的距离,单位时间内脉冲数越多,鼠标移动越快。下面以 X 方向
5、为例,详细说明方向的判断及脉冲的记数。X 方向的 2 路信号为 P1.2 与 P1.3,分别用 X1 与 X2 表示。当鼠标向左移动时,X1(P1.2)超前于 X2(P1.3);当鼠标向右移动时,X1(P1.2)落后于 X2(P1.3 );假设测得 X1、 X2 都为低电平 0(图 3 中 a),若下一次测得 X1 为高电平 1、X2 为低电平 0(图3 中 b)。第三次检测到 X1、 X2 电平 1(图 3 中 c),继续向左移动,直到检测到 X1 为低电平 1、X2 为高电平 0(图 3 中 d),正好检测到一个完整的脉冲,计数器加 1,接着进入下一个循环。由此可见,要完成一个脉冲的计数,
6、需要检测到四种不同的状态:X1=X2=0;X1=1,X2=0 ;X1=X2=1;X1=0 ,X2=1。向右移动的状态为:X1=X2=0;X1=0,X2=1 ;X1=X2=1;X1=1,X2=0 。正好与向左移动的情况相反。由此,可以根据本次测得的状态与上一次的状态比较的结果确定鼠标移动的方向。向上、向下的运动检测遵循同样的原则。根据以上分析,要完成一次计数,单片机至少要对每一种状态检测一次,这就需要单片机有较高的跟踪速度。由实验测得,最短的时间间隔在 b 与 d 处,即 X1=X2=0 变化到X1=X2=1 或者 X1=X2=1 变化到 X1=X2=0 的过程中。鼠标正常移动时,间隔一般为 3
7、00s500s。即使在鼠标高速移动时,最小间隔也大于 80s。当 AT89C2051 采用 12MHz晶振时,程序正常扫描一遍的时间最大为 50s(包括数据处理与发送的时间),因此,能保证每种状态都能扫描到。在表 1 中,X7X0 反映 X 方向移动的距离。如 X 值为正( X7=0),则表示鼠标向右运行;如果为负值(X7=1 ,即以补码表示),表示向左运行。同理,若 Y 值为正,表示鼠标向下运行;若为负,则表示向上运行。在程序中,若检测到鼠标状态有变化,则延时多个循环(在每个循环中都对鼠标状态检测一遍),作为消除按键抖动的时间。信息采用 RS232 格式,波特率为 1200baud。为满足鼠标 1 位起始位、7 位数据,无奇偶校验位以及 2 位停止位的数据格式,在程序中,对数据进行了处理,将要发送的每个字节的最高位置为 1。主程序流程如图 4 所示。在图中,当检测到按钮状态发化或者检测到 X、Y 方向运行时,置延时循环标志。为了发送 3 个字节信息,在串行口中断程序中置标志位,使 3 个字节能连续发送完。另外,当主机检测鼠标时,需要鼠标发送初始化报告,以检测鼠标是束安装。因此,在鼠标初始化过程中,首先要发送一个字节“4DH”(“M”,D7 位置“1”则为“CDH”),使主机能够检测到鼠标已经安装。