首 页 用户登录 | ![]() |
|||
|
|||
按字母检索 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
按声母检索 | A | B | C | D | E | F | G | H | J | K | L | M | N | O | P | Q | R | S | T | W | X | Y | Z | 数字 | 符号 |
|
![]() |
您的位置: 5VAR论文频道 → 论文中心 → 理工论文 → 电子通信 |
|
|||||
80C196单片机鼠标接口程序设计实例 | |||||
收集整理:佚名 来源:本站整理 时间:2009-01-10 22:22:02 点击数:[] ![]() |
|||||
始化阶段,首先检查鼠标是否存在,根据结果设置标志位,以备以后取鼠标信息时判断用;根据需要设定鼠标初始化位置、按钮原始状态;最后设置串行接口参数(帧格式等)并开放鼠标中断。鼠标发送信息时,第三个字节为一个完整的信息报告。但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:Byte SP_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_X LD 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,#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_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,#0FH CMPB 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 |
提供人:佚名 | |
【返回上一页】【打 印】【关闭窗口】 |
![]() |
5VAR论文频道 |
![]() |
5VAR论文频道 |
![]() |
关于本站 -
网站帮助 -
广告合作 -
下载声明 -
网站地图
Copyright © 2006-2033 5Var.Com. All Rights Reserved . |