📄 1
字号:
;-----------------------------------------------
; 鼠标应用程序示范
; MCU AT89S51 XAL 12MHz
;-----------------------------------------------
;
;-----------------------------------------------
; 变量、常量、端口定义表
;-----------------------------------------------
;
MOUSEFLAG BIT 000H ;3D鼠标存在标志
MOUSEDATA DATA 021H ;鼠标读出数据寄存单元21H~24H
DATA_X DATA 025H ;水平方向调整数据
DATA_Y DATA 026H ;竖直方向调整数据
DATA_Z DATA 027H ;滚轮调整数据
PS2CLK BIT P0.1 ;接ps/2座的5脚,移位时钟
PS2DTL BIT P0.0 ;接ps/2座的1脚,移位数据
LAMP1 BIT P3.4 ;小灯1
LAMP2 BIT P3.3 ;小灯2
BEEP BIT P0.2 ;蜂鸣器
;
LAMPBLAK EQU P1.4 ;背光灯控制,=0时开,=1时关.
CS EQU P1.5 ;液晶使能,=1操作,=0禁止.
SID EQU P1.6 ;液晶串行数据输入口
SCLK EQU P1.7 ;液晶串行操作时钟口
DISDATA EQU 40H ;LCD显示单元,连续3个单元
;-----------------------------------------------
; 中断向量表
;-----------------------------------------------
ORG 0000H
START: LJMP MAININI ; 0000H 引向主程序初始化
;
;-----------------------------------------------
; 主程序
;-----------------------------------------------
ORG 0030H
MAININI: MOV IE, #00H ;关中断
MOV PSW, #00H ;选用寄存器组0
MOV SP, #80H ;设置堆栈指针
CLR CS ;液晶操
LCALL SETUP ;LCD初始化
LCALL LOGON ;开机显示画面
MOV R0,#40H ;40H-43H为显示数据存放单元(40H为最高位)
MOV R7,#0BH
CLEARDISP: MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP
;
MOV R6, #027H
MOV R7, #010H
LCALL DELAY3D
CLR MOUSEFLAG
LCALL PS2_3DMOUSEINI ;初始化3D鼠标
MOV A, R7
JNZ MAIN01
SETB MOUSEFLAG ;3D鼠标初始化成功
CLR LAMP1
;
MAIN01: NOP ;其它主程序
NOP
;以下鼠标功能程序
JNB MOUSEFLAG, MAIN01
LCALL MOUSEFUN ;鼠标功能子程序
AJMP MAIN01
;
;-----------------鼠标功能程序------------------
MOUSEFUN: MOV R0, #MOUSEDATA
LCALL THREEDMOUSER
MOV A, R7
JNZ RETOUT
JB MOUSEDATA.0, MAIN021 ;鼠标左键
JB MOUSEDATA.1, MAIN022 ;鼠标右键
JB MOUSEDATA.2, MAIN023 ;鼠标中键
FUN1:
JB MOUSEDATA.4,DX ;鼠标水平右处理
MOV A,DATA_X
ADD A,MOUSEDATA+1
MOV DATA_X,A
DDY: JB MOUSEDATA.5,DY ;鼠标竖直前处理
MOV A,DATA_Y
ADD A,MOUSEDATA+2
MOV DATA_Y,A
DDZ: MOV A,MOUSEDATA+3 ;鼠标滚轮处理
JB ACC.3,DZ
ANL A,#07H ;滚轮数据加0-7
ADD A,DATA_Z
MOV DATA_Z,A
RETOUT: LCALL UPLCD
RET
;
DX: MOV A,MOUSEDATA+1 ;鼠标水平左处理
CPL A
ADD A,#01H
XCH A,DATA_X
SUBB A,DATA_X
MOV DATA_X,A
AJMP DDY
DY: MOV A,MOUSEDATA+2 ;鼠标竖直后处理
CPL A
ADD A,#01H
XCH A,DATA_Y
SUBB A,DATA_Y
MOV DATA_Y,A
AJMP DDZ
DZ: CPL A
ADD A,#01H
ANL A,#0FH ;滚轮数据减1-8
XCH A,DATA_Z
SUBB A,DATA_Z
MOV DATA_Z,A
AJMP RETOUT
;
MAIN021: NOP ;鼠标左键功能
CPL LAMP1 ;小灯亮灭操作
LJMP FUN1
MAIN022: NOP ;鼠标右键功能
CPL LAMP2 ;小灯亮灭操作
LJMP FUN1
MAIN023: NOP ;鼠标中键功能
CPL BEEP ;蜂呜器操作
LJMP FUN1
;
;
UPLCD: MOV A,DATA_Z ;处理滚轮数据显示
LCALL BCD ;十进制数分离
MOV A,#84H ;显示在液晶的第一行第5个汉字位置
LCALL DATAUP ;送LCD显示
MOV A,DATA_X ;处理X坐标数据
LCALL BCD ;
MOV A,#91H ;显示在第二行第2个汉字位置
LCALL DATAUP
MOV A,DATA_Y ;处理Y坐标数据
LCALL BCD
MOV A,#94H ;显示在第二行第5个汉字位置
LCALL DATAUP
RET
;
BCD: MOV B,#100
DIV AB
MOV DISDATA,A ;百位数
MOV A,B
MOV B,#10
DIV AB
MOV DISDATA+1,A ;十位数
MOV DISDATA+2,B ;个位数
RET
;-----------------------------------------------
; PS/2 3D鼠标初始化程序
; 返回值R7:0成功
;-----------------------------------------------
MSBYTEWAITTIMEA EQU 04H
MSBYTEWAITTIMEB EQU 0EH
MSBYTEWAITTIMEC EQU 040H
PS2_3DMOUSEINI:
PUSH PSW
PUSH ACC
MOV A, R5
PUSH ACC
MOV A, R6
PUSH ACC
MOV R7, #0FFH ;复位命令
LCALL PS2H2DSEND
MOV A, R7
JNZ PS23DMS11O ;PS/2通信不成功
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI11: JNB PS2CLK, PS23DMSI12
DJNZ R7, PS23DMSI11
DJNZ R6, PS23DMSI11
DJNZ R5, PS23DMSI11
PS23DMS11O: LJMP MOUSE3DOUT
PS23DMSI12: LCALL PS2D2HRECEIVE
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI14: JNB PS2CLK, PS23DMSI15
DJNZ R7, PS23DMSI14
DJNZ R6, PS23DMSI14
DJNZ R5, PS23DMSI14
LJMP MOUSE3DOUT
PS23DMSI15: LCALL PS2D2HRECEIVE
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI16: JNB PS2CLK, PS23DMSI17
DJNZ R7, PS23DMSI16
DJNZ R6, PS23DMSI16
DJNZ R5, PS23DMSI16
LJMP MOUSE3DOUT
PS23DMSI17: LCALL PS2D2HRECEIVE
MOV A, R7
JNZ PS23DMS21O ;检查鼠标ID
MOV R7, #0F3H ;Set Sample Rate命令
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI21: JNB PS2CLK, PS23DMSI22
DJNZ R7, PS23DMSI21
DJNZ R6, PS23DMSI21
DJNZ R5, PS23DMSI21
PS23DMS21O: LJMP MOUSE3DOUT
PS23DMSI22: LCALL PS2D2HRECEIVE
MOV R7, #0C8H ;200
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI31: JNB PS2CLK, PS23DMSI32
DJNZ R7, PS23DMSI31
DJNZ R6, PS23DMSI31
DJNZ R5, PS23DMSI31
PS23DMS31O: LJMP MOUSE3DOUT
PS23DMSI32: LCALL PS2D2HRECEIVE
MOV R7, #0F3H ;Set Sample Rate命令
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI41: JNB PS2CLK, PS23DMSI42
DJNZ R7, PS23DMSI41
DJNZ R6, PS23DMSI41
DJNZ R5, PS23DMSI41
PS23DMS41O: LJMP MOUSE3DOUT
PS23DMSI42: LCALL PS2D2HRECEIVE
MOV R7, #064H ;100
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI51: JNB PS2CLK, PS23DMSI52
DJNZ R7, PS23DMSI51
DJNZ R6, PS23DMSI51
DJNZ R5, PS23DMSI51
PS23DMS51O: LJMP MOUSE3DOUT
PS23DMSI52: LCALL PS2D2HRECEIVE
MOV R7, #0F3H ;Set Sample Rate命令
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI61: JNB PS2CLK, PS23DMSI62
DJNZ R7, PS23DMSI61
DJNZ R6, PS23DMSI61
DJNZ R5, PS23DMSI61
PS23DMS61O: LJMP MOUSE3DOUT
PS23DMSI62: LCALL PS2D2HRECEIVE
MOV R7, #050H ;80
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI71: JNB PS2CLK, PS23DMSI72
DJNZ R7, PS23DMSI71
DJNZ R6, PS23DMSI71
DJNZ R5, PS23DMSI71
PS23DMS71O: LJMP MOUSE3DOUT
PS23DMSI72: LCALL PS2D2HRECEIVE
MOV R7, #0F2H ;Read Device Type命令
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI81: JNB PS2CLK, PS23DMSI82
DJNZ R7, PS23DMSI81
DJNZ R6, PS23DMSI81
DJNZ R5, PS23DMSI81
PS23DMS81O: LJMP MOUSE3DOUT
PS23DMSI82: LCALL PS2D2HRECEIVE
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI83: JNB PS2CLK, PS23DMSI84
DJNZ R7, PS23DMSI83
DJNZ R6, PS23DMSI83
DJNZ R5, PS23DMSI83
LJMP MOUSE3DOUT
PS23DMSI84: LCALL PS2D2HRECEIVE
MOV A, R7
CJNE A, #03H, PS23DMS91O ;检测是否3D鼠标
MOV R7, #0E8H ;Set Resolution命令
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSI91: JNB PS2CLK, PS23DMSI92
DJNZ R7, PS23DMSI91
DJNZ R6, PS23DMSI91
DJNZ R5, PS23DMSI91
PS23DMS91O: LJMP MOUSE3DOUT
PS23DMSI92: LCALL PS2D2HRECEIVE
MOV R7, #00H ;1 counts/mm
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSIA1: JNB PS2CLK, PS23DMSIA2
DJNZ R7, PS23DMSIA1
DJNZ R6, PS23DMSIA1
DJNZ R5, PS23DMSIA1
PS23DMSA1O: LJMP MOUSE3DOUT
PS23DMSIA2: LCALL PS2D2HRECEIVE
MOV R7, #0E6H ;Set scaling 1:1
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSIB1: JNB PS2CLK, PS23DMSIB2
DJNZ R7, PS23DMSIB1
DJNZ R6, PS23DMSIB1
DJNZ R5, PS23DMSIB1
PS23DMSB1O: LJMP MOUSE3DOUT
PS23DMSIB2: LCALL PS2D2HRECEIVE
MOV R7, #0F3H ;Set Sample Rate命令
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSIC1: JNB PS2CLK, PS23DMSIC2
DJNZ R7, PS23DMSIC1
DJNZ R6, PS23DMSIC1
DJNZ R5, PS23DMSIC1
PS23DMSC1O: LJMP MOUSE3DOUT
PS23DMSIC2: LCALL PS2D2HRECEIVE
MOV R7, #028H ;40
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSID1: JNB PS2CLK, PS23DMSID2
DJNZ R7, PS23DMSID1
DJNZ R6, PS23DMSID1
DJNZ R5, PS23DMSID1
PS23DMSD1O: LJMP MOUSE3DOUT
PS23DMSID2: LCALL PS2D2HRECEIVE
MOV R7, #0F4H ;Enable Device命令
LCALL PS2H2DSEND
MOV R5, #MSBYTEWAITTIMEA
MOV R6, #MSBYTEWAITTIMEB
MOV R7, #MSBYTEWAITTIMEC
PS23DMSIE1: JNB PS2CLK, PS23DMSIE2
DJNZ R7, PS23DMSIE1
DJNZ R6, PS23DMSIE1
DJNZ R5, PS23DMSIE1
PS23DMSE1O: LJMP MOUSE3DOUT
PS23DMSIE2: LCALL PS2D2HRECEIVE
MOV A, R7
CJNE A, #0FAH, MOUSE3DOUT
MOV R7, #00H
SJMP MOUSE3DOK
MOUSE3DOUT: MOV R7, #01H
MOUSE3DOK: POP ACC
MOV R6, A
POP ACC
MOV R5, A
POP ACC
POP PSW
RET
;
;-----------------------------------------------
; 3D鼠标数据接收程序
; 参数R0(指针)
; 返回值R7:0接受成功
;-----------------------------------------------
MOUSEDAWTIME EQU 200
THREEDMOUSER:
PUSH PSW
PUSH ACC
SETB PS2CLK
MOV R7, #MOUSEDAWTIME
TDMR01: JNB PS2CLK, TDMR02
DJNZ R7, TDMR01
INC R7
SJMP OUTTDMR
TDMR02: LCALL PS2D2HRECEIVE
MOV A, R7
MOV @R0, A
INC R0
MOV R7, #MOUSEDAWTIME
TDMR11: JNB PS2CLK, TDMR12
DJNZ R7, TDMR11
INC R7
SJMP OUTTDMR
TDMR12: LCALL PS2D2HRECEIVE
MOV A, R7
MOV @R0, A
INC R0
MOV R7, #MOUSEDAWTIME
TDMR31: JNB PS2CLK, TDMR32
DJNZ R7, TDMR31
INC R7
SJMP OUTTDMR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -