80C196单片机鼠标接口程序设计实例
下面是图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:Wordjavascript:window.open(this.src);" style="cursor:pointer;"/>
;
;通用寄存器预定义
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