;1602液晶模塊高精度4位小數顯示,溫度分辨率0.0625℃
;液晶模塊第一行顯示的是DS18B20的64位激光序列號
;液晶模塊第二行顯示的是實際溫度
ORG 0000H
AJMP START
ORG 0033H
START:
DQ BIT P3.3 ;此接DS18B20信號腳
RS BIT P2.0
RW BIT P2.1
E BIT P2.2
LED8P BIT P2.6
BLA BIT P2.7
LCD EQU P0
DS18B20 BIT 01H
TEMPERRB BIT 02H
TEMPSBIT BIT 03H
TEMPFH EQU 30H ;溫度符號位
TEMPBW EQU 31H ;溫度"百"位
TEMPSW EQU 32H ;溫度"十"位
TEMPGW EQU 33H ;溫度"個"位
TEMPXS1 EQU 34H ;溫度小數位第"1"位
TEMPXS2 EQU 35H ;溫度小數位第"2"位
TEMPXS3 EQU 36H ;溫度小數位第"3"位
TEMPXS4 EQU 37H ;溫度小數位第"4"位
TEMPXSD EQU 38H
TEMPZS EQU 39H
TEMPXS EQU 3AH
TEMPL EQU 3BH
TEMPH EQU 3CH
ID1 EQU 3DH
ID2 EQU 3EH
ID3 EQU 3FH
ID4 EQU 40H
ID5 EQU 41H
ID6 EQU 42H
ID7 EQU 43H
ID8 EQU 44H
DLCD1 EQU 46H
DLCD2 EQU 47H
DLCD3 EQU 48H
DLCD4 EQU 49H
DLCD5 EQU 4AH
DLCD6 EQU 4BH
DLCD7 EQU 4CH
DLCD8 EQU 4DH
DLCD9 EQU 4EH
DLCD10 EQU 4FH
DLCD11 EQU 50H
DLCD12 EQU 51H
DLCD13 EQU 52H
DLCD14 EQU 53H
DLCD15 EQU 54H
DLCD16 EQU 55H
;---------------------------------------------------------
MAIN: ACALL GETTEMP
JB DS18B20,MAIN1
AJMP MAIN
MAIN1:
CLR BLA ;開啟液晶背光
; SETB BLA ;關閉液晶背光
LCALL GETROM
LCALL DISPLCD
AJMP MAIN
DISPLCD: ;向1602液晶模塊寫入顯示信息
MOV P2,#0FFH
MOV LCD,#01H ;寫指令01H,清屏
LCALL ENABLE
MOV LCD,#38H ;寫指令38H,設定LCD為16*2顯示,5*7點陣,8位數據接口
LCALL ENABLE
MOV LCD,#0FH ;寫指令0FH,顯示ON,光標ON,閃爍ON
LCALL ENABLE
MOV LCD,#06H ;寫指令06H,光標輸入方式增量移位
LCALL ENABLE
MOV A,ID1
SWAP A
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD1,A
MOV A,ID1
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD2,A
MOV A,ID2
SWAP A
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD3,A
MOV A,ID2
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD4,A
MOV A,ID3
SWAP A
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD5,A
MOV A,ID3
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD6,A
MOV A,ID4
SWAP A
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD7,A
MOV A,ID4
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD8,A
MOV A,ID5
SWAP A
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD9,A
MOV A,ID5
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD10,A
MOV A,ID6
SWAP A
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD11,A
MOV A,ID6
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD12,A
MOV A,ID7
SWAP A
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD13,A
MOV A,ID7
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD14,A
MOV A,ID8
SWAP A
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD15,A
MOV A,ID8
ANL A,#0FH
MOV DPTR,#TABHEX
MOVC A,@A+DPTR
MOV DLCD16,A
;------- 液晶模塊顯示程序---------
MOV LCD,#80H ;第一行顯示第1個字符的位置
ACALL ENABLE
MOV R0,#DLCD1
CALL WRITE1
MOV LCD,#0C0h ;第二行位置
CALL ENABLE
MOV DLCD1,#20H
MOV DLCD2,#54H
MOV DLCD3,#45H
MOV DLCD4,#4DH
MOV DLCD5,#50H
MOV DLCD6,#3AH
MOV A,TEMPSW
ORL A,#00110000B
MOV DLCD7,A
MOV A,TEMPGW
ORL A,#00110000B
MOV DLCD8,A
MOV DLCD9,#2EH
MOV A,TEMPXS1
ORL A,#00110000B
MOV DLCD10,A
MOV A,TEMPXS2
ORL A,#00110000B
MOV DLCD11,A
MOV A,TEMPXS3
ORL A,#00110000B
MOV DLCD12,A
MOV A,TEMPXS4
ORL A,#00110000B
MOV DLCD13,A
MOV DLCD14,#0DFH
MOV DLCD15,#43H
MOV DLCD16,#20H
MOV R0,#DLCD1
CALL WRITE1
RET
ENABLE: ;寫命令時序
CLR RS
CLR RW
CLR E
; ACALL YS806U
MOV R7,#188
DJNZ R7,$
SETB E
RET
WRITE1: ;寫字符串
MOV R1,#16
A1: MOV A,@R0
CALL WRITE2
INC R0
DJNZ R1,A1
RET
WRITE2: ;寫單個字符
MOV LCD,A
SETB RS
CLR RW
CLR E
CALL DELAY1
SETB E
RET
DELAY1:
MOV R7,#1
D11: MOV R6,#18
D12: DJNZ R6,D12
DJNZ R7,D11
RET
;|------------------------------------------------|
;| 讀出DS18B20序列號應用程序
;|------------------------------------------------|
GETROM: CLR EA
LCALL INIT18B20
JB DS18B20,GETROM1
SETB EA
RET
GETROM1:MOV A,#33H
LCALL WRITE18B20 ;送入讀DS18B20的ROM命令
MOV R4,#8 ;從DS18B20中讀出8字節ROM數據
MOV R1,#ID1
LCALL READ18B20
SETB EA
RET
GETTEMP:CLR EA
LCALL INIT18B20 ;先復位DS18B20
JB DS18B20,TSS2
SETB EA
RET
TSS2: MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE18B20
MOV A,#44H ; 發出溫度轉換命令
LCALL WRITE18B20
LCALL YS800M ;延時0.8S,延時>750MS
LCALL INIT18B20
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE18B20
MOV A,#0BEH ;發出讀溫度命令
LCALL WRITE18B20
MOV R4,#2 ;從DS18B20中讀出2字節溫度數據
MOV R1,#TEMPL
LCALL READ18B20 ;讀溫度
SETB EA
DOTEMP: MOV TEMPXSD,#2EH
TESTS1: MOV A,TEMPH
ANL A,#11111000B
CJNE A,#0F8H,TESTS0
MOV TEMPFH,#0FFH
SETB TEMPSBIT
CLR TEMPERRB
LJMP DOTEMP1
TESTS0: CJNE A,#00H,TEMPERR
MOV TEMPFH,#00H
CLR TEMPSBIT
CLR TEMPERRB
LJMP DOTEMP1
TEMPERR:
SETB TEMPERRB
LJMP TEMPRET
DOTEMP1:
JNB TEMPSBIT,DOTEMP2
MOV A,TEMPH
CPL A
MOV TEMPH,A
MOV A,TEMPL
CPL A
CLR C
ADD A,#1
MOV TEMPL,A
MOV A,TEMPH
ADDC A,#00H
ANL A,#00000111B
MOV TEMPH,A
DOTEMP2:
MOV A,TEMPH
SWAP A
MOV TEMPH,A
MOV A,TEMPL
ANL A,#00001111B
MOV TEMPXS,A
MOV A,TEMPL
ANL A,#11110000B
SWAP A
MOV R1,TEMPH
ORL A,R1
MOV TEMPZS,A
HBCD:
MOV A,TEMPZS
MOV B,#100
DIV AB
MOV TEMPBW,A
MOV A,#10
XCH A,B
DIV AB
MOV TEMPSW,A
MOV A,B
MOV TEMPGW,A
FLXS: MOV R2,#4
MOV A,TEMPXS
ANL A,#00001111B
MOV B,#4
MUL AB
MOV R1,A
MOV R0,#TEMPXS1
FLXS1: MOV DPTR,#DISPXS
MOV A,R1
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC R1
DJNZ R2,FLXS1
TEMPRET:
SETB EA
RET
;-----------------------------------------------------
INIT18B20:
SETB DQ
NOP
CLR DQ
MOV R0,#107 ;主機發出延時537微秒的復位低脈沖[2]
MOV R1,#3
TSR1: DJNZ R0,TSR1
MOV R0,#107
DJNZ R1,TSR1
SETB DQ
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB DQ,TSR3
DJNZ R0,TSR2
AJMP TSR4
TSR3: SETB DS18B20
AJMP TSR5
TSR4: CLR DS18B20
AJMP TSR7
TSR5: MOV R0,#107
TSR6: DJNZ R0,TSR6
TSR7: SETB DQ
JNB DQ,$
RET
READ18B20:
MOV R2,#8
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#09
RE10: DJNZ R3,RE10
MOV C,DQ
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
INC R1
DJNZ R4,READ18B20
RET
;寫DS18B20的子程序
WRITE18B20:
MOV R2,#8
CLR C
WR18: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR18
SETB DQ
RET
DISPXS:
DB 00H,00H,00H,00H,00H,06H,02H,05H,01H,02H,05H,00H,01H,08H,07H,05H
DB 02H,05H,00H,00H,03H,01H,02H,05H,03H,07H,05H,00H,04H,03H,07H,05H
DB 05H,00H,00H,00H,05H,06H,02H,05H,06H,02H,05H,00H,06H,08H,07H,05H
DB 07H,05H,00H,00H,08H,01H,02H,05H,08H,07H,05H,00H,09H,03H,07H,05H
TABHEX: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H
;******** 延時程序 ********
YS806U: MOV R4,#19 ;延時806微秒
Y1: MOV R5,#18 ;[1]
DJNZ R5,$ ;[2]
DJNZ R4,Y1 ;[2]
RET ;[1]
YS4722U:MOV R4,#10 ;延時4722微秒
Y3: MOV R5,#216 ;[1]
DJNZ R5,$ ;[2]
DJNZ R4,Y3 ;[2]
RET ;[1]
;********** 10ms延時程序 ***********
YS10MS: MOV R7,#128
DL1: MOV R6,#0FFH
DL0: DJNZ R6,DL0
DJNZ R7,DL1
RET
YS118M: MOV R1,#25 ;延時118MS
Y5: ACALL YS4722U
DJNZ R1,Y5
RET
YS500M: MOV R3,#40 ;延時1000MS
Y5_1: MOV R4,#10 ;[1]延時5MS
Y5_2: MOV R5,#228 ;[1]
DJNZ R5,$ ;[2]
DJNZ R4,Y5_2 ;[2]
DJNZ R3,Y5_1 ;[2]
RET ;[1]
YS800M: MOV R3,#45
YYSS1:
; LCALL DISP
DJNZ R3,YYSS1
RET
YS1000M:MOV R3,#200 ;延時1000MS
Y4_1: MOV R4,#10 ;[1]延時5MS
Y4_2: MOV R5,#228 ;[1]
DJNZ R5,$ ;[2]
DJNZ R4,Y4_2 ;[2]
DJNZ R3,Y4_1 ;[2]
RET ;[1]
;******* 按鍵音效延時(50ms)子程序 *******
SOUND: MOV R7,#228
SDL1: CPL p3.7
MOV R6,#0FFH
SDL0: DJNZ R6,SDL0
DJNZ R7,SDL1
RET
END
|