⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1

📁 RM51单片机实验板配套实验例程库
💻
📖 第 1 页 / 共 2 页
字号:
;-----------------------------------------------
;  鼠标应用程序示范
;  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 + -