📄 receiver.a51
字号:
INCLUDE REG_51.PDF
BUZZER EQU P3.1
D0 EQU P1.1
D1 EQU P1.0
D2 EQU P3.7
D3 EQU P3.0
VT EQU P3.5
; ***LCD CONTROL***
LCD_RS EQU P1.7 ;LCD REGISTER SELECT LINE
LCD_E EQU P1.6 ;LCD ENABLE LINE
LCD_DB4 EQU P1.5 ;PORT 1 IS USED FOR DATA
LCD_DB5 EQU P1.4 ;USED FOR DATA
LCD_DB6 EQU P1.3 ;FOR DATA
LCD_DB7 EQU P1.2 ;FOR DATA
; ***CURSOR CONTROL INSTRUCTIONS***
OFFCUR EQU 0CH
BLINKCUR EQU 0DH
; ***DISPLAY CONTROL INSTRUCTIONS***
CLRDSP EQU 01H
ONDSP EQU 0CH
; ***SYSTEM INSTRUCTIONS***
CONFIG EQU 28H ; 4-BIT DATA,2 LINES,5X7 MATRIX LCD
ENTRYMODE EQU 6 ; INCREMENT CURSOR DON'T SHIFT DISPLAY
DSEG ; This is internal data memory
ORG 20H ; Bit adressable memory
TEMPM: DS 1
FLAGS DATA 20H
D10 BIT FLAGS.0
D11 BIT FLAGS.1
D12 BIT FLAGS.2
D13 BIT FLAGS.3
FLAAGS: DS 1
STATUS BIT FLAAGS.2
STATUS1 BIT FLAAGS.3
VALUE_2: DS 1
VALUE_3: DS 1
BEATS: DS 1
VALU_1: DS 1
VALU_2: DS 1
CSEG AT 0 ; RESET VECTOR
;---------==========----------==========---------=========---------
; PROCESSOR INTERRUPT AND RESET VECTORS
;---------==========----------==========---------=========---------
ORG 00H ; Reset
;---------==========----------==========---------=========---------
MOV SP,#60H
CLR BUZZER
CALL RESETLCD4
CALL INITLCD4
CALL TITLES
CALL DELAYS
TGH: CALL READ
MOV A,FLAGS
CJNE A,#0DH,TGH
CALL MDELAY
CALL READ
CALL MDELAY
CALL READ
MOV VALUE_2,FLAGS
CALL MDELAY
CALL READ
MOV VALUE_3,FLAGS
CALL MDELAY
CALL READ
MOV A,FLAGS
CJNE A,#0EH,TGH
CALL MDELAY
CALL READ
MOV VALU_1,FLAGS
CALL MDELAY
CALL READ
MOV VALU_2,FLAGS
CALL MDELAY
CALL READ
CALL DISP_TEMP
MOV A,VALUE_2
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
MOV A,VALUE_3
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
CALL HEART_DISP
MOV A,VALU_1
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
MOV A,VALU_2
CJNE A,#0DH,RTY132
MOV A,#00H
MOV VALU_2,A
RTY132:
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
MOV A,VALUE_2
SWAP A
ORL A,VALUE_3
MOV TEMPM,A
MOV A,VALU_1
SWAP A
ORL A,VALU_2
MOV BEATS,A
CALL DELAY
CJNE A,#00H,RTY131
CLR STATUS
AJMP RTY25
RTY131:
MOV A,BEATS
CLR C
SUBB A,#80H
JNC DOWNS ;JMP IF ABNORMAL
MOV A,BEATS
CLR C
SUBB A,#65H
JC DOWNS ;JMP IF ABNORMAL
CLR STATUS
AJMP RTY25
DOWNS: SETB STATUS
RTY25: MOV A,TEMPM
CLR C
SUBB A,#40H
JNC DOWNSS ;JMP IF ABNORMAL
MOV A,TEMPM
CLR C
SUBB A,#27H
JC DOWNSS ;JMP IF ABNORMAL
CLR STATUS1
AJMP RTY22
DOWNSS: SETB STATUS1
RTY22: JB STATUS,ON_BUZZ
JB STATUS1,ON_BUZZ
CLR BUZZER
AJMP TOPPS
ON_BUZZ: SETB BUZZER
AJMP TOPPS
TOPPS:
CALL DELAYS
AJMP TGH
;##########################################################
READ: SETB VT
JNB VT,$
MOV FLAGS,#00H
SETB D0
JNB D0,OP1
SETB D10
OP1: SETB D1
JNB D1,OP2
SETB D11
OP2: SETB D2
JNB D2,OP3
SETB D12
OP3: SETB D3
JNB D3,OP4
SETB D13
OP4: JB VT,$
RET
;##########################################################
; DISPLAY ROUTINES
;##########################################################
TITLES:
MOV DPTR,#MSAG
CALL LCD_MSG
RET
MSAG:
DB 1H,81H,'* BIOMEDICAL *',0C1H,'MONITORING SYS',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISP_TEMP:
MOV DPTR,#MSAG1
CALL LCD_MSG
RET
MSAG1:
DB 1H,80H,'Temperature:+',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HEART_DISP:
MOV DPTR,#MSAG2
CALL LCD_MSG
RET
MSAG2:
DB 0C1H,'Heart Beat:',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DELAYSS:
MOV R0,#0BH
RV3: MOV R1,#0FFH
RV1: MOV R2,#0FFH
RV2: DJNZ R2,RV2
DJNZ R1,RV1
DJNZ R0,RV3
RET
;**************************************************
HEX2BCD:
MOV R3,#00D
MOV R4,#00D
MOV R5,#00D
MOV R6,#00D
MOV R7,#00D
MOV B,#10D
MOV A,R2
DIV AB
MOV R3,B ;
MOV B,#10 ; R7,R6,R5,R4,R3
DIV AB
MOV R4,B
MOV R5,A
CJNE R1,#0H,HIGH_BYTE ; CHECK FOR HIGH BYTE
SJMP ENDD
HIGH_BYTE:
MOV A,#6
ADD A,R3
MOV B,#10
DIV AB
MOV R3,B
ADD A,#5
ADD A,R4
MOV B,#10
DIV AB
MOV R4,B
ADD A,#2
ADD A,R5
MOV B,#10
DIV AB
MOV R5,B
CJNE R6,#00D,ADD_IT
SJMP CONTINUE
ADD_IT:
ADD A,R6
CONTINUE:
MOV R6,A
DJNZ R1,HIGH_BYTE
MOV B, #10D
MOV A,R6
DIV AB
MOV R6,B
MOV R7,A
ENDD: RET
; **********************************************************
; **********************************************************
;**********************************************************
; INITIALIZE THE LCD 4-BIT MODE
;**********************************************************
INITLCD4:
CLR LCD_RS ; LCD REGISTER SELECT LINE
CLR LCD_E ; ENABLE LINE
MOV R4, #CONFIG; FUNCTION SET - DATA BITS,
; LINES, FONTS
CALL WRLCDCOM4
MOV R4, #ONDSP ; DISPLAY ON
CALL WRLCDCOM4
MOV R4, #ENTRYMODE ; SET ENTRY MODE
CALL WRLCDCOM4 ; INCREMENT CURSOR RIGHT, NO SHIFT
MOV R4, #CLRDSP; CLEAR DISPLAY, HOME CURSOR
CALL WRLCDCOM4
RET
; **********************************************************
; SOFTWARE VERSION OF THE POWER ON RESET
; **********************************************************
RESETLCD4:
CLR LCD_RS ; LCD REGISTER SELECT LINE
CLR LCD_E ; ENABLE LINE
CLR LCD_DB7 ; SET BIT PATTERN FOR...
CLR LCD_DB6 ; ... POWER-ON-RESET
SETB LCD_DB5
SETB LCD_DB4
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #4 ; DELAY 4 MILLISECONDS
CALL MDELAY
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #1 ; DELAY 1 MILLISECOND
CALL MDELAY
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #1 ; DELAY 1 MILLISECOND
CALL MDELAY
CLR LCD_DB4 ; SPECIFY 4-BIT OPERATION
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #1 ; DELAY 1 MILLISECOND
CALL MDELAY
MOV R4, #CONFIG; FUNCTION SET
CALL WRLCDCOM4
MOV R4, #08H ; DISPLAY OFF
CALL WRLCDCOM4
MOV R4, #1 ; CLEAR DISPLAY, HOME CURSOR
CALL WRLCDCOM4
MOV R4,#ENTRYMODE ; SET ENTRY MODE
ACALL WRLCDCOM4
JMP INITLCD4
; **********************************************************
; SUB WRITES A COMMAND WORD TO THE LCD
; COMMAND MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDCOM4:
CLR LCD_E
CLR LCD_RS ; SELECT SEND COMMAND
PUSH ACC ; SAVE ACCUMULATOR
MOV A, R4 ; PUT DATA BYTE IN ACC
MOV C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS
MOV LCD_DB4, C ; ONE BIT AT A TIME USING...
MOV C, ACC.5 ; BIT MOVE OPERATOINS
MOV LCD_DB5, C
MOV C, ACC.6
MOV LCD_DB6, C
MOV C, ACC.7
MOV LCD_DB7, C
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
MOV C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE
MOV LCD_DB4, C
MOV C, ACC.1
MOV LCD_DB5, C
MOV C, ACC.2
MOV LCD_DB6, C
MOV C, ACC.3
MOV LCD_DB7, C
CLR LCD_E
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
CALL MADELAY
POP ACC
RET
; **********************************************************
; SUB TO WRITE A DATA WORD TO THE LCD
; DATA MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDDATA:
CLR LCD_E
SETB LCD_RS ; SELECT SEND DATA
PUSH ACC ; SAVE ACCUMULATOR
MOV A, R4 ; PUT DATA BYTE IN ACC
MOV C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS
MOV LCD_DB4, C ; ONE BIT AT A TIME USING...
MOV C, ACC.5 ; BIT MOVE OPERATOINS
MOV LCD_DB5, C
MOV C, ACC.6
MOV LCD_DB6, C
MOV C, ACC.7
MOV LCD_DB7, C
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
MOV C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE
MOV LCD_DB4, C
MOV C, ACC.1
MOV LCD_DB5, C
MOV C, ACC.2
MOV LCD_DB6, C
MOV C, ACC.3
MOV LCD_DB7, C
CLR LCD_E
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
NOP
NOP
POP ACC
RET
; **********************************************************
; SUB TAKES THE STRING IMMEDIATELY FOLLOWING THE CALL AND
; DISPLAYS ON THE LCD. STRING MUST BE TERMINATED WITH A
; NULL (0).
; **********************************************************
LCD_MSG:
CALL MDELAY
CLR A ; Clear Index
MOVC A,@A+DPTR ; Get byte pointed by Dptr
INC DPTR ; Point to the next byte
JZ LCD_Msg9 ; Return if found the zero (end of stringz)
CJNE A,#001H,Lcd_Msg1 ; Check if is a Clear Command
MOV R4,A
CALL WRLCDCOM4 ;If yes, write it as command to LCD
JMP LCD_MSG ;Go get next byte from stringz
Lcd_Msg1: CJNE A,#0FFH,FLL ;Check for displaying full character
MOV R4,A
CALL WRLCDDATA
JMP LCD_MSG
FLL: CJNE A,#080h,$+3 ; Data or Address? If => 80h then is address.
JC Lcd_Msg_Data ; Carry will be set if A < 80h (Data)
MOV R4,A
CALL WRLCDCOM4 ; Carry not set if A=>80, it is address
JMP Lcd_Msg ; Go get next byte from stringz
Lcd_Msg_Data: ;
MOV R4,A
CALL WRLCDDATA ; It was data, write it to Lcd
JMP Lcd_Msg ; Go get next byte from stringz
Lcd_Msg9:
RET ; Return to Caller
; **********************************************************
; 1 MILLISECOND DELAY ROUTINE
; **********************************************************
MDELAY:
PUSH ACC
MOV A,#30H
MD_OLP:
INC A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
JNZ MD_OLP
NOP
POP ACC
RET
MADELAY:
PUSH ACC
MOV A,#036H
MAD_OLP:
INC A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
JNZ MAD_OLP
NOP
POP ACC
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;**********************************************************
DELAY:
MOV R1,#0FFH
REP2: MOV R2,#0FFH
REP1: NOP
DJNZ R2,REP1
DJNZ R1,REP2
RET
;**********************************************************
DELAYS: ;One second delay routine
MOV R0,#05H
RS3: MOV R1,#0FFH
RA1: MOV R2,#0FFH
RS2: NOP
DJNZ R2,RS2
DJNZ R1,RA1
DJNZ R0,RS3
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -