关键词:鼠标 AT89C2051 软件设计
1 串行鼠标的原理及数据协议
鼠标一般划分为以下功能模块:微控制器、按键检测、位置移动检测、RS232信号产生、5V电源产生器。串行鼠标的功能框图如图1所示。
表1 鼠标系统数据信息协议Mouse System格式Microsoft格式数字位7 6 5 4 3 2 1 07 6 5 4 3 2 1 0字节11 0 0 0 0 L M R1 1 L R Y7 Y6 X7 X6字节2X7 X6 X5 X4 X3 X2 X1 X00 0 X5 X4 X3 X2 X1 X0字节3Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y00 0 Y5 Y4 Y3 Y2 Y1 Y0字节4X7 X6 X5 X4 X3 X2 X1 X0 字节5Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
L=左键状态 M=中键状态 R=右键状态 1=按下 0=释放
X7~X0=X轴(左右)运动数据 Y7~Y0=Y轴(上下)运动数据
2 AT89C51构成的鼠标电路
AT89C2051构成的鼠标接口电路如图2所示。
硬件接口分配如下:
P1口完成对按键及X、Y方向的运动扫描;
P3.1完成数据发送。
为较好地跟踪鼠标状态,采用12MHz晶振,AT89C2051每μs执行1条指令,能满足实时跟踪的要求。
图2 电路原理图
3 软件设计
设计的软件要完成按键扫描、X方向/Y方向运动扫描、数据发送等任务。在记数光电管产生脉冲的同时,将数据按照规定格式发送到主机。脉冲的个数反映了移动的距离,单位时间内脉冲数越多,鼠标移动越快。
下面以X方向为例,详细说明方向的判断及脉冲的记数。
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,接着进入下一个循环。由此可见,要完成一个脉冲的计数,需要检测到四种不同的状态: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。正好与向左移动的情况相反。
由此,可以根据本次测得的状态与上一次的状态比较的结果确定鼠标移动的方向。
向上、向下的运动检测遵循同样的原则。
在表1中,X7~X0反映X方向移动的距离。如X值为正(X7=0),则表示鼠标向右运行;如果为负值(X7=1,即以补码表示),表示向左运行。
同理,若Y值为正,表示鼠标向下运行;若为负,则表示向上运行。
在程序中,若检测到鼠标状态有变化,则延时多个循环(在每个循环中都对鼠标状态检测一遍),作为消除按键抖动的时间。信息采用RS232格式,波特率为1200baud。为满足鼠标1位起始位、7位数据,无奇偶校验位以及2位停止位的数据格式,在程序中,对数据进行了处理,将要发送的每个字节的最高位置为1。
另外,当主机检测鼠标时,需要鼠标发送初始化报告,以检测鼠标是束安装。因此,在鼠标初始化过程中,首先要发送一个字节“4DH”(“M”,D7位置“1”则为“CDH”),使主机能够检测到鼠标已经
4 结论
本文利用AT89C2051完成了鼠标移动数据的读取与PC机通信数据的传送。该系统在Windows 95、98和Win2000XP下均调试通过。文中给出的硬件原理图同样可应用于测控系统中编程器信号的读取,应用面较广。