?? yaokongrili.asm
字號:
mov r0,#32h
tsr2:
jnb date_line,tsr3 ;等待DS18B20回應
djnz r0,tsr2
jmp tsr4 ; 延時
tsr3:
setb f1 ; 置標志位,表示DS1820存在
jmp tsr5
tsr4:
clr f1 ; 清標志位,表示DS1820不存在
jmp tsr7
tsr5:
mov r0,#06bh
tsr6:
djnz r0,$ ; 時序要求延時一段時間
tsr7:
setb date_line
ret
;WRITE DS18B20 2007-05-28>>MON
DSWR:
mov r2,#8 ;一共8位數據
CLR C
wr1:
clr date_line ;開始寫入DS18B20總線要處于復位(低)狀態
mov r3,#07
djnz r3,$ ;總線復位保持16微妙以上
rrc a ;把一個字節DATA 分成8個BIT環移給C
mov date_line,c ;寫入一個BIT
mov r3,#3CH
djnz r3,$ ;等待100微妙
setb date_line ;重新釋放總線
nop
djnz r2,wr1 ;寫入下一個BIT
setb date_line
ret
;READ DS18B20
DSRE:
mov r4,#2 ; 將溫度低位、高位、TH、TL從DS18B20中讀出
mov r1,#TEMPL ; 存入25H、26H、27H、28H
re00:
mov r2,#8
re01:
clr cy
setb date_line
nop
nop
clr date_line ;讀前總線保持為低
nop
nop
nop
setb date_line ;開始讀總線釋放
mov r3,#09 ;延時18微妙
djnz r3,$
mov c,date_line ;從DS18B20總線讀得一個BIT
mov r3,#3CH
djnz r3,$ ;等待100微妙
rrc a ;把讀得的位值環移給A
djnz r2,re01 ;讀下一個BIT
mov @r1,a
inc r1
djnz r4,re00
LCALL TRAN ;溫度轉換子程序
RET
TRAN:
mov A,TEMPH
ANL A,#0F0H
CJNE A,#0F0H,ZDATA ;判斷溫度是零上還是零下
MOV A,TEMPH ;高位取反
CPL A
MOV TEMPH,A
MOV A,TEMPL ;低位取反加1
CPL A
ADD A,#1
MOV TEMPL,A
lJMP ZFDATA
ZDATA:
MOV A,TEMPL ;零上溫度處理程序
ANL A,#0F0H
MOV TEMP_BUF,A
MOV A,TEMPH ;30H 存放溫度低位數據,31H 存放溫度高位數據
ANL A,#07H
ORL A,TEMP_BUF
SWAP A
MOV B,#10
DIV AB
MOV TEMP_UNIT,B ;
CJNE A,#10,TEMP_TH ;判斷溫度是否大于100攝氏度
TEMP_TH:
JNC TEMP_TH_RE
MOV TEMP_TEN,A ;溫度小于100攝氏度,正常顯示
AJMP OVER
TEMP_TH_RE:
MOV TEMP_TEN,#9 ;溫度大于100攝氏度,顯示99.9'C
MOV TEMP_UNIT,#9
MOV TEMP_DEC,#9
AJMP TEMP_OUT
OVER: ;小數點后兩位處理程序
MOV DPTR,#TABB
MOV A,TEMPL
ANL A,#0FH
MOVC A,@A+DPTR
MOV TEMP_DEC,A
TEMP_OUT:
MOV A,TEMP_TEN ;消隱,溫度十位0
CJNE A,#00H,TEMP_OUT1
MOV TEMP_TEN,#0AH
TEMP_OUT1:
RET
ZFDATA:
MOV A,TEMPL ;零下溫度處理程序
ANL A,#0F0H
MOV TEMP_BUF,A
MOV A,TEMPH ;
ANL A,#07H
ORL A,TEMP_BUF
SWAP A
MOV B,#10
DIV AB
CJNE A,#1,TEMP_TL ;判斷溫度是否低于零下10攝氏度
TEMP_TL:
JNC TEMP_TL_RE
MOV TEMP_TEN,#0BH ;溫度高于零下10攝氏度,顯示正常溫度
MOV A,B
MOV TEMP_UNIT,A
AJMP TEMP_TL_ON
TEMP_TL_RE:
MOV TEMP_TEN,#0BH ;溫度低于零下10攝氏度,顯示-9.9'C
MOV TEMP_UNIT,#09H
MOV TEMP_DEC,#09H
AJMP TEMP_OUT
TEMP_TL_ON:
LJMP OVER
TABB: DB 0, 0, 1, 1, 2, 3, 3, 4, 5
;小數位數 0 1 2 3 4 5 6 7 8
DB 5, 6, 6, 7, 8, 8, 9,
; 9 A B C D E F
;=================================================
; 遙控器IR 譯碼子程序
;中斷服務程序
;=================================================
INT:
CLR EA ;暫時關閉CPU的所有中斷請求
PUSH ACC
PUSH PSW
SETB PSW.4 ;選擇工作寄存器組2
CLR PSW.3
MOV R0,#IRCOM
MOV R1,#04H
I1:
JNB IRIN,I2 ;等待 IR 信號出現
DJNZ R1,I1
JMP IR_OUT
I2:
MOV R4,#20
I20:
CALL DEL
DJNZ R4,I20
JB IRIN,I1 ;確認IR信號出現
I21:
JB IRIN,I3 ;等 IR 變為高電平
CALL DEL
JMP I21
I3:
MOV R3,#0 ;8位數清為0
LL:
JNB IRIN,I4 ;等 IR 變為低電平
CALL DEL
JMP LL
I4:
JB IRIN,I5 ;等 IR 變為高電平
CALL DEL
JMP I4
I5:
MOV R2,#0 ;0.14ms 計數
L1:
CALL DEL
JB IRIN, N1 ;等 IR 變為高電平
;IR=0,檢查R2中的計數值
MOV A,#8 ;
CLR C
SUBB A,R2 ;判斷高低位
;IF C=0 BIT=0
MOV A,@R0
RRC A
MOV @R0,A ;處理完一位
INC R3
CJNE R3,#8,LL ;需處理完8位
MOV R3,#0
INC R0
CJNE R0,#2CH,LL ;收集到4字節了
JMP IR_SHOW
N1:
INC R2
CJNE R2,#30,L1 ;0.14ms 計數過長則時間到自動離開
IR_OUT:
CLR PSW.4
POP PSW
POP ACC
SETB EA
RETI
IR_SHOW:
CLR PSW.4
MOV A,2AH
CPL A ;將22H取反后和23H比較
CJNE A,2BH,IR_SHOW1 ;如果不等表示接收數據發生錯誤,放棄。
CALL DO
IR_SHOW1:
JMP IR_OUT
; ***************************
; * 遙控器按鍵處理程序 *
; ***************************
DO:
JB CHOICE_ADJ,DO_EXIT ;
MOV A,2AH ;開啟,關閉整機
CJNE A,#16H,DO_A_0
CPL TURNOFF
JB TURNOFF,GOGO
LCALL ON_DISPLAY
SETB LED2
AJMP GOGO1
GOGO:
CLR LED2
GOGO1:
RET
DO_A_0:
CJNE A,#10H,DO_0 ;關閉/開啟秒鐘閃爍功能
CPL CLOSE_DIS
JNB CLOSE_DIS,TUON_LED
SETB TR0
SETB ET0
AJMP DO_OFLED
TUON_LED:
CLR TR0
CLR ET0
CLR LED1
DO_OFLED:
RET
DO_EXIT:
CLR HOURFLASH
CLR DAYFLASH
CLR MONTHFLASH
CLR YEARFLASH
CLR YEARBIT
CLR MONTHBIT
CLR DAYBIT
CLR HOURBIT
CLR MINUTEBIT
CLR ET1
CLR TR1
RETI
DO_0:
CJNE A,#0FFH,DO_1 ;遙控進入調整狀態
CPL CON_ADJ
JNB CON_ADJ,CLOSE_CON
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允許寫1302
LCALL WRITE
SETB ET1 ;打開定時器0中斷入口
SETB TR1 ;打開定時器0
AJMP CON_ADJ_OUT
CLOSE_CON:
;MOV DS1302_ADDR,#80H
;MOV DS1302_DATA,#00H ;1302開始振蕩
;LCALL WRITE
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#80H ;禁止寫1302
LCALL WRITE
AJMP DO_EXIT
CON_ADJ_OUT:
RET
DO_1:
JNB CON_ADJ,DO_EXIT
CJNE A,#12H,SHUNXU
MOV DS1302_ADDR,#80H
MOV DS1302_DATA,#00H ;1302開始振蕩
LCALL WRITE
RET
;-------------------------------------------------
SHUNXU:
CJNE A,#1BH,DO_2
JNB YEARBIT,SHUNXU_1 ;順序閃爍調整
JNB MONTHBIT,SHUNXU_2
JNB DAYBIT,SHUNXU_3
JNB HOURBIT,SHUNXU_4
AJMP SHUNXU_5
SHUNXU_1:
SETB YEARBIT ;順序月閃爍
SETB YEARFLASH
CLR MONTHBIT
RET
SHUNXU_2:
SETB MONTHBIT ;順序日閃爍
SETB MONTHFLASH
CLR DAYBIT
RET
SHUNXU_3:
SETB DAYBIT ;順序時閃爍
SETB DAYFLASH
CLR HOURBIT
RET
SHUNXU_4:
SETB HOURBIT
SETB HOURFLASH ;順序分閃爍
CLR MINUTEBIT
RET
SHUNXU_5:
RET
;-------------------------------------------------
DO_2:
CJNE A,#1FH,DO_3 ;逆序閃爍調整
JNB YEARBIT,NIXU_1
JNB MONTHBIT,NIXU_2
JNB DAYBIT,NIXU_3
JNB HOURBIT,NIXU_4
AJMP NIXU_5
NIXU_1:
CLR YEARFLASH ;逆序年閃爍
RET
NIXU_2:
CLR YEARBIT ;逆序年閃爍
CLR YEARFLASH
RET
NIXU_3:
CLR MONTHBIT ;逆序月閃爍
CLR MONTHFLASH
RET
NIXU_4:
CLR DAYBIT ;逆序日閃爍
CLR DAYFLASH
RET
NIXU_5:
CLR HOURBIT ;逆序時閃爍
CLR HOURFLASH
RET
;-------------------------------------------------
DO_3:
CJNE A,#1AH,DO_4 ;加法調整程序
JNB YEARBIT,CON_ADD_YEAR
JNB MONTHBIT,CON_ADD_MONTH
JNB DAYBIT,CON_ADD_DAY
JNB HOURBIT,CON_ADD_HOUR
JNB MINUTEBIT,CON_ADD_MINU
;-------------------------------------------------
DO_4:
CJNE A,#1EH,DO_OUT ;減法調整程序
JNB YEARBIT,CON_DEC_YEAR
JNB MONTHBIT,CON_DEC_MONTH
JNB DAYBIT,CON_DEC_DAY
JNB HOURBIT,CON_DEC_HOUR
JNB MINUTEBIT,CON_DEC_MINU
RET
DO_OUT:
RET
;-------------------------------------------------
CON_ADD_YEAR:
AJMP ADD_YEAR
CON_ADD_MONTH:
AJMP ADD_MONTH
CON_ADD_DAY:
AJMP ADD_DAY
CON_ADD_HOUR:
AJMP ADD_HOUR
CON_ADD_MINU:
AJMP ADD_MINU
;-------------------------------------------------
CON_DEC_YEAR:
AJMP DEC_YEAR
CON_DEC_MONTH:
AJMP DEC_MONTH
CON_DEC_DAY:
AJMP DEC_DAY
CON_DEC_HOUR:
AJMP DEC_HOUR
CON_DEC_MINU:
AJMP DEC_MINU
;--------------遙控器年加調整-----------------------------------
ADD_YEAR:
MOV R7,TIME_YEAR ;年加1
LCALL ADD1
MOV TIME_YEAR,A
MOV DS1302_ADDR,#8CH ;年值送1302
MOV DS1302_DATA,TIME_YEAR
LCALL WRITE
RET
;--------------遙控器月加調整-----------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -