Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
:
|
Trích:
Nguyên văn bởi duc thang
Cám ơn bạn gửi đường link, nhưng không down được.
Bạm xem lại giùm.
|
vẫn down bình thường.
Code:
;************************************************* **********************
LIST P = 16F877A; definitions used in this program for the PIC16F877A chip
#include "P16F877A.INC"; the definition of this program contains the file
__CONFIG 3F72H; crystal configuration HS, watchdog banned, power-on delay enabled, the brown-out reset enable
; Low-voltage programming prohibited, the code does not protect
#define DQ PORTC, 7
#define DIR TRISC,7
E EQU H'0005'
RW EQU H'0004'
SR EQU H'0006'
XUAT_LCD EQU PORTB
XUAT_DIEU_KHIEN EQU PORTD
CBLOCK 20H
Y1
Y2
COUNT1
COUNT2
COMD
DATE
BIN_L; to convert the byte
GE; converted bits
SHI; converted 10
DATE_L
DATE_H
NUM1
NUM2
NUM3
DATA1
TAM_H
TAM_L
TAM10
TAM_11
CHUA_DAU
LUU_GIA_TRI_CU_H
LUU_GIA_TRI_CU_L
CHO_HIEN_THI
TAM_BANG
HET_BANG
LUU
TAM
ENDC
;************************************************* **********************
; Reset vector definition (for the 16F877A)
;************************************************* **********************
ORG 0000H; reset vector address
GOTO MAIN; program jump to the main program MAIN
;------------------------------------------------- ---------------------
TRA_BANG
ADDWF PCL ,1
DT" NHIET DO PHONG ",0x00
;************************************************* **********************
; The main program areas
;************************************************* **********************
MAIN
NOP
;CALL INTIAL
BSF STATUS, RP0; the definition of the current body is the body 1, in the right direction to modify register
MOVLW 06H
MOVWF ADCON1; off A mouth of the analog channel
MOVLW 00H
MOVWF TRISB; Segment display port as an output port
MOVWF TRISD; Segment display port as an output port
MOVWF TRISE; Segment display port as an output port
BSF DIR; make the data line is input
BCF STATUS, RP0; so that the current body is the body 0
;MOVLW 00H; close Segment
;MOVWF PORTC
MOVLW 00H; closed-bit code
MOVWF PORTD
BCF XUAT_DIEU_KHIEN,E
BCF XUAT_DIEU_KHIEN,RW
BCF XUAT_DIEU_KHIEN,SR
CLRF LUU_GIA_TRI_CU_H
CLRF LUU_GIA_TRI_CU_L
CALL CAI_DAT_LCD
START BTFSS DQ; data line idle state is high
GOTO $ -1
CALL RESET; reset DS18B20
MOVLW 0CCH; skip read ROM command
CALL WR18B20
MOVLW 44H; Temperature Conversion
CALL WR18B20
CALL DELAY_750US; delay 750us
CALL RESET; reset DS18B20
MOVLW 0CCH; skip read ROM command
CALL WR18B20
MOVLW 0BEH; reading the 9 bytes of internal RAM contents
CALL WR18B20
NOP
CALL RE18B20; reading data
CALL NHIET_DO_CO_THAY_DOI_KHONG
MOVLW 0xFF
SUBWF CHO_HIEN_THI,0
BTFSC STATUS,Z
GOTO KHONG_THAY_DOI_HIEN_THI
CALL gia_tri_am_hay_duong
CALL BIN_BCD
CALL HIEN_THI_LCD
KHONG_THAY_DOI_HIEN_THI
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
;------------------------ Display processing ----------------------- ---------------
GOTO START
;************************************************* **********************
; Initialization and consumer video
;************************************************* **********************
INTIAL
BSF STATUS, RP0; the definition of the current body is the body 1, in the right direction to modify register
MOVLW 06H
MOVWF ADCON1; off A mouth of the analog channel
MOVLW 00H
MOVWF TRISB; Segment display port as an output port
MOVWF TRISD; Segment display port as an output port
MOVWF TRISE; Segment display port as an output port
BSF DIR; make the data line is input
BCF STATUS, RP0; so that the current body is the body 0
;MOVLW 00H; close Segment
;MOVWF PORTC
MOVLW 00H; closed-bit code
MOVWF PORTD
BTFSS DQ; data line idle state is high
GOTO $ -1
CALL RESET; reset DS18B20
MOVLW 0CCH; skip read ROM command
CALL WR18B20
MOVLW 44H; Temperature Conversion
CALL WR18B20
CALL DELAY_750US; delay 750us
CALL RESET; reset DS18B20
MOVLW 0CCH; skip read ROM command
CALL WR18B20
MOVLW 0BEH; reading the 9 bytes of internal RAM contents
CALL WR18B20
NOP
NOP
CALL RE18B20; reading data
CALL DELAY_MAX; delay 600ms
CALL DELAY_MAX
CALL DELAY_MAX
RETLW 00H
;================================================= ======================
;************************************************* **********************
; Delay 200ms
;************************************************* **********************
DELAY_MAX
MOVLW 0FFH
MOVWF Y1
MOVLW 0FFH
MOVWF Y2
DECFSZ Y2
GOTO $ -1
DECFSZ Y1
GOTO $ -5
RETLW 00H
;************************************************* **********************
; Delay 6ms
;************************************************* **********************
DELAY
MOVLW 03FH
MOVWF Y1
MOVLW 020H
MOVWF Y2
DECFSZ Y2
GOTO $ -1
DECFSZ Y1
GOTO $ -5
RETLW 00H
;************************************************* **********************
; Delay 750us subroutine
;************************************************* **********************
DELAY_750US
MOVLW 09H
MOVWF Y1
MOVLW 01AH
MOVWF Y2
DECFSZ Y2
GOTO $ -1
DECFSZ Y1
GOTO $ -5
RETLW 00H
;************************************************* **********************
; DS18B20 reset and respond to routine
;************************************************* **********************
RESET
BSF STATUS, RP0; so that the current body is the body a
BCF DIR; so that the output data bit
BCF STATUS, RP0; so that the current body is the body 0
BSF DQ; pulled data bits
NOP; air circulation
BCF DQ; pull down data bits
MOVLW .200 ; delay 600us
MOVWF Y1
DECFSZ Y1
GOTO $ -1
BSF STATUS, RP0; so that the current body is the body a
BSF DIR; make the data bits as input
BCF STATUS, RP0; so that the current body is the body 0
MOVLW .30; Delay 90us
MOVWF Y1
DECFSZ Y1
GOTO $ -1
BTFSC DQ; the host receives a low pulse, jump to the next one
GOTO RESET
MOVLW .80; delay 240us
MOVWF Y1
DECFSZ Y1
GOTO $ -1
BTFSS DQ; the host receives a high pulse, jump to the next one
GOTO RESET
RETLW 00H; return to 00H, the end of reset response
;************************************************* **********************
; Write DS18B20 subroutine
;************************************************* **********************
WR18B20
MOVWF COMD; to write the data in write COMD
MOVLW .8
MOVWF COUNT2; large circle 8 times
WR0 BSF STATUS, RP0; so that the current body is the body a
BCF DIR; so that the output data bit
BCF STATUS, RP0; so that the current body is the body 0
BCF DQ; pull down the data line
NOP
NOP
MOVLW .2
MOVWF COUNT1; delay 9us
WR1 DECFSZ COUNT1, 1
GOTO WR1
BTFSC COMD, 0; COMD the lowest level of 0 Jump to the next one
BSF DQ; pulled the data cable
BTFSC COMD, 0; COMD the lowest level of 0 Jump to the next one
NOP
BCF STATUS, C; into the bit position 0
RRF COMD, 1; into the bit-bit, COMD to the right one
MOVLW .20; Delay 60us
MOVWF COUNT1
WR2 DECFSZ COUNT1, 1
GOTO WR2
BSF DQ; pulled the data cable, idle state
BSF STATUS, RP0; so that the current body is the body a
BSF DIR; make the data bits as input
BCF STATUS, RP0; so that the current body is the body 0
DECFSZ COUNT2, 1; 8 cycles then jump out to a
GOTO WR0
RETLW 00H
;************************************************* **********************
; Read 18B20 subroutine
;************************************************* **********************
RE18B20
CLRF DATE_H
CLRF DATE_L
MOVLW .16
MOVWF COUNT2
RE0 BSF STATUS, RP0; so that the current body is the body a
BCF DIR; so that the output data bit
BCF STATUS, RP0; so that the current body is the body 0
BCF DQ
MOVLW .2
MOVWF COUNT1
RE1 DECFSZ COUNT1, 1
GOTO RE1
BSF STATUS, RP0; so that the current body is the body a
BSF DIR; make the data bits as input
BCF STATUS, RP0; so that the current body is the body 0
NOP
BTFSS DQ; if the data line is high, then C = 1
BCF STATUS, C
BTFSC DQ; if the data line is low, then C = 0
BSF STATUS, C
RRF DATE_H, 1; These data on the existence DATE
RRF DATE_L, 1
MOVLW .20 ; Delay 60us
MOVWF COUNT1
RE2 DECFSZ COUNT1, 1
GOTO RE2
DECFSZ COUNT2, 1
GOTO RE0
BSF DQ
RETLW 00H
;)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
NHIET_DO_CO_THAY_DOI_KHONG
MOVF DATE_L,0
SUBWF LUU_GIA_TRI_CU_L,0
BTFSS STATUS,Z
GOTO CO_THAY_DOI
GOTO KHONG_THAY_DOI
CO_THAY_DOI
MOVF DATE_L,0
MOVWF LUU_GIA_TRI_CU_L
CLRF CHO_HIEN_THI
GOTO THOAT
KHONG_THAY_DOI
MOVLW 0xFF
MOVWF CHO_HIEN_THI
THOAT
RETURN
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""'
gia_tri_am_hay_duong
MOVF DATE_H,0
MOVWF TAM_H
SWAPF TAM_H,1
MOVLW B'01110000'
ANDWF TAM_H,1
MOVF DATE_L,0
MOVWF TAM_L
SWAPF TAM_L,1
MOVLW B'00001111'
ANDWF TAM_L,0
IORWF TAM_H,1
XAC_DINH_GIA_TRI_AM_HAY_DUONG
BTFSS DATE_H,7
GOTO GIA_TRI_DUONG
BTFSS DATE_H,6
GOTO GIA_TRI_DUONG
BTFSS DATE_H,5
GOTO GIA_TRI_DUONG
BTFSS DATE_H,4
GOTO GIA_TRI_DUONG
BTFSS DATE_H,3
GOTO GIA_TRI_DUONG
GIA_TRI_AM
COMF TAM_H,1
BCF TAM_H,7
INCF TAM_H,1
MOVLW '-'
MOVWF CHUA_DAU
MOVF TAM_H,0
MOVWF DATA1
GOTO HET
GIA_TRI_DUONG
MOVF TAM_H,0
MOVWF DATA1
MOVLW ' '
MOVWF CHUA_DAU
HET
RETURN
;================================================= =============
BIN_BCD
clrf NUM2 ; Clear register of 10's unit
Check movlw 0x0A ; Subtract with 10 until the result lower 10
subwf DATA1,w ; Fisrt subtraction < 10 ?
btfss STATUS,C
goto Less1 ; If < 10 then return
incf NUM2,f ; If > 10 then increase 10's unit
movlw 0x0A ; Subtract with 10
subwf DATA1,f ; Test Again. Is it lower 10 ?
goto Check
Less1 movf DATA1,w ; If < 10, send data to 1's unit
movwf NUM1 ;
clrf NUM3 ; Clear 100's unit
Check2 movlw 0x0A
subwf NUM2,w ; 10's unit > 10 ?
btfss STATUS,C
return ; If < 10 then return
incf NUM3,f
movlw 0x0A ; If > 10 then subtraction again
subwf NUM2,f ; and check until the result is lower 10
goto Check2
RETURN
XUAT_DU_LIEU
MOVWF XUAT_LCD
CALL LENH
RETLW .0
;*****LENH*******
LENH
BSF PORTD,E
CALL DL
BCF PORTD,E
RETURN
;**CAI_DAT_LCD***
CAI_DAT_LCD
MOVLW 0x01;XOA MAN HINH
MOVWF XUAT_LCD
CALL LENH
;***************
MOVLW 0x38;8BIT,2 DONG,5*7 DOT
MOVWF XUAT_LCD
CALL LENH
;***************
MOVLW 0x0C
MOVWF XUAT_LCD
CALL LENH
;****************
MOVLW 0x06;TANG CON TRO
MOVWF XUAT_LCD
CALL LENH
;CHO HIEN THI DONG_1
BSF XUAT_DIEU_KHIEN,SR
MOVLW .0
MOVWF LUU
BSF XUAT_DIEU_KHIEN,SR;SR=1 HIEU LA DU LIEU
TIEP
MOVF LUU,0
CALL TRA_BANG
MOVWF TAM;DU LIEU SAU KHI TRA BANG LUU TAI DAY
CLRW ;XOA W
SUBWF TAM ,0
BTFSS STATUS,Z;NEU DU LIEU SAU KHI TRA BANG =0 THI KET THUC BANG TRA
GOTO TRA_TIEP
RETURN
TRA_TIEP
MOVF TAM,0;DUA DU LIEU RA LCD
CALL XUAT_DU_LIEU
INCF LUU,1
GOTO TIEP
RETURN
;*****DL*******
DL MOVLW .4
MOVWF TAM_11
LOPP
MOVLW .250
MOVWF TAM10
LOP DECFSZ TAM10,1
GOTO LOP
DECFSZ TAM_11,1
GOTO LOPP
RETURN
HIEN_THI_LCD
BCF XUAT_DIEU_KHIEN,SR
MOVLW B'11000100';DONG 2
MOVWF XUAT_LCD
CALL LENH
BSF XUAT_DIEU_KHIEN,SR
MOVF CHUA_DAU,0
CALL XUAT_DU_LIEU
MOVLW .0
SUBWF NUM3,0
BTFSC STATUS,Z
GOTO HANG_CHUC
MOVF NUM3,0
ADDLW 0x30
CALL XUAT_DU_LIEU
GOTO HIEN_THI_HANG_CHUC
HANG_CHUC
MOVLW .0
SUBWF NUM2,0
BTFSC STATUS,Z
GOTO HANG_DVI
HIEN_THI_HANG_CHUC
MOVF NUM2,0
ADDLW 0x30
CALL XUAT_DU_LIEU
HANG_DVI
MOVF NUM1,0
ADDLW 0x30
CALL XUAT_DU_LIEU
MOVLW '.'
CALL XUAT_DU_LIEU
MOVLW 'O'
CALL XUAT_DU_LIEU
MOVLW 'C'
CALL XUAT_DU_LIEU
RETURN
END; end of the process
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.
|