网站首页 | 经济学论文 | 证券金融 | 管理学 | 会计审计 | 法学论文 | 医药学论文 | 社会学论文 | 教育论文 | 计算机 | 艺术论文 | 哲学论文 | 财务管理 |
写论文网
  • 计算机应用论文
  • 计算机理论论文
  • 计算机网络论文
  • 您的位置:写论文网 > 计算机 > 计算机理论论文 > 单片机C语言程序设计 [80C19... 正文 2019-12-25 07:25:22

    单片机C语言程序设计 [80C196单片机鼠标接口程序设计实例]

    相关热词搜索:

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

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

    1 鼠标信号发送协议与过程 鼠标是一个功能高度集中的小型机电一体化系统。它首先将直线移转换成 角度位移,再转变成数字量,然后与按钮状态统一编码,通过RS-232串口发出。

    鼠标工作所需功率从RS-232串行接口的控制线上窃取(PS/2、USB接口鼠标除外)。

    当鼠标被拖动超过一个最小距离或某一按钮被按下时,它按照规定的协议将移动 距离和按钮状态通过一次或几次信息发送到机;
    主机上的鼠标驱动程序将信息变 换成鼠标位置和按钮状态供其它程序模块调用。每发生一次移动或按钮状态变化, 鼠标向上发送一次信息。通常一般鼠标的分辨率为400DPI。理论上即沿着某一方 向每拖动一英寸(一般速度),会产生400次信息发送过程。,如果拖动较快, 则信息发送次数送减少,但所反映的总的移动距离仍然是400步。

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

    表1 鼠标信息发送格式 上述P1、P2、P3三个参数说明:
    P1_D7D6固定值01;
    D1D0=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.0(TXD)、P2.1(RXD)通过MAX232E 形成满足鼠标要求的串行接口,包括生成标准RS-232C电平和提供电源供应。图 1中最右边为9针或24针标准串行接插件。由于鼠标的电源供应采用功率窃取方案, 由DTR/RTS提供,这里为DTR加限流电阻防止对鼠标造成伤害。RTS由MAX232E 垢信号发送端提供,通过80C196的P2.0控制MAX232E的10脚(对应的输出脚为7 脚)电平高低以改变7脚电位,使鼠标可以接收来自RTS的控制命令,以实现鼠 标安装与否的检测。MAX232E的11脚(对应的输入脚为14脚)设备高电平以保 证14脚电位为负RS-232电位,满足鼠标发送信号时的电平要求。

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

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

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

    用户模块通过特定接口模块(图2(b))获得鼠标当前位置和按钮状,并可通过 进位标志C=0/1判断鼠标是否安装。

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




    8098特殊功能寄存器预定义 R0 EQU 00H:Word SBUD EQU 07H:Byte INT_MASK EQU 08H:Byte INT_PEND EQU 09H:Byte BAUD_RT EQU 0EH:Byte IOP2 EQU 10H:Byte SP_CON EQU 11H:ByteSP_STAT EQU 11H:Byte IOC1 EQU 16H:Byte SP EQU 18H:Word ;


    通用寄存器预定义 RSEG AT ICH AX:
    DSW 1 DX:
    DSW 1 AL EQU AX:BYTE AH EQU (AX+1):BYTE DL EQU DX:BYTE 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_OK:DSB 1 ;
    鼠标状态 ;
    Bit7:存在,Bit5,左键,Bit4:右键 ;

    CSEG AT 2000H DCW INIT CSEG AT 200CH DCW SIOINT DCW INIT DCW 0 DCB 0,0,0,0,0,0 DCB 08DH DCB 000H DCB 027H,0FEH ;

    CSEG AT 2080H INIT:LD 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 AL,SP_STAT ;
    清除RI/TI LDB SP_CON,#09H ;
    设串口模式 LDB BAUD_RT,#9BH ;
    1200,12MHz LDB BAUD_RT,#80H EI ANDB IOP2,#0FEH ;
    P2.2=0 LD AX,#8000H ;
    延迟200ms DLY0:DEC AX JNE DLY0 LDB AL,LRB_OK LBS AL,7,M_OK ANDB INT_MASK,#0BFH M_OK:NOP ;

    … … … ;


    清单二:取鼠标消息, AL=鼠标及按钮状态,BX=X,DX=Y GET_M:ANDB INT_MASK,#0BFH LDB AL,LRB_OK ;
    取鼠标信息 LD BX,M_XLD DX,M_Y ORB INT_MASK,#40H RET ;


    清单三:串口中断服务程序 SIOINT:PUSHF ;
    中断服务 PUSH AX LDB AL,SBUF LDB AH,SP_STAT JBS AL,6,ISB0 ;
    第一个字节 CMP M_P,#M_BUF JNE SIO_1 SJMP C99 ;
    缓冲区空,出错 SIO_1:CMP M_P,#M_BUF+2 JH C98 ;
    缓冲区满,出错 STB AL,[M_P]+ ;
    存储收到字节 CMP M_P,#M_BUF+3 JNE C99 LD M_P,#M_BUF ;
    已收到完整命令 GOLR:LDB AL,1[M_P] ;
    处理X方向位移 SHLB AL,#2EXTB 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_Y,AX CKU:CMP M_Y,#0 JGE CKD CLR M_Y CKD:CMP M_Y,#SCRNH JLT ELRUD LD M_Y,#SCRNH ELRUD:SJMP C98 ISB0:STB AL,M_BUF ANDB AL,#0FHCMPB AL,#03H JE C97 ;=X3H, CMPB AL,#0CH JE C97 ;=XCH CMPB AL,#0DH JNE C98 ;
    XDH ORB LRB_OK,#80H ;
    确认鼠标正常 C97:ANDB AL,M_BUF,#30H ANDB LRB_OK,#80H ORB LRB_OK,AL ;
    更新左右键状态 LD M_P,#M_BUF+1 SJMP C99 C98:LD M_P,#0000H C99:POP AX POPF RET ;

    END

    • 范文大全
    • 教案
    • 优秀作文
    • 教师范文
    • 综合阅读
    • 读后感
    • 说说
    单片机C语言程序设计 [80C196单片机鼠标接口程序设计实例] 》由(写论文网)整理提供,版权归原作者、原出处所有。
    Copyright © 2019 写论文网 All Rights Reserved.