?? 18b20溫度時間顯示鍵盤設置1113.asm
字號:
;年設置
mov 4dh,#3ch
MOV A,#85H ;DDRAM第1行首地址
ACALL WRI
MOV A,#3ch ;寫修改標志
LCALL WRD
lcall timeset5 ;年設置
mov 4dh,#2fh
MOV A,#85H ;DDRAM第1行首地址
ACALL WRI
MOV A,#2fh ;清修改標志
LCALL WRD
lcall write12c887
setb ea
reti
;時間設置子程序,按p2.0退出
timeset1:jb p2.2,inctime ;分減1
;jnb p2.2,$
acall dl3
jb p2.2,inctime
mov a,42h
cjne a,#30h,decminite1 ;判斷分是否為零
mov 42h,#39h
mov a,43h
cjne a,#30h,decminite10 ;判斷十分位,為0則小時減一
mov 43h,#35h
ajmp decdisplay
decminite1:dec 42h
ajmp decdisplay
decminite10:dec 43h
decdisplay:
lcall displayline1 ;送液晶顯示
jb p2.0,timeset1
jnb p2.0,$
lcall dl1
ret
inctime:jb p2.3,timeset1back ;分加1
acall dl3
jb p2.3,timeset1back
mov a,42h
cjne a,#39h,incminite1
mov 42h,#30h
mov a,43h
cjne a,#35h,incminite10
mov 43h,#30h
ljmp incdisplay
incminite1:inc 42h
ajmp incdisplay
incminite10:inc 43h
incdisplay: lcall displayline1
timeset1back:jb p2.0,cintinuetimeset
jnb p2.0,$
lcall dl1
timesetback:ret
cintinuetimeset:ljmp timeset1
;小時設置子程序
timeset2:jb p2.2,inchour ;分減1
acall dl3
jb p2.2,inchour
mov a,45h
cjne a,#30h,dechour1
mov a,46h
cjne a,#30h,dechour10
mov 45h,#33h
mov 46h,#32h
ljmp sethourdisplay
dechour1:dec 45h
ljmp sethourdisplay
dechour10:dec 46h
mov 45h,#39h
ljmp sethourdisplay
inchour:jb p2.3,timeset2back ;小時加1
acall dl3
jb p2.3,timeset2back
mov a,45h
cjne a,#33h,inchour1
mov a,46h
cjne a,#30h,inchourcontinue1
inc 45h
ljmp sethourdisplay
inchourcontinue1:cjne a,#31h,inchourcontinue2
inc 45h
ljmp sethourdisplay
inchourcontinue2:mov 45h,#30h
mov 46h,#30h
ljmp sethourdisplay
inchour1:inc 45h
sethourdisplay:lcall displayline1
timeset2back: jb p2.0,timeset2
jnb p2.0,$
lcall dl1
ret
;日設置子程序
timeset3:jb p2.2,incday ;日減1
acall dl3
jb p2.2,incday
mov a,48h
cjne a,#30h,decday1
mov a,49h
cjne a,#30h,decday10
mov 48h,#30h
mov 49h,#33h
ajmp setdaydisplay
decday1:dec 48h
ajmp setdaydisplay
decday10:dec 49h
mov 48h,#39h
ajmp setdaydisplay
incday: jb p2.3,timeset3back ;日期加1
acall dl3
jb p2.3,timeset3back
mov a,49h
cjne a,#33h,incdaynext1
mov 49h,#30h
mov 48h,#30h
ajmp setdaydisplay
incdaynext1:mov a,48h
cjne a,#39h,incday1
mov 48h,#30h
inc 49h
ajmp setdaydisplay
incday1:inc 48h
ajmp setdaydisplay
setdaydisplay:lcall displayline1
timeset3back:jb p2.0,timeset3
jnb p2.0,$
lcall dl1
ret
;月份設置子程序
timeset4:jb p2.2,incmonth ;月減1
acall dl3
jb p2.2,incmonth
mov a,4bh
cjne a,#30h,decmonth1
mov a,4ch
cjne a,#30h,decmonth10
mov 4bh,#32h
mov 4ch,#31h
ajmp setmonthdisplay
decmonth1:dec 4bh
ajmp setmonthdisplay
decmonth10:dec 4ch
mov 4bh,#39h
ajmp setmonthdisplay
incmonth:jb p2.3,timeset4back ;月加1
acall dl3
jb p2.3,timeset4back
mov a,4ch
cjne a,#31h,incmonth0
mov a,4bh
cjne a,#32h,incmonth1
mov 4ch,#30h
mov 4bh,#30h
ajmp setmonthdisplay
incmonth0:
mov a,4bh
cjne a,#39h,incmonth1
mov 4ch,#31h
mov 4bh,#30h
ajmp setmonthdisplay
incmonth1:inc 4bh
ajmp setmonthdisplay
setmonthdisplay:lcall displayline1
timeset4back: jb p2.0,timeset4
jnb p2.0,$
lcall dl1
ret
;年設置子程序
timeset5:jb p2.2,incyear ;年減1
acall dl3
jb p2.2,incyear
mov a,4eh
cjne a,#30h,decyear1
mov a,4fh
cjne a,#30h,decyear10
mov 4eh,#39h
mov 4fh,#39h
ajmp setyeardisplay
decyear1:dec 4eh
ajmp setyeardisplay
decyear10:dec 4fh
ajmp setyeardisplay
incyear:jb p2.3,timeset5back ;年加1
acall dl3
jb p2.3,timeset5back
mov a,4eh
cjne a,#39h,incyear1
mov 4eh,#30h
mov a,#4fh
cjne a,#39h,incyear10
mov 4eh,#30h
ajmp setyeardisplay
incyear1:inc 4eh
ajmp setyeardisplay
incyear10:inc 4fh
ajmp setyeardisplay
setyeardisplay:lcall displayline1
timeset5back: jb p2.0,timeset5
jnb p2.0,$
lcall dl1
ret
;溫度報警設置子程序
int1reset:lcall tempsetdisplay
jb p2.2,int1next0
dec r1
jnb p2.2,$
ajmp int1reset
int1next0:jb p2.3,int1next1
inc r1
jnb p2.3,$
ajmp int1reset
int1next1:jb p2.1,int1reset
jnb p2.1,$
ret
tempsetdisplay:
MOV DPTR,#TEMP_TAB ;將r1中溫度轉換成bcd碼
mov a,r1
MOVC A,@A+DPTR
mov r2,a
swap a
anl a,#0fh
mov dptr,#asc11
movc a,@a+dptr
mov 24h,a
mov a,r2
anl a,#0fh
mov dptr,#asc11
movc a,@a+dptr
mov 25h,a
lcall wriline2
ret
write12c887: mov dptr,#8f0bh
mov a,#82h
movx @dptr,a
mov a,43h ;minite
anl a,#0fh
swap a
anl 42h,#0fh
orl a,42h
mov dptr,#8f02h
movx @dptr,a
mov a,46h ;hour
anl a,#0fh
swap a
anl 45h,#0fh
orl a,45h
mov dptr,#8f04h
movx @dptr,a
mov a,49h ;day
anl a,#0fh
swap a
anl 48h,#0fh
orl a,48h
mov dptr,#8f07h
movx @dptr,a
mov a,4ch ;month
anl a,#0fh
swap a
anl 4bh,#0fh
orl a,4bh
mov dptr,#8f08h
movx @dptr,a
mov a,4fh ;year
anl a,#0fh
swap a
anl 4eh,#0fh
orl a,4eh
mov dptr,#8f09h
movx @dptr,a
mov dptr,#8f0bh
mov a,#12h ;初始化b
movx @dptr,a
ret
;------------------重新寫DS18B20暫存存儲器設定值
RE_CONFIG:
LCALL INIT_1820
JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,轉RE_CONFIG1
LJMP RE_CONFIG
RE_CONFIG1:
MOV A,#0CCH ; 發SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 發寫暫存存儲器命令
LCALL WRITE_1820
MOV A,TEMPER_L ; TH(報警上限)中寫入1820
LCALL WRITE_1820
MOV A,TEMPER_H; TL(報警下限)中寫入1820
LCALL WRITE_1820
MOV A,#7FH ; 選擇12位溫度分辨率
LCALL WRITE_1820
;將溫度報警值考入e2prom
RE_CONFIG2:LCALL INIT_1820
JB FLAG1,RE_CONFIG3 ; 若DS18B20存在,轉RE_CONFIG1
LJMP RE_CONFIG2
RE_CONFIG3:
MOV A,#0CCH ; 發SKIP ROM命令
LCALL WRITE_1820
mov a,#48h
lcall write_1820
lcall write1820delay
RET
WRI:
CLR p2.4
clr p2.5
;MOV A,R3
MOV P1,A
SETB p2.6
ACALL DL1
CLR p2.6
RET
WRD: SETB p2.4
CLR p2.5
MOV P1,A
SETB p2.6
ACALL DL1
CLR p2.6
RET
;------------------延時子程序
DELAY:MOV R7,#00H
MIN: DJNZ R7,YS500
RET
YS500:LCALL YS500US
LJMP MIN
YS500US:MOV R6,#00H
DJNZ R6,$
RET
DELAY1:MOV R7,#20H
DJNZ R7,$
RET
;將報警溫度值重新裝入1820,延時
write1820delay:
mov r2,#0ffh
write1820delay1:
mov r3,#0ffh
djnz r3,$
djnz r2,write1820delay1
ret
DL1: MOV R2,#0aH
DL2: MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,DL2
RET
dl3: mov r2,#0ffh
dl4: mov r3,#0ffh
djnz r3,$
djnz r2,dl4
ret
TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
CHATAB:
DB 54H,45H,4DH,50H,3aH
ASC11 :DB 30H,31H,32H,33H,34H ;ASC表0-9
DB 35H,36H,37H,38H,39H
;***************************************************************************************
;*** 雙字節二進制整數轉換成BCD碼子程序 ****
;*** 把R4R5中的雙字節二進制整數轉換成5位BCD碼放在(R0)指向的5個字節中 ****
;*** 入口:R4R5中存放雙字節二進制整數,(R0+4)(R0+3)(R0+2)(R0+1)(R0)=XXXXX ****
;*** 出口:5位BCD碼放在(R0)指向的內存單元中 ****
;*** 使用寄存器:A,B,R0,R2,R3,R6,R7,調用程序NDIV ****
;***************************************************************************************
IBID: MOV B,#5
MOV R6,#0
MOV R7,#10
IBTL1: MOV R2,#0
MOV R3,#0
PUSH B
LCALL NDIV
POP B
MOV A,R3
MOV @R0,A
INC R0
DJNZ B,IBTL1
RET
;***************************************************************************************
;*** (R2R3R4R5)/(R6R7)=(R4R5),余數在(R2R3)中,若(R2R3)>=(R6R7)則為溢出,置位F0 ****
;*** 入口:R2R3R4R5中存放被除數,R6R7中存放除數 ****
;*** 出口:商存放在R4R5中,余數存放在R2R3中 ****
;*** 使用寄存器:A,R1~R7,C,F0 ****
;***************************************************************************************
NDIV: MOV A,R3
CLR A
SUBB A,R7
MOV A,R2
SUBB A,R6
JNC NDVE1
MOV B,#16
NDVL1: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C
CLR C
SUBB A,R7
MOV R1,A
MOV A,R2
SUBB A,R6
JB F0,NDVM1
JC NDVD1
NDVM1: MOV R2,A
MOV A,R1
MOV R3,A
INC R5
NDVD1: DJNZ B,NDVL1
CLR F0
RET
NDVE1: SETB F0
RET
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -