原创 80C196单片机鼠标接口程序设计实例

2008-3-9 23:56 4415 11 11 分类: 模拟

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />80C196单片机鼠标接口程序设计实例<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


文章作者:华北电力大学(北京)(102206)杨国田 白焰


抚顺石油学院(113001)徐培民


文章出处:电子技术应用 

 


摘要:通过对鼠标底层通信原理及协议的深入分析,探讨了鼠标在80C196单片机系统中的应用价值与可行性,并介绍了鼠标接口软件设计的原理及方法,给出了80C196单片机与Microsoft鼠标的具体接口程序。


关键词:鼠标 接口技术 软件设计 接口程序


80C196单片机由于低格低、处理能力强,在信号分析、数据采集等很多领域得到了广泛应用,在目标系统中使用各种规格的液晶或CRT显示器也越来越多。因此在这样的单片机系统中引入鼠标,将会方便操作,提高工作效率。鼠标内核本质上是一个二维的角度或位移信号检测装置,耗电极少、可靠性高、价格低廉,可能在许多场合发挥作用。鼠标与主机之间通过RS-232标准串行接口进行通信,信息传送是单方向、无条件、无应答连续进行的。此外80C196UART不直接支持鼠标的接口协议,在程序设计中必须予以注意。本文主要探讨80C196单片机与Microsoft兼容鼠标接口程序的设计实现。


1 鼠标信号发送协议与过程


鼠标是一个功能高度集中的小型机电一体化系统。它首先将直线移转换成角度位移,再转变成数字量,然后与按钮状态统一编码,通过RS-232串口发出。鼠标工作所需功率从RS-232串行接口的控制线上窃取(PS/2USB接口鼠标除外)。当鼠标被拖动超过一个最小距离或某一按钮被按下时,它按照规定的协议将移动距离和按钮状态通过一次或几次信息发送到机;主机上的鼠标驱动程序将信息变换成鼠标位置和按钮状态供其它程序模块调用。每发生一次移动或按钮状态变化,鼠标向上发送一次信息。通常一般鼠标的分辨率为400DPI。理论上即沿着某一方向每拖动一英寸(一般速度),会产生400次信息发送过程。,如果拖动较快,则信息发送次数送减少,但所反映的总的移动距离仍然是400步。


各种串行接口鼠标在物理层普遍采用标准的串行通信协议,波特率为1200bps。帧格式为7个数据位、2个停止位,无奇偶校验位。上层协议则在此基础上以十六进制数形式直接发更新鼠标信息,包括:初始化报告:移动方向、距离、按钮状态。其一般形式如表1所示。


1 鼠标信息发送格式




 


 


字串形式


 


 


 


1


初始化报告


4DH'M'


1字节


声明初始化结束


加电时发送一次


2


移动、按钮


P1P2P3


3字节


反映按钮状态、移动方向和距离


移动或按钮操作时发送


    上述P1P2P3三个参数说明:


P1_D7D6固定值01D1D0=11本次鼠标移动包含左右移动分量;D3D2=11本次鼠标移动包含上下移动分量;D4=1目前鼠标右键呈按下状态;D5=1目前鼠标左键呈按下状态(D4D5=00则键呈释放状态)。
    P2_D7D6
固定值00;其余六位表示一个有符号二进制数,反映左右移动量,大于0为向右移动,小于0为向左移动。


P3_D7D6固定值00;其余六位表示一个有符号二进制数,反映上下移动量,大于0为向下移动,小于0为向上移动。


例如:[6CH 02H 3AH]P1=6CH,P2=02H,P3=3AH)反馈出鼠标向右移动了2个单位,向上移动了6个单位,目前左键按下。


2 鼠标接口程序设计


80C196系列单片机内设RS-232收发器,但需要配置接口芯片实现电平转换。考虑到鼠标从串口窃取功率,接口芯片必须具有一定的驱动能力,而不能要用简单的准RS-232电平转换器。这里采用MAX232E作为接口芯片。


点击看大图


1中左侧为80C196单片机,P2.0TXD)、P2.1RXD)通过MAX232E形成满足鼠标要求的串行接口,包括生成标准RS-232C电平和提供电源供应。图1中最右边为9针或24针标准串行接插件。由于鼠标的电源供应采用功率窃取方案,由DTR/RTS提供,这里为DTR加限流电阻防止对鼠标造成伤害。RTSMAX232E垢信号发送端提供,通过80C196P2.0控制MAX232E10脚(对应的输出脚为7脚)电平高低以改变7脚电位,使鼠标可以接收来自RTS的控制命令,以实现鼠标安装与否的检测。MAX232E11脚(对应的输入脚为14脚)设备高电平以保证14脚电位为负RS-232电位,满足鼠标发送信号时的电平要求。


从链路层看,80C196串行接口的四种工作方式均不满足鼠标的帧格式要求;但其工作方式11位起始位、8位数据位、1位停止位)的总传送位数与鼠标(1位起始位、7个数据位、2个停止位)相同,均为10位。接收过程中80C196收到7个数据位后,将2个停止位中的第一个作为数据位装入接收缓冲器的最高位,由于停止位在物理层是高电平,作为数据被接收后相当于逻辑“0”;剩下的第二个停止位给好为80C196提供了有效的停止位。利用80C196的工作方式1完全可以保证正确接收鼠标信息。


单片机起动后,通过鼠标驱动模块对鼠标进行初始化,即通过P2.0使RTS电平翻转一次而令鼠标发送初始化报告,以确认鼠标是否安装。之后,鼠标即可随着拖动或按钮操作向单片机发送动作信息,经接口模块释放即可反应鼠标位置和按钮状态。


鼠标接口模块主要包括按钮状态识别和位置识别两个部分。80C196将根据接收到的鼠标信息不断刷新鼠标信息缓冲区。由于鼠标事件间隔不确定,采用扫描方式但会浪费CPU时间,还可能因来不及处理而丢失信息。有效的处理方法是采用中断方式接收,应用模块通过软件接口获得鼠标信息。完整的鼠标接口程序流程图如图2所示。在初始化阶段,首先检查鼠标是否存在,根据结果设置标志位,以备以后取鼠标信息时判断用;根据需要设定鼠标初始化位置、按钮原始状态;最后设置串行接口参数(帧格式等)并开放鼠标中断。鼠标发送信息时,第三个字节为一个完整的信息报告。但80C196每接收到一个字节,就产生一次中断,然后根据当前字节是否大于40H确定其性质。若是信息报告的首字节,则还要进一步通过有效性检验后保存;若不是首字节,则必须经过一系列检验后保存起来。收到三个字节后立即进行命令分析和执行。具体处理过程可参看源程序。用户模块通过特定接口模块(图2b))获得鼠标当前位置和按钮状,并可通过进位标志C=0/1判断鼠标是否安装。


下面是图23程序流程图如图对应的程序清单。该程序要求80C196单片机的工作频率为12MHz;如果采有其它工作频率,通过修改串行口的波特率设置参数以及延时程序的时间常数即可。


5d95179a-1c89-4b4a-8fc0-7c5216d92635.JPG


 


a0f03609-067b-46f6-8d2b-6d543026ac27.JPG


程序清单


8098特殊功能寄存器预定义


R0 EQU 00HWord


SBUD EQU 07HByte


INT_MASK EQU 08HByte


INT_PEND EQU 09H:Byte


BAUD_RT EQU 0EH:Byte


IOP2 EQU 10H:Byte


SP_CON EQU 11H:Byte


SP_STAT EQU 11H:Byte


IOC1 EQU 16HByte


SP EQU 18HWord



;通用寄存器预定义


RSEG AT ICH


AX DSW 1


DX DSW 1


AL EQU AXBYTE


AH EQU AX+1):BYTE


DL EQU DXBYTE


DH EQU DX+1):BYTE


SCRNW EQU 640 ;显示屏宽度


SCRNH EQU 480 ;显示屏高度



;变量区


RSEG AT 20H


M_X DSW 1 ;光标X


M_Y DSW 1 :光标Y


M_BUF DSB 4 ;接收缓冲区


M_P DSW 1 ;接收指针


BX DSW 1


LRB_OKDSB 1 ;鼠标状态


Bit7:存在,Bit5,左键,Bit4:右键



CSEG AT 2000H


DCW INIT


CSEG AT 200CH


DCW SIOINT


DCW INIT


DCW 0


DCB 000000


DCB 08DH


DCB 000H


DCB 027H0FEH



CSEG AT 2080H


INITLD SP#0100H ;设堆栈指针


LD M_X#SCRNW/2;初始化指针


LD M_Y#SCRNH/2


ANDB LRB_OK#7CH


LD M_P#M_BUF


CLRB INT_PEND ;清除中断


LDB INT_MASK#40H ;开串行中断


LDB ALSP_STAT ;清除RI/TI


LDB SP_CON#09H ;设串口模式


LDB BAUD_RT#9BH 120012MHz


LDB BAUD_RT#80H


EI


ANDB IOP2#0FEH P2.2=0


LD AX#8000H ;延迟200ms


DLY0DEC AX


JNE DLY0


LDB ALLRB_OK


LBS AL7M_OK


ANDB INT_MASK#0BFH


M_OKNOP


… … …



;清单二:取鼠标消息,


AL=鼠标及按钮状态,BX=XDX=Y GET_M:ANDB INT_MASK,#0BFH


LDB ALLRB_OK ;取鼠标信息


LD BXM_X


LD DXM_Y


ORB INT_MASK#40H


RET



;清单三:串口中断服务程序


SIOINTPUSHF ;中断服务


PUSH AX


LDB ALSBUF


LDB AHSP_STAT


JBS AL6ISB0 ;第一个字节


CMP M_P#M_BUF


JNE SIO_1


SJMP C99 ;缓冲区空,出错


SIO_1CMP M_P#M_BUF+2


JH C98 ;缓冲区满,出错


STB AL[M_P]+ ;存储收到字节


CMP M_P#M_BUF+3


JNE C99


LD M_P#M_BUF ;已收到完整命令


GOLRLDB AL1[M_P] ;处理X方向位移


SHLB AL#2


EXTB AL


SHRA AX#2


ADD M_X,AX


CKL:CMP M_X,#0


JGE CKR


CLR M_X


CKR:CMP M_X ,#SCRNW


JLT GOUD


LD M_X,#SCRNW


GOUD:LDB AL,2[M_P] ;处理Y方向位数


SHLB AL#2


EXTB AL


SHRA AX#2


ADD M_YAX


CKUCMP M_Y#0


JGE CKD


CLR M_Y


CKDCMP M_Y#SCRNH


JLT ELRUD


LD M_Y#SCRNH


ELRUDSJMP C98


ISB0STB ALM_BUF


ANDB AL#0FH


CMPB AL#03H


JE C97 ;=X3H,


CMPB AL,#0CH


JE C97 ;=XCH


CMPB AL#0DH


JNE C98 <>XDH


ORB LRB_OK#80H ;确认鼠标正常


C97ANDB ALM_BUF#30H


ANDB LRB_OK#80H


ORB LRB_OKAL ;更新左右键状态


LD M_P#M_BUF+1


SJMP C99


C98LD M_P#0000H


C99POP AX


POPF


RET



END


 


文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条