вход/выход данных (SDA) ; RA2, тактовая частота (SCL) ; Входной бит подпрограммы I2C ; Выходной бит подпрограммы I2C
ORG 0x004 ; вектор прерывания movwf w_temp ; сохранение текущего значения W movf STATUS,w ; перенос содержимого STATUS в W movwf statusjemp ; сохранение содержимого регистра STATUS
clrf TMR0 bcfINTCON,T0IF btfsc flags, 1 goto tempread timeread callclock btfss flags, 0 goto d_point bsf digit2, 7 bcf flags, 0 goto gohome d_point bcf digit2, 7 bsf lags, 0 decfsz disp, f
goto gohome bsf flags, 1
movlw templenght movwf disp goto gohome
очистка таймера
; сброс флага прерывания если flags<l>-=0 отображаем время если flags<l>=l отображаем температуру чтение текущего значения времени разделитель включен? если нет, то включаем разделитель сбрасываем флаг разделителя и выходим из подпрограммы иначе выключаем разделитель устанавливаем флаг разделителя уменьшаем на 1 время индикации. Врем? истекло?
нет, продолжаем отображать часы иначе устанавливаем флаг индикации температуры и загружаем в disp
длительность ее отображения
tempread call celsio
; чтение текущего значения температуры
btfss flags, О goto zerot bcf flags, 0 goto gohome zerot bsf flags, 0 decfsz disp, f
goto gohome bcf flags, 1
movlw timelenght
movwf disp movlw 0x9E movwf SLAVE movlw OxEE movwf ADDR call WRCOM
уменьшаем на 1 время индикации. Время истекло?
нет, продолжаем отображать термометр если да, сбрасываем флаг индикации температуры и устанавливаем длительность отображения времени обращаемся к термометру с командой начать новое измерение
gohome movf status_temp,w ; чтение копии регистра STATUS
movwf STATUS ; восстановление значения регистра STATUS swapf w_temp,f
swapf w_temp,w ; восстановление значения аккумулятора W retfie ; возврат из прерывания
main clrf PORTA clrf PORTB clrf flags movlw timelenght movwf disp
clrwdt ; очистка WDT и пределителя
bsf STATUS, RPO , bank 1
movlwb '01110010';
movwf OPTION_REG
movlw b'l 1110000'
movwf PORTA
movlw b'l 111011Г
movwf PORTB
bcf STATUS, RPO; bank 0 .*************************************************************
; инициализация часов (DS1307) и термометра (DS1621)
********* ***********************************************
10 Зак. № 4879 Яцснков
273
movlw 0х9Е movwf SLAVE movlw ОхАС movwf ADDR movlw OxOB movwf DATAO call WRBYTE nop
movlw 0x9E movwf SLAVE movlw OxEE movwf ADDR call WRCOM
; записываем в SLAVE адрес термометра ; адрес регистра конфигурации термометра ; режимы термометра: POL-high, ISHOT-yes
; подпрограмма записи байта
; защитный интервал
; обращение к термометру
; команда начать измерение температуры запись команды в термометр
пор
; защитный интервал
movlw OxDO movwf SLAVE movlw 0x00 movwf ADDR call RDBYTE btfss DATAI,7
goto okay movlw OxDO movwf SLAVE clrw
movwf ADDR movwf DATAO call WRBYTE nop
movlw OxDO movwf SLAVE movlw 0x01 movwf ADDR movlw 0x00 movwf DATAO call WRBYTE nop
movlw OxDO movwf SLAVE movlw 0x02 movwf ADDR movlw 0x00
; проверка пропадания питания ; установили адрес часов .установили адрес регистра состояния
; считываем регистр состояния ; если питание не пропадало, обходим ; инициализацию
; и начинаем отображать время и температуру ; иначе - инициализируем часы
; кварцевый генератор включен, ; счетчик секунд сброшен ; запись байта адрес для обращения к часам
; обнуление счетчика минут адрес для обращения к часам
; обнуление счетчика часов
movwf DATAO call WRBYTE nop
movlw OxDO movwf SLAVE movlw 0x07 movwf ADDR movlw 0x91 movwf DATAO call WRBYTE nop
; адрес для обращения к часам
; адрес контрольного регистра
; устанавливаем режим отображения 24 часа
; и частоту 4кГц на выходе Tout
okay clrf TMRO ; очищаем таймер movlw b'l 0100000'
movwf INTCON; разрешаем прерывание no TMRO
call mnmc call indJLCD btfss PORTB, 2 call hrinc call ind LCD |
repeat btfss PORTB, 1 ; нажата кнопка "+минута"?
; если да, увеличить значение минут
; иначе обновить значение на индикаторе
; нажата кнопка "+час"?
; если да, увеличить значение часов
; иначе обновить значение на индикаторе
goto repeat ***********************************
чтение текущего времени из часов *************************************************************
clock movlw OxDO movwf SLAVE movlw 0x01 movwf ADDR
call RDBYTEN ; чтение двух байтов: 01H, 02Н movf DATAI,W andlw OxOF
call convert ; табличная перекодировка movwf digit4 swapf DATAI,F movf DATAI,W andlw 0x07
call convert ; табличная перекодировка movwf digit3 movf DATAI_1,W andlw OxOF
call convert ; табличная перекодировка
movwf digit2 swapf DATAI_1,F movf DATAI_1,W andlw 0x03 btfsc STATUS,Z movlw OxOA
call convert ; табличная перекодировка
movwf digit 1
return
***************************
> >
; чтение значения температуры из термометра ;
*************************************************************
celsio movlw movwf movlw movwf b'00000000' digit 1
b'01100011' digit4
гасим первое знакоместо
символ "градус"
в четвертое знакоместо
movlw 0х9Е movwf SLAVE movlw ОхАА movwf ADDR call RDBYTEN movlw b'01000000' btfss DATAI,7
goto rotate decf DATAI,F movwf digit 1
; MSB-LSB ; символ минус
; если бит 7= 1, то температура отрицатель-: ная записали символ минус в первое знакоместо
movlw OxFF xorwf DATAI,F rotate movf DATAI,W movwf bin bcf bin,7
call binary_to_bcd ; подпрограмма конвертации
movf tens_and_ones,W
andlw OxOF
call convert
movwf digit3
swapf tens_and_ones,F
movf tens_and_ones,W
andlw OxOF
call convert
movwf digit 2 xorlw 0x3F btfss STATUS, Z return
movf digit3, w
movwf digit2
clrf digit4
movlw b'OllOOOll'
movwf digit3
movf digit2, w
xorlw 0x3F
btfss STATUS, Z
return
clrf digit 1
return
; если в 2-м знакоместе незначащий ноль
; то для лучшей читаемости значения
; переносим значение из 3-го знакоместа в 2-е
; гасим 4-е знакоместо
; символ "С"
; в третье знакоместо
; если температура ноль градусов,
; то символ "плюс/минус" не отображаем
I jjc эфе эфе эфе эфе эфе эфе эфе э|с э|с эфе эфе эфеэфеэфеэфеэфеэфеэфеэфеэфеэфеэфеэфгэфеэфе эфе эфеэфеэфеэфеэфефэф^эфе эфе эфеэ[еэ[еэфсэфеэ}еэ}еэ}еэ[еэ[еэ[еэфсэ)еэфе эфе эфе эфеэфеэфеэ[еэ|сэ[еэ|сэ[еэ[е»
»
подпрограмма отображения 4 символов на ЖК-индикаторе ;
эфе эфе эфе эфе эфе эфе эфе эфе эфе эфе эфе эфе эфе эфе эфе эфе ^е эфе эфе эфе эфе э|е э|е э|е эфе э|е эфе эфе эфе эфе эфе эфе эфе эфе эфе э|е эфе э|е эфе эфе эфе э|е э|е э|е эфе э|е э|е эфе эфе эфе эфе эфе эфе э|е э|е э|е э|е э|е эфе эфе эфе*
ind_LCD bcf PORTB, 3 movf digitl,w movwf digitemp call loader movf digit2, w movwf digitemp call loader movf digit3, w movwf digitemp call loader movf digit4, w movwf digitemp call loader call delay
bsf PORTB, 3 movf digitl,w xorlw OxFF movwf digitemp call loader movf digit2, w xorlw OxFF movwf digitemp
; уровень на подложке в О
; первая цифра в аккумуляторе
; выгрузили биты в индикатор ; вторая цифра в аккумуляторе
; выгрузили биты в индикатор ; третья цифра в аккумуляторе
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.