;В разработке
            LIST        P=16F628A
            INCLUDE     P16F628A.INC
            __CONFIG    _INTOSC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_LVP_OFF
            ERRORLEVEL  -302
; описание портов подключения датчика.
            #DEFINE     LCD_TRIS    TRISB 
            #define     DATA_PORT   PORTB
            #DEFINE     RS_TRIS     TRISA,1
            #DEFINE     E_TRIS      TRISA,2
            #define     RS          PORTA,1
            #define     E           PORTA,2
            #define     TRISDAL     TRISA     ; регистр управления порта ДАЛЛАСА 
            #define     PORTDAL     PORTA     ; регистр данных порта ДАЛЛАСА 
            #define     LINE        0         ; линия порта ДАЛЛАСА 
            #define     DALLAS      PORTA,0   ; шина связи с ДАЛЛАСОМ 
            CBLOCK      20H
            I:1,J:1,CON:1,ERROR_D:1,TEMP_HI:1,TEMP_LO:1
            COM_REG:1,COUNT:1,TEMP0:1,TEMP1:1,TMP:1
            ENDC
BANK0       MACRO
            BCF         STATUS,RP0
            BCF         STATUS,RP1
            ENDM
BANK1       MACRO
            BSF         STATUS,RP0
            BCF         STATUS,RP1
            ENDM
            ORG         0
            GOTO        START
START       MOVLW       7
            MOVWF       CMCON
            CLRF        PORTB
            CLRF        PORTA
            CLRF        TMP
            CLRF        TEMP_LO
            CLRF        TEMP_LO
            CLRF        COM_REG
            CLRF        CON
            CLRF        ERROR_D
            BANK1
            BCF         RS_TRIS
            BCF         E_TRIS
            MOVLW       B'11110000'
            MOVWF       LCD_TRIS
            BANK0
            
            CALL        INIT_LCD
            MOVLW       0x80
            CALL        SET_ADDR
            MOVLW       'T'
            CALL        W_DATA_LCD
            MOVLW       'e'
            CALL        W_DATA_LCD
            MOVLW       's'
            CALL        W_DATA_LCD
            MOVLW       't'
            CALL        W_DATA_LCD
            MOVLW       ' '
            CALL        W_DATA_LCD
            MOVLW       'D'
            CALL        W_DATA_LCD
            MOVLW       'S'
            CALL        W_DATA_LCD
            MOVLW       '1'
            CALL        W_DATA_LCD
            MOVLW       '8'
            CALL        W_DATA_LCD
            MOVLW       'B'
            CALL        W_DATA_LCD
            MOVLW       '2'
            CALL        W_DATA_LCD
            MOVLW       '0'
            CALL        W_DATA_LCD
            MOVLW       0xC0
            CALL        SET_ADDR
            MOVLW       'T'
            CALL        W_DATA_LCD
            MOVLW       0x6F
            CALL        W_DATA_LCD
            MOVLW       'C'
            CALL        W_DATA_LCD
            MOVLW       ' '
            CALL        W_DATA_LCD
            
MAIN        
            CALL        CELSIO
            
            SWAPF       TEMP_LO,W
            MOVWF       TMP
            SWAPF       TEMP_HI,W
            ANDLW       0xF0
            IORWF       TMP
            MOVFW       TMP
            ADDLW       0xF6
            BTFSC       STATUS,C
            GOTO        SHOW_TEN
            
            MOVLW       0xC4
            CALL        SET_ADDR
            MOVLW       '+' 
            CALL        W_DATA_LCD
            MOVLW       0xC5
            CALL        SET_ADDR 
            MOVFW       TMP
            ADDLW       0x30
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR 
            MOVLW       ' ' 
            CALL        W_DATA_LCD
            GOTO        GET_TEMP 
            
SHOW_TEN    MOVLW       0xC4
            CALL        SET_ADDR
            MOVLW       '+' 
            CALL        W_DATA_LCD
            MOVLW       0xC5
            CALL        SET_ADDR 
            MOVLW       0x31 
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR 
            MOVFW       TMP
            ADDLW       0x26
            CALL        W_DATA_LCD
            
GET_TEMP    CALL        DEL_200ms
            GOTO        MAIN
            
 
;================================================================================= 
 ; чтение температуры из DS18B20 
CELSIO ; 
;======================================== 
; измерение температуры ; 
            call       DOUT_LOW     ; слот чтения для контроля 
            call       DOUT_HIGH    ; окончания конвертирования 
            btfss      DALLAS       ; 
            return                  ; 
            btfsc      CON,0        ; 
            goto       ctenie       ; 
            call       RESET_DALLAS ; 
            btfsc      ERROR_D,0      ; 
            return                  ; датчик неисправен прервать конвертирование температуры 
;======================================== 
            movlw      0xCC         ; формировать команду Пропустить ROM 
            call       DSEND        ; 
            movlw      0x44         ; формировать команду Конвертировать температуру 
            call       DSEND        ; 
;======================================== 
            bsf        CON,0          ; идет конвертирование 
            return                  ; 
;======================================== 
ctenie ; чтение температуры 
            bcf        CON,0          ; конвертирование выполнено 
;======================================== 
            call       RESET_DALLAS ; 
            btfsc      ERROR_D,0      ; 
            return                  ; датчик неисправен прервать чтение температуры 
            movlw      0xCC        ; послать команду Пропустить ROM 
            call       DSEND        ; 
            movlw      0xBE        ; послать команду чтения памяти 
            call       DSEND        ; 
            call       DRECEIVE     ; читать 1 байт 
            movf       COM_REG,W    ; 
            movwf      TEMP_LO ; 
            call       DRECEIVE     ; читать 2 байт 
            movf       COM_REG,W ; 
            movwf      TEMP_HI ; 
          
            return   
;====================================================================================== 
            
             
RESET_DALLAS 
            BSF         ERROR_D,0
            CALL        DOUT_LOW
            CALL        DEL_480us
            CALL        DOUT_HIGH
            CALL        DEL_60us
            BTFSS       DALLAS
            BCF         ERROR_D,0
            CALL        DEL_480us
            RETLW       .0
;====================================================================================== 
; DOUT_LOW: Эта подпрограмма устанавливает линию ДАЛЛАССа на вывод и устанавливает на ней "0" 
DOUT_LOW 
            BCF         DALLAS       ; установить низкий уровень на шине 
            BANK1                    ; выбрать банк 1 
            BCF         TRISDAL,LINE ; настроить порт на выход 
            BANK0                    ; выбрать банк 0 
            NOP                      ; 
            NOP                      ; 
            RETLW       .0           ; 
;======================================================================================       
;======================================================================================= 
;DOUT_HIGH: Эта подпрограмма устанавливает линию ДАЛЛАССа как ввод, продавливает высоким уровнем шину, 
;а затем переводит линию на прием, внешний резистор удерживает высокий уровень  
DOUT_HIGH 
           ; BSF         DALLAS       ; задержка для длинных линий для 
           ; nop                    ; формирования импульса восстановления 
           ; nop                    ; (на очень длинные линии) 
            ; nop                    ; 
            ; nop                    ; 
            BANK1                    ; выбрать банк 1 
            BSF         TRISDAL,LINE ; настроить порт на ввод (имитация открытого коллектора) 
            BANK0                    ; выбрать банк 0 
            RETLW       .0           ; 
;=======================================================================================  
;======================================================================================= 
; DRECEIVE: Эта подпрограмма получает данные от ДАЛЛАССКОГО чипа. 
DRECEIVE 
            movlw       H'08'        ; Количество получаемых бит 
            movwf       TEMP1        ; Загрузка регистра счетчика 
C_DRECEIVE  call        DOUT_LOW     ; старт чтения бита установить низкий уровень) 
            
            call        DOUT_HIGH    ; начать чтение 
            btfss       DALLAS       ; проверить уровень на линии DALLAS1 
            bcf         STATUS,C     ; установить С в "0" 
            btfsc       DALLAS       ; проверить уровень на линии DALLAS1 
            bsf         STATUS,C     ; нет установить С в "1" 
            rrf         COM_REG,F    ; сдвиг вправо для записи в регистре COM_REG 
            call        DLIT_WR      ; ожидать для окончания формирование далласом бита 
            decfsz      TEMP1,F      ; 
            goto        C_DRECEIVE   ; 
            retlw       H'00'        ; 
;======================================================================================= 
 
;======================================================================================= 
; DSEND: Эта подпрограмма посылает команды к DS1820. Данные 
; посылается младшим битом сначала без четности, останова, или битов начала 
DSEND 
            movwf       COM_REG      ; Загрузка бофера команд для пересылки 
            movlw       H'08'        ; Количество битов для пересылки 
            movwf       TEMP1        ; 
C_DSEND     call        DOUT_LOW     ; Start the write slot 
            rrf         COM_REG,F    ; Сдвиг вправо, чтобы определить через бит С первый бит для пересылки 
            btfss       STATUS,C     ; Смотреть бит С == 1 
            goto        SEND0        ; 
            call        DOUT_HIGH    ; Установить линию в "1" если бит С == 1 
            goto        DS_1         ; 
SEND0       call        DOUT_LOW     ; Установить линию в "0", если бит С == 0
DS_1        call        DLIT_WR      ; Ожидать 60uS, чтобы позволить DS1820 выполнить выборку 
            call        DOUT_HIGH    ; Установить шину в "1" 
            decfsz      TEMP1,F      ; Уменьшить счетчик переданных битов и проверить достигнут ли ноль 
            goto        C_DSEND      ; Повторить передачу бита 
            retlw       H'00'        ; 
;=======================================================================================
;======================================================================================= 
; DLIT_WR: Эта подпрограмма используется в ходе работы подпрограмм связи 
; задержка 60 mks, в которая необходима DS1820 для чтения или записи бита данных. 
DLIT_WR                              ; 
           movlw       .20           ;.20 - 60mks 
           movwf       TEMP0         ; 
           decfsz      TEMP0,F       ; 
           goto        $-.1          ; 
           retlw       H'00'         ; 
;=======================================================================================
INIT_LCD    CALL       DEL_15ms
            MOVLW      .3
            CALL       W_NIBLE_LCD
            CALL       DEL_15ms
            MOVLW      .3
            CALL       DEL_480us
            MOVLW      0x32
            CALL       W_CMD_LCD
            MOVLW      0x28
            CALL       W_CMD_LCD
            MOVLW      0x08
            CALL       W_CMD_LCD
            MOVLW      0x01
            CALL       W_CMD_LCD
            CALL       DEL_15ms
            MOVLW      0x06
            CALL       W_CMD_LCD
            MOVLW      0x0C
            CALL       W_CMD_LCD
            RETLW      .0
            
W_CMD_LCD   MOVWF      TEMP0
            SWAPF      TEMP0,W
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BCF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            MOVFW      TEMP0
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0
W_NIBLE_LCD ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BCF        RS
            BSF        E
            NOP
            BCF        E 
            CALL       DEL_60us 
            RETLW      .0          
W_DATA_LCD  MOVWF      TEMP0
            SWAPF      TEMP0,W
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            MOVFW      TEMP0
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0
SET_ADDR    CALL        W_CMD_LCD
            RETLW       .0            
DEL_480us   MOVLW       .5
            MOVWF       J
            MOVLW       .31
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0
            
DEL_60us    MOVLW       .18
            MOVWF       J
            DECFSZ      J,F
            GOTO        $-.1
            RETLW       .0
            
DEL_15ms    MOVLW       .20
            MOVWF       J
            MOVLW       .255
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0
                          
DEL_200ms   MOVLW       .255
            MOVWF       J
            MOVLW       .255
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0      
            END



;Вывод всей температуры на ЖКИ

LIST        P=16F628A
            INCLUDE     P16F628A.INC
            __CONFIG    _INTOSC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_LVP_OFF
            ERRORLEVEL  -302
; описание портов подключения датчика.
            #DEFINE     LCD_TRIS    TRISB
            #define     DATA_PORT   PORTB
            #DEFINE     RS_TRIS     TRISA,1
            #DEFINE     E_TRIS      TRISA,2
            #define     RS          PORTA,1
            #define     E           PORTA,2
            #define     TRISDAL     TRISA     ; регистр управления порта ДАЛЛАСА
            #define     PORTDAL     PORTA     ; регистр данных порта ДАЛЛАСА
            #define     LINE        0         ; линия порта ДАЛЛАСА
            #define     DALLAS      PORTA,0   ; шина связи с ДАЛЛАСОМ
            CBLOCK      20H
            I:1,J:1,CON:1,ERROR_D:1,TEMP_HI:1,TEMP_LO:1
            COM_REG:1,COUNT:1,TEMP0:1,TEMP1:1,TMP:1
            ENDC
BANK0       MACRO
            BCF         STATUS,RP0
            BCF         STATUS,RP1
            ENDM
BANK1       MACRO
            BSF         STATUS,RP0
            BCF         STATUS,RP1
            ENDM
            ORG         0
            GOTO        START
START       MOVLW       7
            MOVWF       CMCON       ;Отключаем компаратор
            CLRF        PORTB       ;Чистим все регистры
            CLRF        PORTA
            CLRF        TMP
            CLRF        TEMP_LO
            CLRF        TEMP_LO
            CLRF        COM_REG
            CLRF        CON
            CLRF        ERROR_D
            BANK1
            BCF         RS_TRIS      ;Устанавливаем направление Ввода\Вывода
            BCF         E_TRIS
            MOVLW       B'11110000'
            MOVWF       LCD_TRIS
            BANK0
            
            CALL        INIT_LCD     ;Настраиваем ЖКИ
;******Здесь можно вывести на экран что угодно**********************
            MOVLW       0x80         ;Устанавливаем курсор на первый символ
            CALL        SET_ADDR     ;16-ти симольной строки
            MOVLW       'T'          ;В WREG букву
            CALL        W_DATA_LCD   ;Отправляем ее на ЖКИ(мы настроили в INIT_LCD
            MOVLW       'e'          ;так,чтобы курсор сдвигался в право сам после
            CALL        W_DATA_LCD   ;ввода символа)
            MOVLW       's'
            CALL        W_DATA_LCD
            MOVLW       't'
            CALL        W_DATA_LCD
            MOVLW       ' '
            CALL        W_DATA_LCD
            MOVLW       'D'
            CALL        W_DATA_LCD
            MOVLW       'S'
            CALL        W_DATA_LCD
            MOVLW       '1'
            CALL        W_DATA_LCD
            MOVLW       '8'
            CALL        W_DATA_LCD
            MOVLW       'B'
            CALL        W_DATA_LCD
            MOVLW       '2'
            CALL        W_DATA_LCD
            MOVLW       '0'
            CALL        W_DATA_LCD
            MOVLW       0xC0
            CALL        SET_ADDR
            MOVLW       'T'
            CALL        W_DATA_LCD
            MOVLW       0x6F
            CALL        W_DATA_LCD
            MOVLW       'C'
            CALL        W_DATA_LCD
            MOVLW       ' '
            CALL        W_DATA_LCD
;***********Главный цикл программы*************            
MAIN        
            CALL        CELSIO      ;Измеряем температуру
                                    ;Температура после измерения находится
                                    ;в 2-ух байтах - TEMP_HI и TEMP_LO
            CALL        DISP_TEMP
            GOTO        MAIN
            
 
;=================================================================================
 ; чтение температуры из DS18B20
CELSIO ;
;========================================
; измерение температуры ;
            call       DOUT_LOW     ; слот чтения для контроля
            call       DOUT_HIGH    ; окончания конвертирования
            btfss      DALLAS       ;
            return                  ;
            btfsc      CON,0        ;
            goto       ctenie       ;
            call       RESET_DALLAS ;
            btfsc      ERROR_D,0      ;
            return                  ; датчик неисправен прервать конвертирование температуры
;========================================
            movlw      0xCC         ; формировать команду Пропустить ROM
            call       DSEND        ;
            movlw      0x44         ; формировать команду Конвертировать температуру
            call       DSEND        ;
;========================================
            bsf        CON,0          ; идет конвертирование
            return                  ;
;========================================
ctenie ; чтение температуры
            bcf        CON,0          ; конвертирование выполнено
;========================================
            call       RESET_DALLAS ;
            btfsc      ERROR_D,0      ;
            return                  ; датчик неисправен прервать чтение температуры
            movlw      0xCC        ; послать команду Пропустить ROM
            call       DSEND        ;
            movlw      0xBE        ; послать команду чтения памяти
            call       DSEND        ;
            call       DRECEIVE     ; читать 1 байт
            movf       COM_REG,W    ;
            movwf      TEMP_LO ;
            call       DRECEIVE     ; читать 2 байт
            movf       COM_REG,W ;
            movwf      TEMP_HI ;
          
            return   
;======================================================================================
            
             
RESET_DALLAS
            BSF         ERROR_D,0
            CALL        DOUT_LOW
            CALL        DEL_480us
            CALL        DOUT_HIGH
            CALL        DEL_60us
            BTFSS       DALLAS
            BCF         ERROR_D,0
            CALL        DEL_480us
            RETLW       .0
;======================================================================================
; DOUT_LOW: Эта подпрограмма устанавливает линию ДАЛЛАССа на вывод и устанавливает на ней "0"
DOUT_LOW
            BCF         DALLAS       ; установить низкий уровень на шине
            BANK1                    ; выбрать банк 1
            BCF         TRISDAL,LINE ; настроить порт на выход
            BANK0                    ; выбрать банк 0
            NOP                      ;
            NOP                      ;
            RETLW       .0           ;
;======================================================================================       
;=======================================================================================
;DOUT_HIGH: Эта подпрограмма устанавливает линию ДАЛЛАССа как ввод, продавливает высоким уровнем шину,
;а затем переводит линию на прием, внешний резистор удерживает высокий уровень  
DOUT_HIGH
           ; BSF         DALLAS       ; задержка для длинных линий для
           ; nop                    ; формирования импульса восстановления
           ; nop                    ; (на очень длинные линии)
            ; nop                    ;
            ; nop                    ;
            BANK1                    ; выбрать банк 1
            BSF         TRISDAL,LINE ; настроить порт на ввод (имитация открытого коллектора)
            BANK0                    ; выбрать банк 0
            RETLW       .0           ;
;=======================================================================================  
;=======================================================================================
; DRECEIVE: Эта подпрограмма получает данные от ДАЛЛАССКОГО чипа.
DRECEIVE
            movlw       H'08'        ; Количество получаемых бит
            movwf       TEMP1        ; Загрузка регистра счетчика
C_DRECEIVE  call        DOUT_LOW     ; старт чтения бита установить низкий уровень)
            
            call        DOUT_HIGH    ; начать чтение
            btfss       DALLAS       ; проверить уровень на линии DALLAS1
            bcf         STATUS,C     ; установить С в "0"
            btfsc       DALLAS       ; проверить уровень на линии DALLAS1
            bsf         STATUS,C     ; нет установить С в "1"
            rrf         COM_REG,F    ; сдвиг вправо для записи в регистре COM_REG
            call        DLIT_WR      ; ожидать для окончания формирование далласом бита
            decfsz      TEMP1,F      ;
            goto        C_DRECEIVE   ;
            retlw       H'00'        ;
;=======================================================================================
 
;=======================================================================================
; DSEND: Эта подпрограмма посылает команды к DS1820. Данные
; посылается младшим битом сначала без четности, останова, или битов начала
DSEND
            movwf       COM_REG      ; Загрузка бофера команд для пересылки
            movlw       H'08'        ; Количество битов для пересылки
            movwf       TEMP1        ;
C_DSEND     call        DOUT_LOW     ; Start the write slot
            rrf         COM_REG,F    ; Сдвиг вправо, чтобы определить через бит С первый бит для пересылки
            btfss       STATUS,C     ; Смотреть бит С == 1
            goto        SEND0        ;
            call        DOUT_HIGH    ; Установить линию в "1" если бит С == 1
            goto        DS_1         ;
SEND0       call        DOUT_LOW     ; Установить линию в "0", если бит С == 0
DS_1        call        DLIT_WR      ; Ожидать 60uS, чтобы позволить DS1820 выполнить выборку
            call        DOUT_HIGH    ; Установить шину в "1"
            decfsz      TEMP1,F      ; Уменьшить счетчик переданных битов и проверить достигнут ли ноль
            goto        C_DSEND      ; Повторить передачу бита
            retlw       H'00'        ;
;=======================================================================================
;=======================================================================================
; DLIT_WR: Эта подпрограмма используется в ходе работы подпрограмм связи
; задержка 60 mks, в которая необходима DS1820 для чтения или записи бита данных.
DLIT_WR                              ;
            movlw      .20 ;.20 - 60mks
            movwf      TEMP0         ;
            decfsz     TEMP0,F       ;
            goto       $-.1          ;
            retlw      H'00'         ;
;=======================================================================================
INIT_LCD    CALL       DEL_15ms
            MOVLW      .3
            CALL       W_NIBLE_LCD
            CALL       DEL_15ms
            MOVLW      .3
            CALL       DEL_480us
            MOVLW      0x32
            CALL       W_CMD_LCD
            MOVLW      0x28
            CALL       W_CMD_LCD
            MOVLW      0x08
            CALL       W_CMD_LCD
            MOVLW      0x01
            CALL       W_CMD_LCD
            CALL       DEL_15ms
            MOVLW      0x06
            CALL       W_CMD_LCD
            MOVLW      0x0C
            CALL       W_CMD_LCD
            RETLW      .0
            
W_CMD_LCD   MOVWF      TEMP0
            SWAPF      TEMP0,W
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BCF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            MOVFW      TEMP0
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0
W_NIBLE_LCD ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BCF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0          
W_DATA_LCD  MOVWF      TEMP0
            SWAPF      TEMP0,W
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            MOVFW      TEMP0
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0
SET_ADDR    CALL        W_CMD_LCD
            RETLW       .0            
DEL_480us   MOVLW       .5
            MOVWF       J
            MOVLW       .31
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0
            
DEL_60us    MOVLW       .18
            MOVWF       J
            DECFSZ      J,F
            GOTO        $-.1
            RETLW       .0
            
DEL_15ms    MOVLW       .20
            MOVWF       J
            MOVLW       .255
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0
                          
DEL_200ms   MOVLW       .255
            MOVWF       J
            MOVLW       .255
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0

DEL_SEC     MOVLW       .10
            MOVWF       J
            CALL        DEL_200ms
            DECFSZ      J,F
            GOTO        $-.2
            RETLW       .0
DISP_TEMP
            MOVFW       TEMP_HI     ;В TEMP_HI в старшем полубайте находится знак
                                    ;Если полубайт = 0xFX,то датчик измерял температуру
                                    ;со знаком "-",если полубайт =0х0X,то коружающая
                                    ;температура "+"
            ANDLW       0xF0        ;Чистим младший полубайт
            SUBLW       0x00        ;Проверяем равен ли он 0-лю
            BTFSC       STATUS,Z
            GOTO        SET_PLUS    ;Полубайт равен нулю идем на преобразование
                                    ;Плюсовой температуры
            MOVLW       0xC4        ;Полубайт не равен 0-лю,преобразуем по минусу
            CALL        SET_ADDR
            MOVLW       '-'
            CALL        W_DATA_LCD
            GOTO        SHOW_MINUS_ONE
SET_PLUS    MOVLW       0xC4
            CALL        SET_ADDR
            MOVLW       '+'
            CALL        W_DATA_LCD
                    
SHOW_ONE    SWAPF       TEMP_LO,W   ;Преместим температуру в один регистр
            MOVWF       TMP
            SWAPF       TEMP_HI,W
            ANDLW       0xF0
            IORWF       TMP,F
            MOVFW       TMP
            ANDLW       B'01111111'
            MOVWF       TMP
            MOVFW       TMP
            ADDLW       0xF6        ;Проверяем тепература меньше 9-ти
            BTFSC       STATUS,C
            GOTO        SHOW_TEN1   ;Нет больше 9-ти
            
;***********Выводим на ЖКИ температуру до 9-ти******************         
            MOVLW       0xC5        
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x30
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 19-ти******************            
SHOW_TEN1   MOVFW       TMP
            ADDLW       0xEC
            BTFSC       STATUS,C
            GOTO        SHOW_TEN2
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x26
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 29-ти******************            
SHOW_TEN2   MOVFW       TMP
            ADDLW       0xE2
            BTFSC       STATUS,C
            GOTO        SHOW_TEN3
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x1C
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD        
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 39-ти******************            
SHOW_TEN3   MOVFW       TMP
            ADDLW       0xD8
            BTFSC       STATUS,C
            GOTO        SHOW_TEN4
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x33
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x12
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 49-ти******************            
SHOW_TEN4   MOVFW       TMP
            ADDLW       0xCE
            BTFSC       STATUS,C
            GOTO        SHOW_TEN5
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x34
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x08
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD        
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 59-ти******************
SHOW_TEN5   MOVFW       TMP
            ADDLW       0xC4
            BTFSC       STATUS,C
            GOTO        SHOW_TEN6
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x35
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xFE
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 69-ти******************            
SHOW_TEN6   MOVFW       TMP
            ADDLW       0xBA
            BTFSC       STATUS,C
            GOTO        SHOW_TEN7
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x36
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xF4
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD        
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 79-ти******************            
SHOW_TEN7   MOVFW       TMP
            ADDLW       0xB0
            BTFSC       STATUS,C
            GOTO        SHOW_TEN8
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x37
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xEA
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 89-ти******************            
SHOW_TEN8   MOVFW       TMP
            ADDLW       0xA6
            BTFSC       STATUS,C
            GOTO        SHOW_TEN9
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x38
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xE0
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 99-ти******************            
SHOW_TEN9   MOVFW       TMP
            ADDLW       0x9C
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED0
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x39
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xD6
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 109-ти******************            
SHOW_HUNDRED0
            MOVFW       TMP
            ADDLW       0x92
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED1  
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVLW       0x30
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xCC
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 119-ти******************            
SHOW_HUNDRED1  
            MOVFW       TMP
            ADDLW       0x88
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED2
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xC2
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 128-ми******************            
SHOW_HUNDRED2  
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xB8
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
            
            
SHOW_MINUS_ONE    
            SWAPF       TEMP_LO,W   ;Преместим температуру в один регистр
            MOVWF       TMP
            SWAPF       TEMP_HI,W
            ANDLW       0xF0
            IORWF       TMP,F
            MOVFW       TMP
            ANDLW       B'01111111'
            MOVWF       TMP
;***********Проверяем тепература меньше 9-ти            
            MOVFW       TMP
            ADDLW       0x89
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN1   ;Нет больше 9-ти
            
;***********Выводим на ЖКИ температуру до 9-ти******************         
            MOVLW       0xC5        
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0xB0
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 19-ти******************            
SHOW_MINUS_TEN1   
            MOVFW       TMP
            ADDLW       0x93
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN2
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0xA6
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN2
            MOVFW       TMP
            ADDLW       0x9D
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN3
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x9C
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP  
SHOW_MINUS_TEN3
            MOVFW       TMP
            ADDLW       0xA7
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN4
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x33
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x92
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN4
            MOVFW       TMP
            ADDLW       0xB1
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN5
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x34
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x88
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN5
            MOVFW       TMP
            ADDLW       0xBB
            BTFSS       STATUS,C
            GOTO        GET_TEMP
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x35
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x7E
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD                                                                    
GET_TEMP     
            RETLW       .0   
            END


;Читаем ROM

 

LIST        P=16F628A
            INCLUDE     P16F628A.INC
            __CONFIG    _INTOSC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_LVP_OFF
            ERRORLEVEL  -302
; описание портов подключения датчика.
            #DEFINE     LCD_TRIS    TRISB
            #define     DATA_PORT   PORTB
            #DEFINE     RS_TRIS     TRISA,1
            #DEFINE     E_TRIS      TRISA,2
            #define     RS          PORTA,1
            #define     E           PORTA,2
            #define     TRISDAL     TRISA     ; регистр управления порта ДАЛЛАСА
            #define     PORTDAL     PORTA     ; регистр данных порта ДАЛЛАСА
            #define     LINE        0         ; линия порта ДАЛЛАСА
            #define     DALLAS      PORTA,0   ; шина связи с ДАЛЛАСОМ
            CBLOCK      20H
            I:1,J:1,CON:1,ERROR_D:1,TEMP_HI:1,TEMP_LO:1
            COM_REG:1,COUNT:1,TEMP0:1,TEMP1:1,TMP:1,FAMILY:1
            SERIAL:6,CRC:1,K:1
            ENDC
BANK0       MACRO
            BCF         STATUS,RP0
            BCF         STATUS,RP1
            ENDM
BANK1       MACRO
            BSF         STATUS,RP0
            BCF         STATUS,RP1
            ENDM
            ORG         0
            GOTO        START
START       MOVLW       7
            MOVWF       CMCON       ;Отключаем компаратор
            CLRF        PORTB       ;Чистим все регистры
            CLRF        PORTA
            CLRF        TMP
            CLRF        TEMP_LO
            CLRF        TEMP_LO
            CLRF        COM_REG
            CLRF        CON
            CLRF        ERROR_D
            BANK1
            BCF         RS_TRIS      ;Устанавливаем направление Ввода\Вывода
            BCF         E_TRIS
            MOVLW       B'11110000'
            MOVWF       LCD_TRIS
            BANK0
            
            CALL        INIT_LCD     ;Настраиваем ЖКИ
            
            
;***********Главный цикл программы*************            
MAIN        ;CALL        READ_ROM
            CALL        CELSIO      ;Измеряем температуру
                                    ;Температура после измерения находится
                                    ;в 2-ух байтах - TEMP_HI и TEMP_LO
            CALL        DISP_TEMP
            
            CALL        READ_ROM
            
            MOVLW       0x01
            CALL        W_CMD_LCD
            CALL        DEL_15ms
            GOTO        MAIN
;***********************************************

            
READ_ROM
            CALL       DOUT_LOW
            CALL       DOUT_HIGH  
            BTFSS      DALLAS
            RETURN
            CALL       RESET_DALLAS
            BTFSC      ERROR_D,0
            RETURN
            MOVLW      0x33
            CALL       DSEND
            
            MOVLW      0x80
            CALL       SET_ADDR
;***********1-ЫЙ БАЙТ ROM*********************           
            CALL       DEL_SEC
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      FAMILY
            SWAPF      FAMILY,W
            ANDLW      0x0F
            ;СТАРШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL1
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT1
LITERAL1    MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
            
NEXT1       MOVFW      FAMILY
            ANDLW      0x0F
            ;МЛАДШИЙ ПОЛУБАЙТ
            ADDLW      0x30
            CALL       W_DATA_LCD
            
;***********2-ОЙ БАЙТ ROM*********************           
            CALL       DEL_SEC
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL
            SWAPF      SERIAL,W
            ANDLW      0x0F
      ;СТАРШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL2
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT2
LITERAL2    MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT2       MOVFW      SERIAL
            ANDLW      0x0F
       ;МЛАДШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL3
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT3
LITERAL3    MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT3       
;***********3-ИЙ БАЙТ ROM*********************             
            CALL       DEL_SEC
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL+1
            SWAPF      SERIAL+1,W
            ANDLW      0x0F
      ;СТАРШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL4
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT4
LITERAL4    MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT4
            MOVFW      SERIAL+1
            ANDLW      0x0F
       ;МЛАДШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL5
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT5
LITERAL5    MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT5
;***********4-ЫЙ БАЙТ ROM*********************             
            CALL       DEL_SEC
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL+2
            SWAPF      SERIAL+2,W
            ANDLW      0x0F
      ;СТАРШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL6
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT6
LITERAL6    MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT6
            MOVFW      SERIAL+2
            ANDLW      0x0F
       ;МЛАДШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL7
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT7
LITERAL7    MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT7
;***********5-ЫЙ БАЙТ ROM*********************             
            CALL       DEL_SEC
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL+3
            SWAPF      SERIAL+3,W
            ANDLW      0x0F
      ;СТАРШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL8
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT8
LITERAL8    MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT8
            MOVFW      SERIAL+3
            ANDLW      0x0F
       ;МЛАДШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL9
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT9
LITERAL9    MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT9
;***********6-ОЙ БАЙТ ROM*********************             
            CALL       DEL_SEC
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL+4
            SWAPF      SERIAL+4,W
            ANDLW      0x0F
            ADDLW      0x30
            CALL       W_DATA_LCD
            MOVFW      SERIAL+4
            ANDLW      0x0F
            ADDLW      0x30
            CALL       W_DATA_LCD
;***********7-ОЙ БАЙТ ROM*********************             
            CALL       DEL_SEC
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL+5
            SWAPF      SERIAL+5,W
            ANDLW      0x0F
            ADDLW      0x30
            CALL       W_DATA_LCD
            MOVFW      SERIAL+5
            ANDLW      0x0F
            ADDLW      0x30
            CALL       W_DATA_LCD
;***********8-ОЙ БАЙТ ROM*********************             
            CALL       DEL_SEC
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      CRC
            SWAPF      CRC,W
            ANDLW      0x0F
      ;СТАРШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL10
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT10
LITERAL10   MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT10
            MOVFW      CRC
            ANDLW      0x0F
       ;МЛАДШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII
            MOVWF      TMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LITERAL11
            MOVFW      TMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT11
LITERAL11   MOVFW      TMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT11
;***********НОВАЯ СТРОКА*********************             
            MOVLW      0xC0
            CALL       SET_ADDR
            MOVLW      0xF8
            CALL       W_DATA_LCD
            MOVLW      'C'
            CALL       W_DATA_LCD
            CALL       DEL_SEC
            CALL       DEL_SEC
            RETLW       .0
;=================================================================================
 ; чтение температуры из DS18B20
CELSIO ;
;========================================
; измерение температуры ;
            call       DOUT_LOW     ; слот чтения для контроля
            call       DOUT_HIGH    ; окончания конвертирования
            btfss      DALLAS       ;
            return                  ;
            btfsc      CON,0        ;
            goto       ctenie       ;
            call       RESET_DALLAS ;
            btfsc      ERROR_D,0      ;
            return                  ; датчик неисправен прервать конвертирование температуры
;========================================
            movlw      0xCC         ; формировать команду Пропустить ROM
            call       DSEND        ;
            movlw      0x44         ; формировать команду Конвертировать температуру
            call       DSEND        ;
;========================================
            bsf        CON,0          ; идет конвертирование
            return                  ;
;========================================
ctenie ; чтение температуры
            bcf        CON,0          ; конвертирование выполнено
;========================================
            call       RESET_DALLAS ;
            btfsc      ERROR_D,0      ;
            return                  ; датчик неисправен прервать чтение температуры
            movlw      0xCC        ; послать команду Пропустить ROM
            call       DSEND        ;
            movlw      0xBE        ; послать команду чтения памяти
            call       DSEND        ;
            call       DRECEIVE     ; читать 1 байт
            movf       COM_REG,W    ;
            movwf      TEMP_LO ;
            call       DRECEIVE     ; читать 2 байт
            movf       COM_REG,W ;
            movwf      TEMP_HI ;
          
            return   
;======================================================================================
            
             
RESET_DALLAS
            BSF         ERROR_D,0
            CALL        DOUT_LOW
            CALL        DEL_480us
            CALL        DOUT_HIGH
            CALL        DEL_60us
            BTFSS       DALLAS
            BCF         ERROR_D,0
            CALL        DEL_480us
            RETLW       .0
;======================================================================================
; DOUT_LOW: Эта подпрограмма устанавливает линию ДАЛЛАССа на вывод и устанавливает на ней "0"
DOUT_LOW
            BCF         DALLAS       ; установить низкий уровень на шине
            BANK1                    ; выбрать банк 1
            BCF         TRISDAL,LINE ; настроить порт на выход
            BANK0                    ; выбрать банк 0
            NOP                      ;
            NOP                      ;
            RETLW       .0           ;
;======================================================================================       
;=======================================================================================
;DOUT_HIGH: Эта подпрограмма устанавливает линию ДАЛЛАССа как ввод, продавливает высоким уровнем шину,
;а затем переводит линию на прием, внешний резистор удерживает высокий уровень  
DOUT_HIGH
           ; BSF         DALLAS       ; задержка для длинных линий для
           ; nop                    ; формирования импульса восстановления
           ; nop                    ; (на очень длинные линии)
            ; nop                    ;
            ; nop                    ;
            BANK1                    ; выбрать банк 1
            BSF         TRISDAL,LINE ; настроить порт на ввод (имитация открытого коллектора)
            BANK0                    ; выбрать банк 0
            RETLW       .0           ;
;=======================================================================================  
;=======================================================================================
; DRECEIVE: Эта подпрограмма получает данные от ДАЛЛАССКОГО чипа.
DRECEIVE
            movlw       H'08'        ; Количество получаемых бит
            movwf       TEMP1        ; Загрузка регистра счетчика
C_DRECEIVE  call        DOUT_LOW     ; старт чтения бита установить низкий уровень)
            
            call        DOUT_HIGH    ; начать чтение
            btfss       DALLAS       ; проверить уровень на линии DALLAS1
            bcf         STATUS,C     ; установить С в "0"
            btfsc       DALLAS       ; проверить уровень на линии DALLAS1
            bsf         STATUS,C     ; нет установить С в "1"
            rrf         COM_REG,F    ; сдвиг вправо для записи в регистре COM_REG
            call        DLIT_WR      ; ожидать для окончания формирование далласом бита
            decfsz      TEMP1,F      ;
            goto        C_DRECEIVE   ;
            retlw       H'00'        ;
;=======================================================================================
 
;=======================================================================================
; DSEND: Эта подпрограмма посылает команды к DS1820. Данные
; посылается младшим битом сначала без четности, останова, или битов начала
DSEND
            movwf       COM_REG      ; Загрузка бофера команд для пересылки
            movlw       H'08'        ; Количество битов для пересылки
            movwf       TEMP1        ;
C_DSEND     call        DOUT_LOW     ; Start the write slot
            rrf         COM_REG,F    ; Сдвиг вправо, чтобы определить через бит С первый бит для пересылки
            btfss       STATUS,C     ; Смотреть бит С == 1
            goto        SEND0        ;
            call        DOUT_HIGH    ; Установить линию в "1" если бит С == 1
            goto        DS_1         ;
SEND0       call        DOUT_LOW     ; Установить линию в "0", если бит С == 0
DS_1        call        DLIT_WR      ; Ожидать 60uS, чтобы позволить DS1820 выполнить выборку
            call        DOUT_HIGH    ; Установить шину в "1"
            decfsz      TEMP1,F      ; Уменьшить счетчик переданных битов и проверить достигнут ли ноль
            goto        C_DSEND      ; Повторить передачу бита
            retlw       H'00'        ;
;=======================================================================================
;=======================================================================================
; DLIT_WR: Эта подпрограмма используется в ходе работы подпрограмм связи
; задержка 60 mks, в которая необходима DS1820 для чтения или записи бита данных.
DLIT_WR                              ;
            movlw      .20 ;.20 - 60mks
            movwf      TEMP0         ;
            decfsz     TEMP0,F       ;
            goto       $-.1          ;
            retlw      H'00'         ;
;=======================================================================================
INIT_LCD    CALL       DEL_15ms
            MOVLW      .3
            CALL       W_NIBLE_LCD
            CALL       DEL_15ms
            MOVLW      .3
            CALL       DEL_480us
            MOVLW      0x32
            CALL       W_CMD_LCD
            MOVLW      0x28
            CALL       W_CMD_LCD
            MOVLW      0x08
            CALL       W_CMD_LCD
            MOVLW      0x01
            CALL       W_CMD_LCD
            CALL       DEL_15ms
            MOVLW      0x06
            CALL       W_CMD_LCD
            MOVLW      0x0C
            CALL       W_CMD_LCD
            RETLW      .0
            
W_CMD_LCD   MOVWF      TEMP0
            SWAPF      TEMP0,W
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BCF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            MOVFW      TEMP0
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0
W_NIBLE_LCD ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BCF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0          
W_DATA_LCD  MOVWF      TEMP0
            SWAPF      TEMP0,W
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            MOVFW      TEMP0
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0
SET_ADDR    CALL        W_CMD_LCD
            RETLW       .0            
DEL_480us   MOVLW       .5
            MOVWF       J
            MOVLW       .31
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0
            
DEL_60us    MOVLW       .18
            MOVWF       J
            DECFSZ      J,F
            GOTO        $-.1
            RETLW       .0
            
DEL_15ms    MOVLW       .20
            MOVWF       J
            MOVLW       .255
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0
                          
DEL_200ms   MOVLW       .255
            MOVWF       J
            MOVLW       .255
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0

DEL_SEC     MOVLW       .5
            MOVWF       K
            CALL        DEL_200ms
            DECFSZ      K,F
            GOTO        $-.2
            RETLW       .0
DISP_TEMP
            MOVFW       TEMP_HI     ;В TEMP_HI в старшем полубайте находится знак
                                    ;Если полубайт = 0xFX,то датчик измерял температуру
                                    ;со знаком "-",если полубайт =0х0X,то коружающая
                                    ;температура "+"
            ANDLW       0xF0        ;Чистим младший полубайт
            SUBLW       0x00        ;Проверяем равен ли он 0-лю
            BTFSC       STATUS,Z
            GOTO        SET_PLUS    ;Полубайт равен нулю идем на преобразование
                                    ;Плюсовой температуры
            MOVLW       0xC4        ;Полубайт не равен 0-лю,преобразуем по минусу
            CALL        SET_ADDR
            MOVLW       '-'
            CALL        W_DATA_LCD
            GOTO        SHOW_MINUS_ONE
SET_PLUS    MOVLW       0xC4
            CALL        SET_ADDR
            MOVLW       '+'
            CALL        W_DATA_LCD
                    
SHOW_ONE    SWAPF       TEMP_LO,W   ;Преместим температуру в один регистр
            MOVWF       TMP
            SWAPF       TEMP_HI,W
            ANDLW       0xF0
            IORWF       TMP,F
            MOVFW       TMP
            ANDLW       B'01111111'
            MOVWF       TMP
            MOVFW       TMP
            ADDLW       0xF6        ;Проверяем тепература меньше 9-ти
            BTFSC       STATUS,C
            GOTO        SHOW_TEN1   ;Нет больше 9-ти
            
;***********Выводим на ЖКИ температуру до 9-ти******************         
            MOVLW       0xC5        
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x30
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 19-ти******************            
SHOW_TEN1   MOVFW       TMP
            ADDLW       0xEC
            BTFSC       STATUS,C
            GOTO        SHOW_TEN2
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x26
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 29-ти******************            
SHOW_TEN2   MOVFW       TMP
            ADDLW       0xE2
            BTFSC       STATUS,C
            GOTO        SHOW_TEN3
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x1C
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD        
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 39-ти******************            
SHOW_TEN3   MOVFW       TMP
            ADDLW       0xD8
            BTFSC       STATUS,C
            GOTO        SHOW_TEN4
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x33
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x12
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 49-ти******************            
SHOW_TEN4   MOVFW       TMP
            ADDLW       0xCE
            BTFSC       STATUS,C
            GOTO        SHOW_TEN5
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x34
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x08
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD        
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 59-ти******************
SHOW_TEN5   MOVFW       TMP
            ADDLW       0xC4
            BTFSC       STATUS,C
            GOTO        SHOW_TEN6
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x35
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xFE
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 69-ти******************            
SHOW_TEN6   MOVFW       TMP
            ADDLW       0xBA
            BTFSC       STATUS,C
            GOTO        SHOW_TEN7
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x36
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xF4
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD        
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 79-ти******************            
SHOW_TEN7   MOVFW       TMP
            ADDLW       0xB0
            BTFSC       STATUS,C
            GOTO        SHOW_TEN8
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x37
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xEA
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 89-ти******************            
SHOW_TEN8   MOVFW       TMP
            ADDLW       0xA6
            BTFSC       STATUS,C
            GOTO        SHOW_TEN9
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x38
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xE0
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 99-ти******************            
SHOW_TEN9   MOVFW       TMP
            ADDLW       0x9C
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED0
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x39
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xD6
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 109-ти******************            
SHOW_HUNDRED0
            MOVFW       TMP
            ADDLW       0x92
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED1  
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVLW       0x30
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xCC
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 119-ти******************            
SHOW_HUNDRED1  
            MOVFW       TMP
            ADDLW       0x88
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED2
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xC2
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 128-ми******************            
SHOW_HUNDRED2  
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xB8
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
            
            
SHOW_MINUS_ONE    
            SWAPF       TEMP_LO,W   ;Преместим температуру в один регистр
            MOVWF       TMP
            SWAPF       TEMP_HI,W
            ANDLW       0xF0
            IORWF       TMP,F
            MOVFW       TMP
            ANDLW       B'01111111'
            MOVWF       TMP
;***********Проверяем тепература меньше 9-ти            
            MOVFW       TMP
            ADDLW       0x89
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN1   ;Нет больше 9-ти
            
;***********Выводим на ЖКИ температуру до 9-ти******************         
            MOVLW       0xC5        
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0xB0
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 19-ти******************            
SHOW_MINUS_TEN1   
            MOVFW       TMP
            ADDLW       0x93
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN2
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0xA6
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN2
            MOVFW       TMP
            ADDLW       0x9D
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN3
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x9C
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP  
SHOW_MINUS_TEN3
            MOVFW       TMP
            ADDLW       0xA7
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN4
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x33
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x92
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN4
            MOVFW       TMP
            ADDLW       0xB1
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN5
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x34
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x88
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN5
            MOVFW       TMP
            ADDLW       0xBB
            BTFSS       STATUS,C
            GOTO        GET_TEMP
            MOVLW       0xC5
            CALL        SET_ADDR
            MOVLW       0x35
            CALL        W_DATA_LCD
            MOVLW       0xC6
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x7E
            CALL        W_DATA_LCD
            MOVLW       0xC7
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD                                                                    
GET_TEMP     
            RETLW       .0   
            END

;РАБОТАЕТ В ЖЕЛЕЗЕ

            LIST        P=16F628A
            INCLUDE     P16F628A.INC
            __CONFIG    _INTOSC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_LVP_OFF
            ERRORLEVEL  -302
; описание портов подключения датчика.
            #DEFINE     SIGN        0xCA
            #DEFINE     UNIT        0xCB
            #DEFINE     TENS        0xCC
            #DEFINE     HUNDREDS    0xCD
            #DEFINE     COMMA       0xCE
            #DEFINE     LCD_TRIS    TRISB
            #define     DATA_PORT   PORTB
            #DEFINE     RS_TRIS     TRISA,1
            #DEFINE     E_TRIS      TRISA,2
            #define     RS          PORTA,1
            #define     E           PORTA,2
            #define     TRISDAL     TRISA     ; регистр управления порта ДАЛЛАСА
            #define     PORTDAL     PORTA     ; регистр данных порта ДАЛЛАСА
            #define     LINE        0         ; линия порта ДАЛЛАСА
            #define     DALLAS      PORTA,0   ; шина связи с ДАЛЛАСОМ
            CBLOCK      20H
            I:1,J:1,CON:1,ERROR_D:1,TEMP_HI:1,TEMP_LO:1
            COM_REG:1,COUNT:1,TEMP0:1,TEMP1:1,TMP:1,FAMILY:1
            SERIAL:6,CRC:1,K:1,HEXTEMP:1,HEXTMP:1
            ENDC
BANK0       MACRO
            BCF         STATUS,RP0
            BCF         STATUS,RP1
            ENDM
BANK1       MACRO
            BSF         STATUS,RP0
            BCF         STATUS,RP1
            ENDM
            ORG         0
            GOTO        START
START       MOVLW       7
            MOVWF       CMCON       ;Отключаем компаратор
            CLRF        PORTB       ;Чистим все регистры
            CLRF        PORTA
            CLRF        TMP
            CLRF        TEMP_LO
            CLRF        TEMP_LO
            CLRF        COM_REG
            CLRF        CON
            CLRF        ERROR_D
            BANK1
            BCF         RS_TRIS      ;Устанавливаем направление Ввода\Вывода
            BCF         E_TRIS
            MOVLW       B'11110000'
            MOVWF       LCD_TRIS
            BANK0
            
            CALL        INIT_LCD     ;Настраиваем ЖКИ
;***********Тест ЖКИ*******************************************************
            MOVLW       0x80
            CALL        SET_ADDR
            MOVLW       0xAB
            CALL        DISP_HEX
            MOVLW       0xCD
            CALL        DISP_HEX
            MOVLW       0xEF
            CALL        DISP_HEX
            MOVLW       0x12
            CALL        DISP_HEX
            MOVLW       0x34
            CALL        DISP_HEX
            MOVLW       0x56
            CALL        DISP_HEX
            MOVLW       0x78
            CALL        DISP_HEX
            MOVLW       0x9A
            CALL        DISP_HEX
            
            MOVLW       0xC0
            CALL        SET_ADDR
            MOVLW       0x12
            CALL        DISP_HEX
            MOVLW       0x34
            CALL        DISP_HEX
            MOVLW       0x56
            CALL        DISP_HEX
            MOVLW       0x78
            CALL        DISP_HEX
            MOVLW       0x9A
            CALL        DISP_HEX
            MOVLW       0xBC
            CALL        DISP_HEX
            MOVLW       0xDE
            CALL        DISP_HEX
            MOVLW       0xF1
            CALL        DISP_HEX
            CALL        DEL_SEC
            CALL        DISP_CLEAR
            
;***********Главный цикл программы*************            
MAIN        CALL        CLEAR_STRING
            CALL        DEL_SEC
            CALL        READ_ROM
            MOVLW       0x80
            CALL        SET_ADDR
            MOVFW       FAMILY
            CALL        DISP_HEX
            CALL        DEL_SEC
            MOVFW       SERIAL
            CALL        DISP_HEX
            CALL        DEL_SEC
            MOVFW       SERIAL+1
            CALL        DISP_HEX
            CALL        DEL_SEC
            MOVFW       SERIAL+2
            CALL        DISP_HEX
            CALL        DEL_SEC
            MOVFW       SERIAL+3
            CALL        DISP_HEX
            CALL        DEL_SEC
            MOVFW       SERIAL+4
            CALL        DISP_HEX
            CALL        DEL_SEC
            MOVFW       SERIAL+5
            CALL        DISP_HEX
            CALL        DEL_SEC
            MOVFW       CRC
            CALL        DISP_HEX
            CALL        DEL_SEC
            CALL        CELSIO      ;Измеряем температуру
                                    ;Температура после измерения находится
                                    ;в 2-ух байтах - TEMP_HI и TEMP_LO
            
            CALL        DISP_TEMP
            
            MOVLW       0xC0
            CALL        SET_ADDR
            MOVFW       TEMP_HI
            CALL        DISP_HEX
            MOVFW       TEMP_LO
            CALL        DISP_HEX
            MOVLW       ' '
            CALL        W_DATA_LCD
            MOVLW       'H'
            CALL        W_DATA_LCD
            MOVLW       'e'
            CALL        W_DATA_LCD
            MOVLW       'x'
            CALL        W_DATA_LCD
            MOVLW       0xCE
            CALL        SET_ADDR
            MOVLW       0xDF
            CALL        W_DATA_LCD
            MOVLW       'C'
            CALL        W_DATA_LCD
            GOTO        MAIN
;***********************************************


;=================================================================================
 ; чтение температуры из DS18B20
CELSIO ;
;========================================
; измерение температуры ;
            call       DOUT_LOW     ; слот чтения для контроля
            call       DOUT_HIGH    ; окончания конвертирования
            btfss      DALLAS       ;
            return                  ;
            btfsc      CON,0        ;
            goto       ctenie       ;
            call       RESET_DALLAS ;
            btfsc      ERROR_D,0      ;
            return                  ; датчик неисправен прервать конвертирование температуры
;========================================
            movlw      0xCC         ; формировать команду Пропустить ROM
            call       DSEND        ;
            movlw      0x44         ; формировать команду Конвертировать температуру
            call       DSEND        ;
;========================================
            bsf        CON,0          ; идет конвертирование
            return                  ;
;========================================
ctenie ; чтение температуры
            bcf        CON,0          ; конвертирование выполнено
;========================================
            call       RESET_DALLAS ;
            btfsc      ERROR_D,0      ;
            return                  ; датчик неисправен прервать чтение температуры
            movlw      0xCC        ; послать команду Пропустить ROM
            call       DSEND        ;
            movlw      0xBE        ; послать команду чтения памяти
            call       DSEND        ;
            call       DRECEIVE     ; читать 1 байт
            movf       COM_REG,W    ;
            movwf      TEMP_LO ;
            call       DRECEIVE     ; читать 2 байт
            movf       COM_REG,W ;
            movwf      TEMP_HI ;
          
            return   
;======================================================================================
            
             
RESET_DALLAS
            BSF         ERROR_D,0
            CALL        DOUT_LOW
            CALL        DEL_480us
            CALL        DOUT_HIGH
            CALL        DEL_60us
            BTFSS       DALLAS
            BCF         ERROR_D,0
            CALL        DEL_480us
            RETLW       .0
;======================================================================================
; DOUT_LOW: Эта подпрограмма устанавливает линию ДАЛЛАССа на вывод и устанавливает на ней "0"
DOUT_LOW
            BCF         DALLAS       ; установить низкий уровень на шине
            BANK1                    ; выбрать банк 1
            BCF         TRISDAL,LINE ; настроить порт на выход
            BANK0                    ; выбрать банк 0
            NOP                      ;
            NOP                      ;
            RETLW       .0           ;
;======================================================================================       
;=======================================================================================
;DOUT_HIGH: Эта подпрограмма устанавливает линию ДАЛЛАССа как ввод, продавливает высоким уровнем шину,
;а затем переводит линию на прием, внешний резистор удерживает высокий уровень  
DOUT_HIGH
           ; BSF         DALLAS       ; задержка для длинных линий для
           ; nop                    ; формирования импульса восстановления
           ; nop                    ; (на очень длинные линии)
            ; nop                    ;
            ; nop                    ;
            BANK1                    ; выбрать банк 1
            BSF         TRISDAL,LINE ; настроить порт на ввод (имитация открытого коллектора)
            BANK0                    ; выбрать банк 0
            RETLW       .0           ;
;=======================================================================================  
;=======================================================================================
; DRECEIVE: Эта подпрограмма получает данные от ДАЛЛАССКОГО чипа.
DRECEIVE
            movlw       H'08'        ; Количество получаемых бит
            movwf       TEMP1        ; Загрузка регистра счетчика
C_DRECEIVE  call        DOUT_LOW     ; старт чтения бита установить низкий уровень)
            
            call        DOUT_HIGH    ; начать чтение
            btfss       DALLAS       ; проверить уровень на линии DALLAS1
            bcf         STATUS,C     ; установить С в "0"
            btfsc       DALLAS       ; проверить уровень на линии DALLAS1
            bsf         STATUS,C     ; нет установить С в "1"
            rrf         COM_REG,F    ; сдвиг вправо для записи в регистре COM_REG
            call        DLIT_WR      ; ожидать для окончания формирование далласом бита
            decfsz      TEMP1,F      ;
            goto        C_DRECEIVE   ;
            retlw       H'00'        ;
;=======================================================================================
 
;=======================================================================================
; DSEND: Эта подпрограмма посылает команды к DS1820. Данные
; посылается младшим битом сначала без четности, останова, или битов начала
DSEND
            movwf       COM_REG      ; Загрузка бофера команд для пересылки
            movlw       H'08'        ; Количество битов для пересылки
            movwf       TEMP1        ;
C_DSEND     call        DOUT_LOW     ; Start the write slot
            rrf         COM_REG,F    ; Сдвиг вправо, чтобы определить через бит С первый бит для пересылки
            btfss       STATUS,C     ; Смотреть бит С == 1
            goto        SEND0        ;
            call        DOUT_HIGH    ; Установить линию в "1" если бит С == 1
            goto        DS_1         ;
SEND0       call        DOUT_LOW     ; Установить линию в "0", если бит С == 0
DS_1        call        DLIT_WR      ; Ожидать 60uS, чтобы позволить DS1820 выполнить выборку
            call        DOUT_HIGH    ; Установить шину в "1"
            decfsz      TEMP1,F      ; Уменьшить счетчик переданных битов и проверить достигнут ли ноль
            goto        C_DSEND      ; Повторить передачу бита
            retlw       H'00'        ;
;=======================================================================================
;=======================================================================================
; DLIT_WR: Эта подпрограмма используется в ходе работы подпрограмм связи
; задержка 60 mks, в которая необходима DS1820 для чтения или записи бита данных.
DLIT_WR                              ;
            movlw      .20 ;.20 - 60mks
            movwf      TEMP0         ;
            decfsz     TEMP0,F       ;
            goto       $-.1          ;
            retlw      H'00'         ;
;=======================================================================================
;Подпрограмма инициализации ЖКИ-читаем даташит
INIT_LCD    CALL       DEL_15ms
            MOVLW      .3
            CALL       W_NIBLE_LCD
            CALL       DEL_15ms
            MOVLW      .3
            CALL       DEL_480us
            MOVLW      0x32
            CALL       W_CMD_LCD
            MOVLW      0x28
            CALL       W_CMD_LCD
            MOVLW      0x08
            CALL       W_CMD_LCD
            CALL       DISP_CLEAR
            MOVLW      0x06
            CALL       W_CMD_LCD
            MOVLW      0x0C
            CALL       W_CMD_LCD
            RETLW      .0
            
W_CMD_LCD   MOVWF      TEMP0
            SWAPF      TEMP0,W
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BCF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            MOVFW      TEMP0
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0
W_NIBLE_LCD ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BCF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0          
W_DATA_LCD  MOVWF      TEMP0
            SWAPF      TEMP0,W
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        RS
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            MOVFW      TEMP0
            ANDLW      B'00001111'
            MOVWF      DATA_PORT
            BSF        E
            NOP
            BCF        E
            CALL       DEL_60us
            RETLW      .0
;******************************************************************
;***********Подпрограмма установки позиции курсора*****************
SET_ADDR    CALL        W_CMD_LCD
            RETLW       .0   
;******************************************************************  
DISP_CLEAR
            MOVLW       0x01
            CALL        W_CMD_LCD
            CALL        DEL_15ms
            RETLW       .0
;***********Всякие подпрограммы задержки***************************       
DEL_480us   MOVLW       .5
            MOVWF       J
            MOVLW       .31
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0
            
DEL_60us    MOVLW       .18
            MOVWF       J
            DECFSZ      J,F
            GOTO        $-.1
            RETLW       .0
            
DEL_15ms    MOVLW       .20
            MOVWF       J
            MOVLW       .255
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0
                          
DEL_200ms   MOVLW       .255
            MOVWF       J
            MOVLW       .255
            MOVWF       I
            DECFSZ      I,F
            GOTO        $-.1
            DECFSZ      J,F
            GOTO        $-.5
            RETLW       .0

DEL_SEC     MOVLW       .1
            MOVWF       K
            CALL        DEL_200ms
            DECFSZ      K,F
            GOTO        $-.2
            RETLW       .0
;***************************************************************************************

;***********Подпрограмма вывода температуры на ЖКИ**************************************
DISP_TEMP
            MOVFW       TEMP_HI     ;В TEMP_HI в старшем полубайте находится знак
                                    ;Если полубайт = 0xFX,то датчик измерял температуру
                                    ;со знаком "-",если полубайт =0х0X,то коружающая
                                    ;температура "+"
            ANDLW       0xF0        ;Чистим младший полубайт
            SUBLW       0x00        ;Проверяем равен ли он 0-лю
            BTFSC       STATUS,Z
            GOTO        SET_PLUS    ;Полубайт равен нулю идем на преобразование
                                    ;Плюсовой температуры
            MOVLW       SIGN        ;Полубайт не равен 0-лю,преобразуем по минусу
            CALL        SET_ADDR
            MOVLW       '-'
            CALL        W_DATA_LCD
            GOTO        SHOW_MINUS_ONE
SET_PLUS    MOVLW       SIGN
            CALL        SET_ADDR
            MOVLW       '+'
            CALL        W_DATA_LCD
                    
SHOW_ONE    SWAPF       TEMP_LO,W   ;Преместим температуру в один регистр
            ANDLW       0x0F
            MOVWF       TMP
            SWAPF       TEMP_HI,W
            ANDLW       0xF0
            IORWF       TMP,F
            MOVFW       TMP
            ADDLW       0xF6        ;Проверяем тепература меньше 9-ти
            BTFSC       STATUS,C
            GOTO        SHOW_TEN1   ;Нет больше 9-ти
            
;***********Выводим на ЖКИ температуру до 9-ти******************         
            MOVLW       UNIT        
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x30
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 19-ти******************            
SHOW_TEN1   MOVFW       TMP
            ADDLW       0xEC
            BTFSC       STATUS,C
            GOTO        SHOW_TEN2
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x26
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 29-ти******************            
SHOW_TEN2   MOVFW       TMP
            ADDLW       0xE2
            BTFSC       STATUS,C
            GOTO        SHOW_TEN3
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x1C
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD        
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 39-ти******************            
SHOW_TEN3   MOVFW       TMP
            ADDLW       0xD8
            BTFSC       STATUS,C
            GOTO        SHOW_TEN4
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x33
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x12
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 49-ти******************            
SHOW_TEN4   MOVFW       TMP
            ADDLW       0xCE
            BTFSC       STATUS,C
            GOTO        SHOW_TEN5
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x34
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0x08
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD        
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 59-ти******************
SHOW_TEN5   MOVFW       TMP
            ADDLW       0xC4
            BTFSC       STATUS,C
            GOTO        SHOW_TEN6
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x35
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xFE
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 69-ти******************            
SHOW_TEN6   MOVFW       TMP
            ADDLW       0xBA
            BTFSC       STATUS,C
            GOTO        SHOW_TEN7
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x36
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xF4
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD        
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 79-ти******************            
SHOW_TEN7   MOVFW       TMP
            ADDLW       0xB0
            BTFSC       STATUS,C
            GOTO        SHOW_TEN8
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x37
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xEA
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 89-ти******************            
SHOW_TEN8   MOVFW       TMP
            ADDLW       0xA6
            BTFSC       STATUS,C
            GOTO        SHOW_TEN9
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x38
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xE0
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 99-ти******************            
SHOW_TEN9   MOVFW       TMP
            ADDLW       0x9C
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED0
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x39
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            ADDLW       0xD6
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 109-ти******************            
SHOW_HUNDRED0
            MOVFW       TMP
            ADDLW       0x92
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED1  
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVLW       0x30
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xCC
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 119-ти******************            
SHOW_HUNDRED1  
            MOVFW       TMP
            ADDLW       0x88
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED2
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xC2
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 128-ми******************            
SHOW_HUNDRED2  
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xB8
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
            
            
SHOW_MINUS_ONE    
            SWAPF       TEMP_LO,W   ;Преместим температуру в один регистр
            MOVWF       TMP
            SWAPF       TEMP_HI,W
            ANDLW       0xF0
            IORWF       TMP,F
            MOVFW       TMP
            ANDLW       B'01111111'
            MOVWF       TMP
;***********Проверяем тепература меньше 9-ти            
            MOVFW       TMP
            ADDLW       0x89
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN1   ;Нет больше 9-ти
            
;***********Выводим на ЖКИ температуру до 9-ти******************         
            MOVLW       UNIT        
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0xB0
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 19-ти******************            
SHOW_MINUS_TEN1   
            MOVFW       TMP
            ADDLW       0x93
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN2
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0xA6
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN2
            MOVFW       TMP
            ADDLW       0x9D
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN3
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x9C
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP  
SHOW_MINUS_TEN3
            MOVFW       TMP
            ADDLW       0xA7
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN4
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x33
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x92
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN4
            MOVFW       TMP
            ADDLW       0xB1
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN5
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x34
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x88
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN5
            MOVFW       TMP
            ADDLW       0xBB
            BTFSS       STATUS,C
            GOTO        GET_TEMP
            MOVLW       UNIT
            CALL        SET_ADDR
            MOVLW       0x35
            CALL        W_DATA_LCD
            MOVLW       TENS
            CALL        SET_ADDR
            MOVFW       TMP
            SUBLW       0x7E
            CALL        W_DATA_LCD
            MOVLW       HUNDREDS
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD                                                                    
GET_TEMP     
            RETLW       .0  
;***********************************************

;***********Подпрограмма чтения ROM датчика*****            
READ_ROM
            CALL       DOUT_LOW
            CALL       DOUT_HIGH  
            BTFSS      DALLAS
            RETURN
            CALL       RESET_DALLAS
            BTFSC      ERROR_D,0
            RETURN
            MOVLW      0x33
            CALL       DSEND
            
;***********1-ЫЙ БАЙТ ROM*********************
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      FAMILY
            
;***********2-ОЙ БАЙТ ROM*********************  
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL
;***********3-ИЙ БАЙТ ROM*********************  
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL+1
;***********4-ЫЙ БАЙТ ROM*********************
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL+2
;***********5-ЫЙ БАЙТ ROM*********************
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL+3
;***********6-ОЙ БАЙТ ROM*********************   
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL+4
;***********7-ОЙ БАЙТ ROM*********************   
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      SERIAL+5
;***********8-ОЙ БАЙТ ROM*********************  
            CALL       DRECEIVE
            MOVF       COM_REG,W
            MOVWF      CRC
            RETLW       .0
;*********************************************

;***********Подпрограмма преобразования вывода на ЖКИ шеснадцатитеричного числа******
;Передвызовом этой подпрограммы нужно установить курсор в желаемую позицию и в
;WREG поместить число.    
DISP_HEX    
            MOVWF      HEXTEMP
            SWAPF      HEXTEMP,W
            ANDLW      0x0F
;***********СТАРШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII**************
            MOVWF      HEXTMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LIT_HI
            MOVFW      HEXTMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       NEXT
LIT_HI      MOVFW      HEXTMP
            ADDLW      0x37
            CALL       W_DATA_LCD
        
NEXT        MOVFW      HEXTEMP
            ANDLW      0x0F
;***********МЛАДШИЙ ПОЛУБАЙТ КОНВЕРТАЦИЯ HEX В ASCII***************
            MOVWF      HEXTMP
            ADDLW      0xF6        ;Проверяем меньше 9-ти
            BTFSC      STATUS,C
            GOTO       LIT_LO
            MOVFW      HEXTMP
            ADDLW      0x30
            CALL       W_DATA_LCD
            GOTO       EXIT
LIT_LO      MOVFW      HEXTMP
            ADDLW      0x37
            CALL       W_DATA_LCD   
EXIT
            RETLW      .0  
            
            
CLEAR_STRING
            MOVLW      0x80
            CALL       SET_ADDR
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            MOVLW      ' '
            CALL       W_DATA_LCD
            RETLW      .0                  
            END


 

 

НАЗАД                                                                         ДАЛЬШЕ