📄 main monitor.asm
字号:
ORG 0000H
LJMP START
;LCD REGISTERS ADDRESS
LCD_CMD_WR EQU 0
LCD_DATA_WR EQU 1
LCD_BUSY_RD EQU 2
LCD_DATA_RD EQU 3
;LCD COMMANDS
LCD_CLR EQU 1
LCD_HOME EQU 2
LCD_SETMODE EQU 4
LCD_SETVISIBLE EQU 8
LCD_SHIFT EQU 16
LCD_SETFUNCTION EQU 32
LCD_SETCGADDR EQU 64
LCD_SETDDADDR EQU 128
;WAVE DATEA NUMBER
WAVE_NUM EQU 3
;FAULT DATA
FAULT_ADDR EQU 7FH
FAULT_NUM EQU 2FH
FAULT_DISP EQU 2EH
NUM_H EQU 2DH
NUM_L EQU 2CH
ORG 0040H
WAVE_DATA: DB 11H,22H,33H
STR_NUM: DB 'FaultNO:'
DB 0
STR_CODE: DB 'Fault'
DB 0
STR_COLON: DB ':'
DB 0
BCD_CODE: DB 01H,02H,04H,08H
DB 16H,32H,64H
ORG 0080H
START:MOV SP,#08H
MOV P1,#03H
MOV A,#38H
LCALL WRCMD
MOV A,#LCD_SETVISIBLE+6
LCALL WRCMD
;CLEAR RAM 30H~7FH
MOV R0,#7FH
MOV R1,#50H
MOV A,#00H
CLEAR:MOV @R0,A
DEC R0
DJNZ R1,CLEAR
MOV SCON,#94H
MOV PCON,#80H
SETB EA
SETB ES
;THE NUMBER OF FAULT DATA HAVE BEEN RECEIVED
MOV R7,#00H
MOV FAULT_NUM,#00H
MOV FAULT_DISP,#00H
MOV DPTR,#500
LCALL WTMS
CYCLE:MOV R1,#03H
TRANS:MOV SBUF,#0FFH
JNB TI,$
CLR TI
MOV R0,#00H
MOV DPTR,#WAVE_DATA
WAVE: CLR A
MOVC A,@A+DPTR
MOV SBUF,A
W1: JBC TI,W2
SJMP W1
W2: INC DPTR
INC R0
CJNE R0,#WAVE_NUM,WAVE
DJNZ R1,TRANS
MOV DPTR,#100
LCALL WTMS
;TRANSFORM 2 BYTES OF 01H TO COMMUNICATE
MOV R0,#02H
COMMU:MOV SBUF,#01H
COM1: JBC TI,COM2
SJMP COM1
COM2: DJNZ R0,COMMU
CLR P1.0
CLR P1.1
JNB RI,$
CLR RI
MOV A,SBUF
CJNE A,#01H,BACK
JNB RI,$
CLR RI
MOV A,SBUF
JZ BACK
MOV FAULT_NUM,A
MOV R0,#FAULT_ADDR
MOV R1,#03H
;THE NUMBER OF VALID FAULT DATA IN 3 RECEIVED ONES
MOV R6,#00H
SAVED:JNB RI,$
MOV A,SBUF
JZ SURE
INC R7
PUSH ACC
MOV A,R7
CJNE A,FAULT_NUM,LOP
SJMP SURE
LOP: POP ACC
MOV @R0,A
INC R6
DEC R0
DJNZ R1,SAVED
SURE: MOV A,R6
JZ RESET
LCALL DISPLAY
MOV A,R7
CJNE A,FAULT_NUM,BACK
RESET:MOV R7,#00H
BACK: MOV DPTR,#100
LCALL WTMS
LJMP CYCLE
;DISPLAY THE FAULT CODE HAVE JUST BEEN RECEIVED IN LCD
DISPLAY:MOV A,#LCD_CLR
ACALL WRCMD
MOV DPTR,#STR_NUM
ACALL WRSTR
MOV A,FAULT_NUM
ACALL WRNUM
MOV DPTR,#STR_CODE
ACALL WRSTR
MOV A,FAULT_DISP
INC A
ACALL WRNUM
MOV DPTR,#STR_COLON
ACALL WRSTR ;DISPLAY:
MOV A,#FAULT_ADDR
CLR C
SUBB A,FAULT_DISP
MOV R0,A
MOV A,@R0
ACALL WRNUM
INC FAULT_DISP
MOV DPTR,#500
ACALL WTMS
DJNZ R6,DISPLAY
RET
;TRANSFORM COMMANDS TO LCD
WRCMD: MOV R0,#LCD_CMD_WR
MOVX @R0,A
JMP RDBUSY
;QUERY THE STATE OF LCD TO MAKE SURE IT'S UNBUSY
RDBUSY: MOV R1,#LCD_BUSY_RD
MOVX A,@R1
JB ACC.7,RDBUSY
RET
;DISPLAY STRINGS
WRSTR: MOV R0,#LCD_DATA_WR
WS1: CLR A
MOVC A,@A+DPTR
JZ OVER
MOVX @R0,A
INC DPTR
ACALL RDBUSY
SJMP WS1
OVER: RET
;DISPLAY NUMBER IN ACC
WRNUM: MOV R0,#LCD_DATA_WR
ACALL TOASCII
MOV A,NUM_H
MOVX @R0,A
ACALL RDBUSY
MOV A,NUM_L
MOVX @R0,A
ACALL RDBUSY
RET
;TRANSFORM THE NUMBER IN ACC TO ASCII CODE
TOASCII:MOV R1,#07H ;COUNTER
MOV R0,#00H ;ADDRESS OFFSET
MOV R2,#00H ;SAVE THE BCD NUMBER
MOV R3,#04H ;TIME OF SHIFTING NUMBER
TOA1: RRC A
JNC TOA2
PUSH ACC
MOV DPTR,#BCD_CODE
MOV A,R0
MOVC A,@A+DPTR
ADD A,R2
DA A
MOV R2,A
POP ACC
TOA2: INC R0
DJNZ R1,TOA1
MOV A,R2
ANL A,#0FH
ADD A,#30H ;30H IS THE ASCII CODE OF 0
MOV NUM_L,A
MOV A,R2
TOA3: RR A
DJNZ R3,TOA3
ANL A,#0FH
ADD A,#30H ;30H IS THE ASCII CODE OF 0
MOV NUM_H,A
RET
;WAIT FOR NUMBER OF MILLISECONDS IN DPTR
WTMS: XRL DPH,#0FFH
XRL DPL,#0FFH
INC DPTR
WT1: MOV TH0,#0FCH ;1000'COMPLEMENT NUMBER IS 0FC18H
MOV TL0,#018H
MOV TMOD,#01H
SETB TCON.4
WT2: JNB TCON.5,WT2
CLR TCON.4
CLR TCON.5
INC DPTR
MOV A,DPL
ORL A,DPH
JNZ WT1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -