📄 1
字号:
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 + -