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

📄 1

📁 RM51单片机实验板配套实验例程库
💻
📖 第 1 页 / 共 2 页
字号:
TDMR32:     LCALL PS2D2HRECEIVE
            MOV   A, R7
            MOV   @R0, A
            INC   R0
            MOV   R7, #MOUSEDAWTIME
TDMR41:     JNB   PS2CLK, TDMR42
            DJNZ  R7, TDMR41
            INC   R7
            SJMP  OUTTDMR
TDMR42:     LCALL PS2D2HRECEIVE
            MOV   A, R7
            MOV   @R0, A
            MOV   R7, #00H
OUTTDMR:    CLR   PS2CLK
            POP   ACC
            POP   PSW
            RET
;
;-----------------------------------------------
;  PS/2 Host-to-Device Communication (Send)
;  参数在R7中
;  返回值R7(0正确发送)
;-----------------------------------------------
PS2WATCHTIME  EQU      50
PS2H2DSEND:
           PUSH     PSW
           PUSH     ACC
           MOV      A,    R6
           PUSH     ACC
           MOV      A,    R7                  ;取参数
           CLR      PS2CLK                    ;PS/2时钟线下拉
           MOV      R6,   #00H                ;保持100uS以上
           MOV      R7,   #02H
           LCALL    DELAY3D
           CLR      PS2DTL                    ;数据线下拉
           NOP
           SETB     PS2CLK                    ;时钟线释放
           MOV      C,        P               ;暂存奇偶校验位
           CPL      C                         ;奇校验
           MOV      R7,   #9
PS2SEND1:  MOV      R6,   #PS2WATCHTIME
PS2SEND11: JNB      PS2CLK,   PS2SEND12       ;JB       PS2CLK,   $发送8位数据+奇偶校验位
           DJNZ     R6,   PS2SEND11
           SJMP     PS2SOUT
PS2SEND12: RRC      A
           MOV      PS2DTL,   C
           MOV      R6,   #PS2WATCHTIME
PS2SEND14: JB       PS2CLK,   PS2SEND15       ;JNB      PS2CLK,   $
           DJNZ     R6,   PS2SEND14
           SJMP     PS2SOUT
PS2SEND15: DJNZ     R7,   PS2SEND1
           DEC      R7
           MOV      R6,   #PS2WATCHTIME
PS2SEND21: JNB      PS2CLK,   PS2SEND22       ;JB       PS2CLK,   $发送停止位
           DJNZ     R6,   PS2SEND21
           SJMP     PS2SOUT
PS2SEND22: SETB     PS2DTL
           DEC      R7
           MOV      R6,   #PS2WATCHTIME
PS2SEND23: JB       PS2CLK,   PS2SEND24       ;JNB      PS2CLK,   $
           DJNZ     R6,   PS2SEND23
           SJMP     PS2SOUT
PS2SEND24: MOV      R6,   #PS2WATCHTIME
           DEC      R7
PS2SEND25: JNB      PS2DTL,   PS2SEND26       ;JB       PS2DTL,   $等待ACK
           DJNZ     R6,   PS2SEND25
           SJMP     PS2SOUT
PS2SEND26: MOV      R6,   #PS2WATCHTIME
           DEC      R7
PS2SEND27: JNB      PS2CLK,   PS2SEND28       ;JB       PS2CLK,   $
           DJNZ     R6,   PS2SEND27
           SJMP     PS2SOUT
PS2SEND28: MOV      R6,   #PS2WATCHTIME
           DEC      R7
PS2SEND29: JB       PS2CLK,   PS2SEND2A       ;JNB      PS2CLK,   $
           DJNZ     R6,   PS2SEND29
           SJMP     PS2SOUT
PS2SEND2A: MOV      R6,   #PS2WATCHTIME
           DEC      R7
PS2SEND2B: JB       PS2DTL,   PS2SEND2C       ;JNB      PS2DTL,   $
           DJNZ     R6,   PS2SEND2B
           SJMP     PS2SOUT
PS2SEND2C: MOV      R7,   #00H
PS2SOUT:   POP      ACC
           MOV      R6,   A
           POP      ACC
           POP      PSW
           RET
;
;-----------------------------------------------
;  PS/2 Device-to-Host Communication (Receive)
;  返回值在R7中
;  Cy为数据有效标志1正确,0错误
;-----------------------------------------------
PS2D2HRECEIVE:
           PUSH     ACC
           PUSH     B
           MOV      A,    R6
           PUSH     ACC
           MOV      R6,   #PS2WATCHTIME
PS2RECEI01:JNB      PS2CLK, PS2RECEI02      ;JB       PS2CLK, $PS2CLK为PS/2时钟线
           DJNZ     R6,   PS2RECEI01
           CLR      C
           SJMP     PS2REXIT
PS2RECEI02:MOV      C, PS2DTL               ;检查起始位是否为0
           CPL      C
           JNC      PS2REXIT                ;起始位错误
           MOV      R6,   #PS2WATCHTIME
PS2RECEI03:JB       PS2CLK, PS2RECEI04      ;JNB      PS2CLK, $
           DJNZ     R6,   PS2RECEI03
           CLR      C
           SJMP     PS2REXIT
PS2RECEI04:MOV      R7, #9
PS2REC1:   RRC      A                       ;接收8位数据+奇偶校验位
           MOV      R6,   #PS2WATCHTIME
PS2RECEI11:JNB      PS2CLK, PS2RECEI12      ;JB       PS2CLK, $等待时钟下降沿
           DJNZ     R6,   PS2RECEI11
           CLR      C
           SJMP     PS2REXIT
PS2RECEI12:MOV      C,   PS2DTL
           MOV      R6,   #PS2WATCHTIME
PS2RECEI14:JB       PS2CLK, PS2RECEI15      ;JNB      PS2CLK, $
           DJNZ     R6,   PS2RECEI14
           CLR      C
           SJMP     PS2REXIT
PS2RECEI15:DJNZ     R7,  PS2REC1
           MOV      R7,  A
           MOV      B.0,  C                 ;奇校验
           MOV      C,   P
           MOV      ACC.0, C
           XRL      A,   B
           MOV      C,   ACC.0
           JNC      PS2REXIT                ;奇偶校验错误
           MOV      R6,   #PS2WATCHTIME
PS2RECEI16:JNB      PS2CLK, PS2RECEI17      ;JB       PS2CLK, $检测停止位
           DJNZ     R6,   PS2RECEI16
           CLR      C
           SJMP     PS2REXIT
PS2RECEI17:MOV      C,   PS2DTL
           JNC      PS2REXIT                ;停止位错误
           MOV      R6,   #PS2WATCHTIME
PS2RECEI18:JB       PS2CLK, PS2RECEI19      ;JNB      PS2CLK, $
           DJNZ     R6,   PS2RECEI18
           CLR      C
           SJMP     PS2REXIT
PS2RECEI19:
PS2REXIT:  POP      ACC
           MOV      R6,   A
           POP      B
           POP      ACC
           RET
;
;
;-----------------------------------------------
;延时100机器周期*参数(1~65535)
;参数传递R6R7
;-----------------------------------------------
DELAY3D:      PUSH     PSW               ;2
            PUSH     ACC               ;2
            MOV      A,     R5         ;1
            PUSH     ACC               ;2
            MOV      A,     R7         ;1
            JZ       DELA1             ;2
            INC      R6                ;1
DELA1:      MOV      R5,    #50D       ;2
            DJNZ     R5,    $          ;2
            DJNZ     R7,    DELA1      ;2
            DJNZ     R6,    DELA1      ;2
            POP      ACC               ;2
            MOV      R5,     A         ;1
            POP      ACC               ;2
            POP      PSW               ;2
            RET                        ;2
;
;===============================================
;**********以下液晶开机显示程序**************
; A中为写入字位置
DATAUP:
        LCALL WRITE_COM
        MOV   R1,#DISDATA           ;将#DISDATA数据查出字码写入LCD
        MOV   DPTR,#TABLE1
        MOV   R2,#03H          ; 查3
        MOV   A,#00H
MOVCLOP:MOV   A,@R1            ;
        MOVC  A,@A+DPTR
        LCALL WRITE_DAT
        INC   R1
        DJNZ  R2,MOVCLOP       ;
        RET
;
;***************开机显示画面***********************
LOGON:	MOV  A,#80H	       ;第一行左第一个字开始
	LCALL WRITE_COM
	MOV  DPTR,#CHINESE     ;WORD 16*16点阵TEST
	LCALL WRITE_HZ
        MOV  A,#90H	       ;第二行左第一个字开始
	LCALL WRITE_COM
	MOV  DPTR,#CHINESE1    ;WORD 16*16点阵TEST
	LCALL WRITE_HZ
        CLR   LAMPBLAK         ;开背光灯
        LCALL DELAY5S          ;显示5秒
        SETB  LAMPBLAK         ;关背光灯
        ;
        MOV  A,#80H	       ;第一行左第一个字开始
	LCALL WRITE_COM
	MOV  DPTR,#CHINESE2     ;WORD 16*16点阵TEST
	LCALL WRITE_HZ
        MOV  A,#90H	       ;第二行左第一个字开始
	LCALL WRITE_COM
	MOV  DPTR,#CHINESE3    ;WORD 16*16点阵TEST
	LCALL WRITE_HZ
        RET
;**********初始化程序*************
SETUP:
	MOV  A,#01H		;CLEAR DISPLAY
	LCALL WRITE_COM
	MOV  A,#00110000B	;FUNCTION SETTING
	LCALL WRITE_COM
	MOV  A,#00000010B	;DDRAM SET TO '00H'
	LCALL WRITE_COM
	MOV  A,#00000100B	;
	LCALL WRITE_COM
	MOV  A,#00001100B	;DISPLAY ON
	LCALL WRITE_COM
	MOV  A,#00000001B	;CLEARING SCREEN
	LCALL WRITE_COM
	MOV  A,#10000000B	;SET DDRAM ADDRESS
	LCALL WRITE_COM
        LCALL DELAY
	LCALL DELAY
	LCALL DELAY
        LCALL DELAY
	RET
;************串行命令写入子程序****************
;写入命令字在A中
WRITE_COM:
	        LCALL DELAY1		;
                SETB  CS
		PUSH  ACC
		MOV  R0,#8
		MOV  A,#11111000B
COMM1:
                CLR  C
		RLC  A
		MOV  SID,C
		CLR  SCLK
                SETB SCLK
 		DJNZ R0,COMM1
		POP  ACC
		MOV  R5,A
		ANL  A,#0F0H
		MOV  R0,#8
COMM2:	        CLR  C
		RLC  A
		MOV  SID,C
		CLR  SCLK
		SETB SCLK
		DJNZ R0,COMM2
		MOV  A,R5
		SWAP A
		ANL  A,#0F0H
		MOV  R0,#8
COMM3:	        CLR  C
		RLC  A
		MOV  SID,C
		CLR  SCLK
		SETB SCLK
		DJNZ R0,COMM3
		CLR  CS
	        RET
;
;***********串行数据写入子程序****************
;写入数据字在A中
WRITE_DAT:
		LCALL DELAY1
                SETB CS
		PUSH  ACC
		MOV  R0,#8
		MOV  A,#11111010B
DATA1:	        CLR  C
		RLC  A
		MOV  SID,C
		CLR  SCLK
		SETB SCLK
		DJNZ R0,DATA1
		POP  ACC
		MOV  R5,A
		ANL  A,#0F0H
		MOV  R0,#8
DATA2:	        CLR  C
		RLC  A
		MOV  SID,C
		CLR  SCLK
		SETB SCLK
		DJNZ R0,DATA2
		MOV  A,R5
		SWAP A
		ANL  A,#0F0H
		MOV  R0,#8
DATA3:	        CLR  C
		RLC  A
		MOV  SID,C
		CLR  SCLK
		SETB SCLK
		DJNZ R0,DATA3
		CLR  CS
	        RET
;
;**************延时子程序**********************
;0.544ms
DELAY1:
	MOV  R7,#010H
D11:	MOV  R6,#010H
	DJNZ R6,$
	DJNZ R7,D11
	RET
;0.13s
DELAY:
	MOV  R1,#00H
D2:	MOV  R2,#00H
	DJNZ R2,$
	DJNZ R1,D2
	RET
;5.2s
DELAY5S:MOV  R3,#28H
DE5S:   LCALL DELAY
        DJNZ R3,DE5S
        RET
DELAY1S:MOV  R3,#9
DE1S:   LCALL DELAY
        DJNZ R3,DE1S
        RET
;
;************16*8点阵字写入子程序共16个******************
WRITE_ASCII:
		MOV  R4,#16
DDDD:	        CLR  A
		MOVC A,@A+DPTR
		LCALL WRITE_DAT
		INC  DPTR
		DJNZ R4,DDDD
		RET
;************16*8点阵字写入子程序共7个******************
WRITE_ASCII7:
		MOV  R4,#7
DDDD7:	        MOV  A,@R0
		LCALL WRITE_DAT
		INC  R0
                DJNZ R4,DDDD7
		RET
;************16*16点阵汉字写入子程序共7个***********
WRITE_HZ:		;WRITE 7 CHINESE TO LCD
		MOV  R4,#7
DD:	        CLR  A
		MOVC A,@A+DPTR
		INC  DPTR
		LCALL WRITE_DAT
		CLR  A
		MOVC A,@A+DPTR
		INC DPTR
		LCALL WRITE_DAT
		DJNZ R4,DD
		RET
;************16*16点阵汉字写入子程序共2个***********
WRITE_HZ2:		;WRITE 8 CHINESE TO LCD
		MOV  R4,#2
DD4:	        CLR  A
		MOVC A,@A+DPTR
		INC  DPTR
		LCALL WRITE_DAT
		CLR  A
		MOVC A,@A+DPTR
		INC DPTR
		LCALL WRITE_DAT
		DJNZ R4,DD4
		RET
;
;*****************************16*8点阵的字符代码表**********************************
TABLE1: DB     30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH,20H
;               0   1   2   3   4   5   6   7   8   9   :   ;   <   =   > "不显"
;**********************************自造字符地址表***********************************
;
;******************"这里是16*16点阵的汉字代码表"************************************
CHINESE:  DB "浙江海洋学院—    "
CHINESE1: DB "单片机实验室      "
CHINESE2: DB "滚轮(Z):             "
CHINESE3: DB "X:    Y:          "
;;;;;;;;;;;;;;;;;;;;;;
END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -