MOV A,TEMPHC SWAP A
ANL A,#0FH
MOV 73H,#0AH ;符号位不显示 MOV 72H,A ;十位数显示符号 DISPBCD2: RET
;***************************************************************
; 温度显示子程序
;***************************************************************
;显示数据在70H - 73H 单元内,用4位共阳数码管显示,P0口输出段码数据, ;P2 口作扫描控制,每个 LED 数码管亮 2MS 时间再逐位循环。
DISP1: MOV R1,#70H ;指向显示数据首址 MOV R5,#7FH ;扫描控制字初值 PLAY: MOV P0,#0FFH
MOV A,R5 ;扫描字放入A MOV P2,A
MOV A,@R1 ;取显示数据到A MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码 MOV P0,A ;段码放入P0口 MOV A,R5
JB ACC.6,LOOP5 ;小数点处理 CLR P0.7
LOOP5: LCALL DL_MS ;显示2MS
INC R1 ;指向下一个地址 MOV A,R5 ;放回 R5 内
JNB ACC.3,ENDOUT ;ACC.3=0时一次显示结束 RR A ;A 中数据循环左移 MOV R5,A ;放入 R5 中
AJMP PLAY ;跳回 PLAY 循环
ENDOUT: MOV P0,#0FFH ;一次显示结束,P0口复位 MOV P2,#0FFH ;P2口复位 RET
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H ; “0\“1\“2\“3\“4\“5\“6\“7\“8\“9\“灭\“-\“L”“H\
DL_MS: MOV R6,#0AH ;2MS延时程序,LED 显示程序用 DL1: MOV R7,#64H
31
DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET
;****************************************************** ;单字节十六进制转 BCD
;****************************************************** HEX2BCD1: MOV B,#064H DIV AB MOV R7,A MOV A,#0AH XCH A,B
DIV AB SWAP A ORL A,B RET
;=============================================== ;报警值 TH、TL 数据转换
;=============================================== ALERT_TL:
MOV 79H,#0CH MOV 78H,#0BH MOV A,TEMP_TL MOV R0,#77H MOV B,#064H DIV AB
CJNE A,#01H,ALERT_TL1 MOV @R0,A
JMP ALERT_TL2
ALERT_TL1: MOV A,#0BH ;显示“-” MOV @R0,A ALERT_TL2: MOV A,#0AH XCH A,B DIV AB DEC R0 MOV @R0,A MOV 7DH,A DEC R0 MOV @R0,B MOV 7EH,B RET
;----------------------------------------------- ALERT_TH:
MOV 79H,#0DH
32
MOV 78H,#0BH MOV A,TEMP_TH MOV R0,#77H MOV B,#064H DIV AB
CJNE A,#01H,ALERT_TH1 MOV @R0,A
JMP ALERT_TH2
ALERT_TH1: MOV A,#0BH ;显示“-” MOV @R0,A ALERT_TH2: MOV A,#0AH XCH A,B DIV AB DEC R0 MOV @R0,A MOV 7DH,A DEC R0 MOV @R0,B MOV 7EH,B RET
;=============================================== ;动作温度设定值显示子程序
;=============================================== ALERT_PLAY:
MOV R1,#75H ;指向显示数据首址 MOV R5,#7FH ;扫描控制字初值 A_PLAY: MOV P0,#0FFH
MOV A,R5 ;扫描字放入A MOV P2,A
MOV A,@R1 ;取显示数据到A MOV DPTR,#ALERT_TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码 MOV P0,A ;段码放入P0口 LCALL DL_MS1 ;显示2MS
INC R1 ;指向下一个地址 MOV A,R5
JNB ACC.3,ENDOUT1
RR A ;A 中数据循环左移 MOV R5,A ;放入 R5 中
AJMP A_PLAY ;跳回 PLAY 循环
ENDOUT1: MOV P0,#0FFH ;一次显示结束,P0口复位 MOV P2,#0FFH ;P2口复位 RET
33
ALERT_TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H ;共阳段码表 “0\“1\“2\“3\“4\“5\“6\“7\“8\“9\“灭\“-\
DL_MS1: MOV R6,#0AH ;2MS延时程序,LED 显示程序用 ADL1: MOV R7,#64H ADL2: DJNZ R7,ADL2 DJNZ R6,ADL1 RET
;=============================================== ;蜂鸣器响一声子程序
;=============================================== BEEP_BL:
MOV R6,#100 BL2: CALL DEX1
CPL BEEP ;对 P3.7 取反 DJNZ R6,BL2 MOV R5,#10 CALL DELAY RET
DEX1: MOV R7,#180 DE2: NOP
DJNZ R7,DE2 RET
DELAY: ;(R5)*延时10MS MOV R6,#50 DEL1: MOV R7,#100 DJNZ R7,$ DJNZ R6,DEL1 DJNZ R5,DELAY RET
;================================================== END
34