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
НАЗАД ДАЛЬШЕ