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,HEXTEMP:1,HEXTMP:1,FRACTION:1
            SIGN: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
            MOVLW       0xC7
            MOVWF       SIGN
          ;  MOVLW       .1
         ;   SUBWF       SIGN,W
            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   DECF        SIGN,W            ;Чистим предыдущие + и -
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            MOVLW       .2
            SUBWF        SIGN,W
            CALL        SET_ADDR
            MOVLW       ' '
            CALL        W_DATA_LCD
            
            MOVFW       TEMP_HI     ;В TEMP_HI в старшем полубайте находится знак
                                    ;Если полубайт = 0xFX,то датчик измерял температуру
                                    ;со знаком "-",если полубайт =0х0X,то коружающая
                                    ;температура "+"
            ANDLW       0xF0        ;Чистим младший полубайт
            SUBLW       0x00        ;Проверяем равен ли он 0-лю
            BTFSC       STATUS,Z
            GOTO        SET_PLUS    ;Полубайт равен нулю идем на преобразование
                                    ;Плюсовой температуры
            
            MOVFW       SIGN
            CALL        SET_ADDR
            MOVLW       '-'
            CALL        W_DATA_LCD
            GOTO        SHOW_MINUS_ONE
SET_PLUS    MOVFW       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-ти******************    
            MOVFW       TMP
            ADDLW       0x30
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 19-ти******************            
SHOW_TEN1   DECF        SIGN,W
            CALL        SET_ADDR
            MOVLW       '+'
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xEC
            BTFSC       STATUS,C
            GOTO        SHOW_TEN2
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0x26
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 29-ти******************            
SHOW_TEN2   MOVFW       TMP
            ADDLW       0xE2
            BTFSC       STATUS,C
            GOTO        SHOW_TEN3
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0x1C
            CALL        W_DATA_LCD       
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 39-ти******************            
SHOW_TEN3   MOVFW       TMP
            ADDLW       0xD8
            BTFSC       STATUS,C
            GOTO        SHOW_TEN4
            MOVLW       0x33
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0x12
            CALL        W_DATA_LCD      
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 49-ти******************            
SHOW_TEN4   MOVFW       TMP
            ADDLW       0xCE
            BTFSC       STATUS,C
            GOTO        SHOW_TEN5
            MOVLW       0x34
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0x08
            CALL        W_DATA_LCD       
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 59-ти******************
SHOW_TEN5   MOVFW       TMP
            ADDLW       0xC4
            BTFSC       STATUS,C
            GOTO        SHOW_TEN6
            MOVLW       0x35
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xFE
            CALL        W_DATA_LCD       
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 69-ти******************            
SHOW_TEN6   MOVFW       TMP
            ADDLW       0xBA
            BTFSC       STATUS,C
            GOTO        SHOW_TEN7
            MOVLW       0x36
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xF4
            CALL        W_DATA_LCD      
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 79-ти******************            
SHOW_TEN7   MOVFW       TMP
            ADDLW       0xB0
            BTFSC       STATUS,C
            GOTO        SHOW_TEN8
            MOVLW       0x37
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xEA
            CALL        W_DATA_LCD       
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 89-ти******************            
SHOW_TEN8   MOVFW       TMP
            ADDLW       0xA6
            BTFSC       STATUS,C
            GOTO        SHOW_TEN9
            MOVLW       0x38
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xE0
            CALL        W_DATA_LCD        
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 99-ти******************            
SHOW_TEN9   MOVFW       TMP
            ADDLW       0x9C
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED0
            MOVLW       0x39
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xD6
            CALL        W_DATA_LCD      
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 109-ти******************            
SHOW_HUNDRED0
            MOVLW       .2
            SUBWF        SIGN,W
            CALL        SET_ADDR
            MOVLW       '+'
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0x92
            BTFSC       STATUS,C
            GOTO        SHOW_HUNDRED1
            MOVLW       0x31
            CALL        W_DATA_LCD
            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       0x31
            CALL        W_DATA_LCD
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVFW       TMP
            ADDLW       0xC2
            CALL        W_DATA_LCD         
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 128-ми******************            
SHOW_HUNDRED2  
            MOVLW       0x31
            CALL        W_DATA_LCD
            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-ти******************    
            MOVFW       TMP
            SUBLW       0xB0
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
;***********Выводим на ЖКИ температуру до 19-ти******************            
SHOW_MINUS_TEN1
            DECF        SIGN,W
            CALL        SET_ADDR
            MOVLW       '-'
            CALL        W_DATA_LCD  
            MOVFW       TMP
            ADDLW       0x93
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN2
            MOVLW       0x31
            CALL        W_DATA_LCD
            MOVFW       TMP
            SUBLW       0xA6
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN2
            MOVFW       TMP
            ADDLW       0x9D
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN3
            MOVLW       0x32
            CALL        W_DATA_LCD
            MOVFW       TMP
            SUBLW       0x9C
            CALL        W_DATA_LCD
            GOTO        GET_TEMP  
SHOW_MINUS_TEN3
            MOVFW       TMP
            ADDLW       0xA7
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN4
            MOVLW       0x33
            CALL        W_DATA_LCD
            MOVFW       TMP
            SUBLW       0x92
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN4
            MOVFW       TMP
            ADDLW       0xB1
            BTFSS       STATUS,C
            GOTO        SHOW_MINUS_TEN5
            MOVLW       0x34
            CALL        W_DATA_LCD
            MOVFW       TMP
            SUBLW       0x88
            CALL        W_DATA_LCD
            GOTO        GET_TEMP
SHOW_MINUS_TEN5
            MOVFW       TMP
            ADDLW       0xBB
            BTFSS       STATUS,C
            GOTO        GET_TEMP
            MOVLW       0x35
            CALL        W_DATA_LCD
            MOVFW       TMP
            SUBLW       0x7E
            CALL        W_DATA_LCD                                                                   
GET_TEMP    
            CALL        DISP_FRACTION
            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  
;*********************************************************************
;*********************************************************************
DISP_FRACTION
            MOVLW      '.'
            CALL       W_DATA_LCD
            MOVFW      TEMP_LO
            ANDLW      0x0F
            MOVWF      FRACTION
            SUBLW      .0
            BTFSS      STATUS,Z
            GOTO       CHEK_0
            MOVLW      '0'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_0      MOVFW      FRACTION
            SUBLW      0x01
            BTFSS      STATUS,Z
            GOTO       CHEK_2
            MOVLW      '0'
            CALL       W_DATA_LCD
            MOVLW      '6'
            CALL       W_DATA_LCD
            MOVLW      '2'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_2      MOVFW      FRACTION
            SUBLW      0x02
            BTFSS      STATUS,Z
            GOTO       CHEK_3
            MOVLW      '1'
            CALL       W_DATA_LCD
            MOVLW      '2'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_3      MOVFW      FRACTION
            SUBLW      0x03
            BTFSS      STATUS,Z
            GOTO       CHEK_4
            MOVLW      '1'
            CALL       W_DATA_LCD
            MOVLW      '8'
            CALL       W_DATA_LCD
            MOVLW      '7'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_4      MOVFW      FRACTION
            SUBLW      0x04
            BTFSS      STATUS,Z
            GOTO       CHEK_5
            MOVLW      '2'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_5      MOVFW      FRACTION
            SUBLW      0x05
            BTFSS      STATUS,Z
            GOTO       CHEK_6
            MOVLW      '3'
            CALL       W_DATA_LCD
            MOVLW      '1'
            CALL       W_DATA_LCD
            MOVLW      '2'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_6      MOVFW      FRACTION
            SUBLW      0x06
            BTFSS      STATUS,Z
            GOTO       CHEK_7
            MOVLW      '3'
            CALL       W_DATA_LCD
            MOVLW      '7'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_7      MOVFW      FRACTION
            SUBLW      0x07
            BTFSS      STATUS,Z
            GOTO       CHEK_8
            MOVLW      '4'
            CALL       W_DATA_LCD
            MOVLW      '3'
            CALL       W_DATA_LCD
            MOVLW      '7'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_8      MOVFW      FRACTION
            SUBLW      0x08
            BTFSS      STATUS,Z
            GOTO       CHEK_9
            MOVLW      '5'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_9      MOVFW      FRACTION
            SUBLW      0x09
            BTFSS      STATUS,Z
            GOTO       CHEK_A
            MOVLW      '5'
            CALL       W_DATA_LCD
            MOVLW      '6'
            CALL       W_DATA_LCD
            MOVLW      '2'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_A      MOVFW      FRACTION
            SUBLW      0x0A
            BTFSS      STATUS,Z
            GOTO       CHEK_B
            MOVLW      '6'
            CALL       W_DATA_LCD
            MOVLW      '2'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_B      MOVFW      FRACTION
            SUBLW      0x0B
            BTFSS      STATUS,Z
            GOTO       CHEK_C
            MOVLW      '6'
            CALL       W_DATA_LCD
            MOVLW      '8'
            CALL       W_DATA_LCD
            MOVLW      '7'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_C      MOVFW      FRACTION
            SUBLW      0x0C
            BTFSS      STATUS,Z
            GOTO       CHEK_D
            MOVLW      '7'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_D      MOVFW      FRACTION
            SUBLW      0x0D
            BTFSS      STATUS,Z
            GOTO       CHEK_E
            MOVLW      '8'
            CALL       W_DATA_LCD
            MOVLW      '1'
            CALL       W_DATA_LCD
            MOVLW      '2'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_E      MOVFW      FRACTION
            SUBLW      0x0E
            BTFSS      STATUS,Z
            GOTO       CHEK_F
            MOVLW      '8'
            CALL       W_DATA_LCD
            MOVLW      '7'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
            MOVLW      '0'
            CALL       W_DATA_LCD
            GOTO       RET
CHEK_F      
            MOVLW      '9'
            CALL       W_DATA_LCD
            MOVLW      '3'
            CALL       W_DATA_LCD
            MOVLW      '7'
            CALL       W_DATA_LCD
            MOVLW      '5'
            CALL       W_DATA_LCD
RET         
            RETLW      .0
;*********************************************************************
                            
            END



 НАЗАД                                                                         ДАЛЬШЕ