POP DX POP CX CALL W_L
;0->PC0
ROR AL,1
;把最
POP AX
RET
Delay501us ENDP
Delay50us PROC NEAR
PUSH AX PUSH CX PUSH
DX
MOV CX,12
MOV DX,PA_8255
Delay50us_1: IN AL,DX
LOOP Delay50us_1
POP DX POP CX POP AX
RET
Delay50us ENDP ;写操作
WRITE_18B20 PROC NEAR
MOV CX,8
;一共8
位数据 WRI:
低位移到cf 和最高位
JNB WRI1
;if(ch==0) jmp
CALL W_H
;1->PC0 WRI2:
CALL Delay50us CALL W_H LOOP WRI
RET
WRI1:
PUSH
CX
存CX,恢复CX POP CX
JMP WRI2
WRITE_18B20 ENDP ;读操作
READ_18B20 PROC NEAR
MOV
CX,8
据一共有8位 Read: CALL
Delay50us
MOV DX,Con_8255
;8255控制口地址->DX
MOV AL,80H
15
保
数
;; OUT DX,AL ;0->PC0 MOV AL,89H
OUT DX,AL
;PC口
输入状态
MOV DX,PC_8255
;8255PC口地址->DX IN AL,DX ROR AL,1 RCR BL,1
;cf ror
MOV DX,Con_8255
;8255控制口地址->DX MOV AL,80H
OUT DX,AL
;0->PC0 MOV AL,01H
OUT DX,AL
;1->PC0 LOOP
Read
MOV AL,BL
RET
READ_18B20 ENDP
;******************************
; 判断DS18B20是否存在,启动DS18B20
;CY为判断标志
;******************************
START_Temperature:
CALL INIT_18B20
;先
复位DS18B20
JB GET_T
;判断
DS1820是否存在?若DS18B20不存在则返回
MOV
AL,0CCH
;跳过ROM匹配 CALL WRITE_18B20
MOV
AL,44H
;发出温度转换命令 CALL WRITE_18B20
CLC
GET_T:
RET
;******************************
; 读出转换后的温度值,存在AX ;*****************************
*
RD_Temperature:
CALL INIT_18B20
;准备读温度前先复位
MOV
AL,0CCH
;跳过ROM匹配 CALL WRITE_18B20
MOV
AL,0BEH
;发
出读温度命令 CALL WRITE_18B20
CALL
READ_18B20
;调
用读18B20子程序,读出温度
16
到AX
MOV AH,AL ;存放 RET
ENDP
W_L
CALL
READ_18B20
;调用读18B20子程序
XCHG
AL,AH
读低8位再读高8位 RET
Init8255 PROC NEAR
MOV DX,Con_8255
;8255的控制口-> DX MOV AL,89H OUT DX,AL DEC DX
RET
Init8255 ENDP ;写 0 W_L PROC
NEAR
PUSH AX
存AX
MOV DX,Con_8255
;8255的控制口-> DX
MOV AL,80H
;80H->AL
OUT DX,AL
;AL->[DX](0->PC0口) POP AX
复AX
;先
;保
;恢
17
;写 1 W_H PROC NEAR
PUSH AX
;保
存AX
MOV DX,Con_8255
;8255的控制口-> DX
MOV AL,01H
;01H->AL
OUT
DX,AL
;AL->[DX](1->PC0口) POP AX
;恢复
AX
RET
W_H ENDP
;*************************** ;向8255写入显示的数
;*************************** displayNumber proc
near
;向8255写入显示的数
mov si,ax push ax
push bx
T1: mov ax,si
push cx mov dx,PA_8255 call bl10 and ax,000fh mul bl mov bl,16
div bl;al为显示的数值0-9 call
convert
out dx,al mov dx,PB_8255 mov al,11111110b out dx,al IDIE:
mov al,0FFH
out dx,al mov ax,si mov dx,PA_8255 call YDR call bl10 div bl xchg al,ah call
convert1
out dx,al mov dx,PB_8255 mov al,11111101b out dx,al IDIE1:
mov al,0FFH
out dx,al mov ax,si mov dx,PA_8255 call YDR call bl10 div bl and ah,00h div bl jmp qqq2 qqq1: jmp t1 qqq2: xchg al,ah call
convert
out dx,al mov dx,PB_8255 mov al,11111011b out dx,al IDIE2:
mov al,0FFH
out dx,al mov ax,si mov dx,PA_8255 call YDR call bl10 div bl
18
and ah,00h div bl call
convert
out dx,al mov dx,PB_8255 mov al,11110111b out dx,al IDIE3:
mov al,0FFH out dx,al pop cx loop qqq1 pop bx pop ax ret displayNumber
endp
;============================== ; TAB db
3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h;指令的基本功能:这条指令根据AL寄存器提供的位移量, YDR proc near
push
cx
mov cl,4
shr ax,cl
pop cx
ret ;将BX指使的字节表格中的代码换存在AL中。
;
(AL)<-((DS)*16+(BX)+(AL)) YDR endp
convert proc
near
mov bx,offset TAB xlat
ret
convert endp convert1 proc
near
mov bx,offset TAB1 xlat
ret
convert1 endp
bl10
proc
near
mov bl,10 ret
;将BX指使的字节
表格中的代码换存在AL中。
;
(AL)<-((DS)*16+(BX)+(AL)) bl10
endp
;==============================
InitPCI
PROC
NEAR
MOV AH,00H
19