Рис. 4. Функциональная схема электронного термометра
7. Описание выбора элементной базы и работы принципиальной
схемы
Принципиальная схема устройства показана на рис. 5. Резистором R5 регулируют контрастность изображения на индикаторе. Элементы резервного питания можно составить из трех элементов типа AAA. Средний потребляемый ток от элементов питания в текущем режиме не превышает 3 мА.
Принципиальная схема электронного термометра выполнена в САПР AccelEda (Рис. 5).
Рис.5. Принципиальная схема электронного термометра в AccelEDA.
Принципиальная схема электронного термометра приведена в Приложении Б.
Выбор элементной базы основан на выборе элементов согласующихся с микроконтроллером. Основными элементами схемы являются термодатчики, которые хорошо согласуются с микроконтроллером. Термодатчики DS1820 имеют следующие технические характеристики:
• индивидуальный 64-битный идентификационный номер;
• напряжение питания от +3 до +5,5 В;
• измеряемая температура от -55 до +125°С;
• погрешность измерения температуры в диапазоне -Ю...+85°С не более 0,5°С;
• в остальном диапазоне температур погрешность измерения не превышает 2°С;
• информация о температуре выдается 9-битным кодом;
• установка пороговых значений температуры по максимуму и минимуму;
• максимальное время преобразования температуры в код 750 мс;
• возможность питания от высокого уровня шины данных;
• термодатчики не требуют индивидуальной настройки при замене. Термодатчик типа DS18B20 отличается от DS1820 способностью измерять температуру с четырьмя уровнями погрешности — 0,5; 0,25; 0,0625°С. При этом максимальное время измерения для каждого уровня составляет соответственно 93,75; 187,5; 375; 750 мс. Необходимая погрешность измерения задается при инициализации микроконтроллерного термодатчика.
Термодатчики выпускают в двух типах корпусов: ТО-92 и SOIC.
Рис.6. Схема подключения термодатчика к микроконтроллеру
Что же касается жидкокристаллических индикаторов. Для управления жидкокристаллическими индикаторами необходимо иметь отрицательный источник питания и организовывать подачу трехуровневых управляющих импульсов на каждый сегмент. При малом числе сегментов (например, в часах) эта задача решаема, а для большого числа сегментов была разработана модульная система. Суть модульной системы заключается в том, что ЖКИ комплектуется модулем драйвера — контроллера. Драйверы каждый изготовитель разрабатывает по своей схеме и технологии. Но для взаимозаменяемости ЖК-дисплеев все изготовители негласно выпускают драйверы с системой команд, совместимых с драйверами типа HD44780 фирмы Hitachi. Разработчику в принципе неважно, какой драйвер внутри модуля, главное, чтобы работал «правильно».
Алфавитно-цифровые жидкокристаллические модули с драйверами — контроллерами принято называть ЖК-дисплеями или LCD-дисплеями. Модуль ЖК-дисплея состоит из печатной платы, на которой установлен драйвер — контроллер в корпусе или без корпуса (залитый компаундом), и жидкокристаллического индикатора, который через контактную резину прижат металлической рамкой к плате.
Остается добавить что мы выбрали двухрядный индикатор, для которого таблица кодов приведена в Таблице 7.
Основные характеристики драйвера HD44780:
Диапазон питающих напряжений для логики 2,7...5,5 В.
Диапазон питающих напряжений для выходных формирователей З...П В.
Поддержка форматов знаков 5 х 8 и 5 х 10.
Встроенный генератор.
8- или 4-разрядная шина данных для связи с микроконтроллером. Максимальная частота обмена по шине данных — 2 МГц. Объем дисплейного ОЗУ 80 х 8 (80 символов). Встроенный фиксированный знакогенератор на 9920 бит. Пользовательский загружаемый знакогенератор 64 х 8. Программируемый мультиплекс 1:8, 1:11, 1:16.
ЖК-дисплеи выпускают с различным числом строк (1—4) и знакомест (8, 10, 16, 20, 24, 30, 32, 40) в строке и различными их размерами. Каждое знакоместо содержит 5x8 (40) точек, из которых формируются цифры, буквы и символы (рис. 58). Все символы записаны в ПЗУ знакогенератора по своим адресам. Крайние левые цифры на рис. 58 несут информацию о младшем полубайте адреса знакогенератора, а верхние — о старшем полубайте. Например, для отображения на индикаторе буквы «3» необходимо послать в ЖК-дисплей адрес 4Ah. По этому адресу в знакогенераторе будет выбрана буква и отображена в необходимом знакоместе. ЖК-дисплеи, в которых последняя буква маркировки «R» (русифицировано), имеют в составе знакогенератора кириллицу. Это не касается ЖК-дисплеев отечественных производителей.
8. Работа с устройством
После подачи напряжения питания на индикаторе появится изображение, аналогичное представленному на рис. 6, но с числом и месяцем, равным 01 и нулевыми значениями времени. Две крайние слева цифры в верхнем ряду показывают текущую дату, а в нижнем ряду — текущий месяц. Далее в верхнем ряду отображено текущее время в часах и минутах с двоеточием, которое мигает с периодом в две секунды.
Рис.6. Индикация после подачи напряжения питания
Крайние справа значения в верхнем ряду показывают текущую температуру с первого термодатчика, а в нижнем ряду — со второго термодатчика. После стрелки указан номер термодатчика.
После нажатия кнопки "Режим" и удержания ее не менее трех секунд индикатор перейдет в режим установки времени и даты рис.7.
Рис. 7. Режим установки времени и даты
Под разрядом десятков часов будет мигать курсор с периодом в две секунды. После нажатия кнопки "Разряд" курсор будет перемещаться слева направо. Кнопкой "Установка" устанавливают необходимые текущие значения времени и даты. Формат записи даты: "число-месяц". При установке удерживать нажатыми кнопки "Разряд" и "Установка" следует не менее одной секунды.
При нажатии кнопки "Сброс" значения минут и секунд устанавливаются в ноль, что необходимо при установке времени по сигналам точного времени. Все кнопки срабатывают после их отпускания.
При следующем нажатии кнопки "Режим" на индикаторе установится режим просмотра (рис. 8).
Рис. 8. Режим просмотра
Первыми отображены время и температура для текущей даты. Под разрядом единиц числа будет мигать курсор. Стрелка указывает на номер термодатчика, по которому показаны экстремальные значения. В верхнем ряду отображены время и зафиксированная максимальная температура, а в нижнем — время и минимальная температура. Кнопкой "Просмотр 1-2" выбирают показания индикатора для первого или второго термодатчика. Если кнопку "Просмотр 1-2" удерживать нажатой, то индикация будет непрерывно изменяться через две секунды.
После каждого нажатия кнопки "Просмотр" отображаемое число уменьшается на единицу, а на индикаторе появятся значения времени и температур, записанных в памяти EEPROM.
Нажатием кнопки "Режим" переходят в текущий режим индикации. При переходе из режима просмотра к текущему режиму кнопку "Режим" необходимо удерживать четыре секунды. Отсчет времени при удержании кнопки удобно вести по миганию курсора.
Важно запомнить, что в режиме просмотра и установки измерение температуры не производится, поэтому рабочим режимом нужно считать текущий режим индикации.
ЗАКЛЮЧЕНИЕ
В данном курсовом проекте разработано устройство - электронный термометр. Разработана схема электрическая принципиальная этого устройства и программа для микроконтроллера. В результате ассемблирования получена прошивка программы для памяти микроконтроллера. Применение микроконтроллера позволило упростить принципиальную схему и расширить функциональные возможности микроконтроллера, так как для изменения функций устройства достаточно внести изменения в программу микроконтроллера.
СПИСОК ЛИТЕРАТУРЫ
1. Белов А.В. Микроконтроллеры АVR в радиолюбительской практике – СП-б, Наука и техника, 2007 – 352с.
2. Проектирование цифровых устройств на однокристальных микроконтроллерах / В.В. Сташин [ и др.]. – М.: Энергоатомиздат, 1990. – 224 с.
3. Евстифеев А.В. Микроконтроллеры Microchip: практическое руководство/А.В.Евстифеев. – М.: Горячая линия – Телеком, 2002. – 296 с.
4. Кравченко А.В. 10 практических устройств на AVR-микроконтроллерах. Книга 1 – М., Додэка –ХХ1, МК-Пресс, 2008 – 224с.
5.Трамперт В. Измерение, управление и регулирование с помощью АVR-микроконтроллеров: Пер. с нем – К., МК-Пресс, 2006 – 208с.
6. Мортон Дж. Микроконтроллеры АVR. Вводный курс /Пер. с англ. – М., Додэка –ХХ1, 2006 – 272с.
ПРИЛОЖЕНИЕ А
Листинг программы и объектный файл
;
; 2 ТЕРМОМЕТРА С ПАМЯТЬЮ МАКСИМУМА И МИНИМУМА.
; ТОЧНОСТЬ ИЗМЕРЕНИЯ ТЕМПЕРАТУРЫ - 0,1 ГРАДУС.
; ДАТЧИКИ ТЕМПЕРАТУРЫ - DS18B20,
; ПАМЯТЬ НА 8 ДНЕЙ.
; ИНДИКАЦИЯ - 16х2 ЖКИ.
; РАЗРАБОТАЛ САХНЮК АЛЕКСАНДР ЮРЬЕВИЧ
; ДЛЯ СВОБОДНОГО ИСПОЛЬЗОВАНИЯ
; г.СЕВЕРОДОНЕЦК ЛУГАНСКОЙ
; ПРОГРАММА = MAMIN.ASM
; ВЕРСИЯ: 24-01-06.
; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.70.40.
;
LIST P=16F628
#INCLUDE P16F628.INC
__CONFIG 3F01H
;======================================================
; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 4,096 MГЦ.
; КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ РАВЕН 16, ЧТО ВМЕСТЕ
; С TMR0 (256) И ЦИКЛОМ, РАВНЫМ 4 ТАКТАМ, ДЕЛИТЕЛЕМ НА 125, 2
; ДАЕТ НА ВЫХОДЕ 1 СЕКУНДУ (4х16х256x250=4096000).
;======================================================
; RB4-RB7 - ДАННЫЕ LCD,
; RB2 - RS, RB3 - E,
; RB1 - КНОПКА "РАЗРЯД".
; RB0 - КНОПКА "РЕЖИМ".
; RA0 - ВХОД/ВЫХОД НА DS18B20 - 2.
; RA4 - ВХОД/ВЫХОД НА DS18B20 - 1.
; RA5 - ПРОСМОТР 1-2. RB5 - ПРОСМОТР -1. RB6 - УСТАНОВКА +.
;==============================================
; РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ.
;==============================================
CBLOCK H'20'
CEK;СЕКУНДЫ ДВОИЧНЫЕ.
MIN;МИНУТЫ ДВОИЧНЫЕ.
HOU;ЧАСЫ ДВОИЧНЫЕ.
MINL;ЕДИНИЦЫ МИНУТ.
MINH;ДЕСЯТКИ МИНУТ.
HOUL;ЕДИНИЦЫ ЧАСОВ.
HOUH;ДЕСЯТКИ ЧАСОВ.
TEMP;ВРЕМЕННЫЙ.
COUN;СЧЕТЧИК БИТОВ, СЧЕТЧИК ПЕРЕСЧЕТА.
LSB;РЕГИСТР ДАННЫХ DS.
LSBH;СТАРШИЙ РЕГИСТР СЧИТЫВАНИЯ.
MCK;МИЛЛИСЕКУНД.
WTEMP;ВРЕМЕННЫЙ.
STEMP;ВРЕМЕННЫЙ.
FTEMP;ВРЕМЕННЫЙ.
REID;РЕЖИМ ИНДИКАЦИИ.
KYPC;КУРСОРА.
SOT2;ЗНАК 2.
SOT2X;ЗНАК 2 MAX.
SOT2N;ЗНАК 2 MIN.
EDI2;ЕДИНИЦЫ 2.
DES2;ДЕСЯТКИ 2.
DST2;ДЕСЯТЫЕ 2.
SOT1;ЗНАК 1.
SOT1X;ЗНАК 1 MAX.
SOT1N;ЗНАК 1 MIN.
EDI1;ЕДИНИЦЫ 1.
DES1;ДЕСЯТКИ 1.
DST1;ДЕСЯТЫЕ 1.
DHU;ДНИ ДВОИЧНЫЕ.
DHUE;ЕДИНИЦЫ ДНЕЙ.
DHUD;ДЕСЯТКИ ДНЕЙ.
MEC;МЕСЯЦ ДВОИЧНЫЙ.
MECE;ЕДИНИЦЫ МЕСЯЦА.
MECD;ДЕСЯТКИ МЕСЯЦА.
FLAG;
FLAG1;
FLAG2;
MECDI;ДЕСЯТКИ МЕСЯЦА ИНДИКАЦИИ.
MECEI;ЕДИНИЦЫ МЕСЯЦА ИНДИКАЦИИ.
DHUDI;ДЕСЯТКИ ДНЕЙ ИНДИКАЦИИ.
DHUEI;ЕДИНИЦЫ ДНЕЙ ИНДИКАЦИИ.
DHUZ;ДВОИЧНЫЕ ДНИ ЗАПИСИ/СЧИТЫВАНИЯ.
MECZ;ДВОИЧНЫЙ МЕСЯЦ ЗАПИСИ/СЧИТЫВАНИЯ.
MIN1X;ЕДИНИЦЫ МИНУТ 1.
MIN1N;ДЕСЯТКИ МИНУТ 1.
HOU1X;ЕДИНИЦЫ ЧАСОВ 1.
HOU1N;ДЕСЯТКИ ЧАСОВ 1.
MIN2X;ЕДИНИЦЫ МИНУТ 2.
MIN2N;ДЕСЯТКИ МИНУТ 2.
HOU2X;ЕДИНИЦЫ ЧАСОВ 2.
HOU2N;ДЕСЯТКИ ЧАСОВ 2.
COUZ;СЧЕТЧИК ЗАПИСИ.
COUE;СЧЕТЧИК СЧИТЫВАНИЯ.
COYC;СЧЕТЧИК УСТАНОВКИ ДНЕЙ ПРОСМОТРА.
LSB1X;СОХРАНЕННОЕ МАКСИМАЛЬНОЕ 1 ДАТЧИКА.
LSB1N;СОХРАНЕННОЕ МИНИМАЛЬНОЕ 1 ДАТЧИКА.
LSB2X;СОХРАНЕННОЕ МАКСИМАЛЬНОЕ 2 ДАТЧИКА.
LSB2N;СОХРАНЕННОЕ МИНИМАЛЬНОЕ 2 ДАТЧИКА.
DST1X;СОХРАНЕННОЕ МАКСИМАЛЬНОЕ ДЕСЯТЫХ 1 ДАТЧИКА.
DST1N;СОХРАНЕННОЕ МИНИМАЛЬНОЕ ДЕСЯТЫХ 1 ДАТЧИКА.
DST2X;СОХРАНЕННОЕ МАКСИМАЛЬНОЕ ДЕСЯТЫХ 2 ДАТЧИКА.
DST2N;СОХРАНЕННОЕ МИНИМАЛЬНОЕ ДЕСЯТЫХ 2 ДАТЧИКА.
ENDC
R1EQU60H;РЕГИСТРЫ ИНДИКАЦИИ.
R2EQU61H;
R3EQU62H;
R4EQU63H;
R5EQU64H;
R6EQU65H;
R7EQU66H;
R8EQU67H;
R9EQU68H;
R10EQU69H;
R11EQU6AH;
R12EQU6BH;
R13EQU6CH;
R14EQU6DH;
R15EQU6EH;
R16EQU6FH;
HOUZ1XEQU70H;РЕГИСТРЫДЛЯЗАПИСИ/СЧИТЫВАНИЯ, ЧАСЫДВОИЧНЫЕ 1 MAX.
MINZ1XEQU71H;МИНУТЫ ДВОИЧНЫЕ 1 MAX.
LSBZ1XEQU72H;СОХРАНЕННОЕ МАКСИМАЛЬНОЕ 1 ДАТЧИКА.
DSTZ1XEQU73H;СОХРАНЕННОЕ МАКСИМАЛЬНОЕ ДЕСЯТЫХ 1 ДАТЧИКА.
HOUZ1NEQU74H;ЧАСЫ ДВОИЧНЫЕ 1 MIN.
MINZ1NEQU75H;МИНУТЫ ДВОИЧНЫЕ 1 MIN.
LSBZ1NEQU76H;СОХРАНЕННОЕ МИНИМАЛЬНОЕ 1 ДАТЧИКА.
DSTZ1NEQU77H;СОХРАНЕННОЕ МИНИМАЛЬНОЕ ДЕСЯТЫХ 1 ДАТЧИКА.
HOUZ2XEQU78H;РЕГИСТРЫ ЗАПИСИ/СЧИТЫВАНИЯ, ЧАСЫ ДВОИЧНЫЕ 2 MAX.
MINZ2XEQU79H;МИНУТЫ ДВОИЧНЫЕ 2 MAX.
LSBZ2XEQU7AH;СОХРАНЕННОЕ МАКСИМАЛЬНОЕ 2 ДАТЧИКА.
DSTZ2XEQU7BH;СОХРАНЕННОЕ МАКСИМАЛЬНОЕ ДЕСЯТЫХ 2 ДАТЧИКА.
HOUZ2NEQU7CH;ЧАСЫ ДВОИЧНЫЕ 2 MIN.
MINZ2NEQU7DH;МИНУТЫ ДВОИЧНЫЕ 2 MIN.
LSBZ2NEQU7EH;СОХРАНЕННОЕ МИНИМАЛЬНОЕ 2 ДАТЧИКА.
DSTZ2NEQU7FH;СОХРАНЕННОЕ МИНИМАЛЬНОЕ ДЕСЯТЫХ 2 ДАТЧИКА.
;==============================================
; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ РЕГИСТРОВ ФЛАГОВ.
;==============================================
;FLAG
;0-> ЗНАК 1 МАКС.
;1-> ЗНАК 1 МИН.
;2-> КНОПКИ "УСТАНОВКА -".
;3-> КНОПКИ "УСТАНОВКА +".
;4-> КНОПКИ "РЕЖИМ".
;5-> КНОПКИ "РАЗРЯД".
;6-> ЧЕРЕДОВАНИЯ КУРСОРА И ИНДИКАЦИИ.
;7-> ДЕЛИТЕЛЬ НА 2 (1 CEK).
;FLAG1
;0-> УСТАНОВКИ.
;1-> ПРОСМОТРА ТЕМПЕРАТУРЫ: 1>2, 0>1.
;2-> ЗАПРЕТ ИНДИКАЦИИ.
;3-> ЗНАКА. 1-МИНУС.
;4-> НАЧАЛЬНАЯ ПАУЗА 1.
;5-> НОЛЬ, КНОПКИ "ПРОСМОТР 1-2".
;6-> НАЧАЛЬНАЯ ПАУЗА 2.
;FLAG2;ФЛАГ ИНДИКАЦИИ.
;0-> ТЕКУЩИЕ ДАТА, ВРЕМЯ, ТЕМПЕРАТУРА.
;1-> УСТАНОВКА ЧАСОВ, ДАТЫ.
;2-> РЕЖИМ ПРОСМОТРА ТЕМПЕРАТУРЫ.
;3-> ЗНАК 2 МАКС.
;4-> ЗНАК 2 МИН.
;5-> ФЛАГ ВЫПОЛНЕННОЙ УСТАНОВКИ МИНУС.
;6-> УСТАНОВКИ СЧЕТЧИКА ДНЕЙ ПРОСМОТРА.
;=======================================
DS2EQU0;ВЫХОД DS2.
DS1EQU4;ВЫХОД DS1.
RSEQU2;КОМАНДА/ДАННЫЕ.
EEQU3;СИНХРОНИЗАЦИЯ.
YCPLEQU6;УСТАНОВКА ПЛЮС.
YCMIEQU5;УСТАНОВКА МИНУС.
PAZEQU1;РАЗРЯД.
PEJEQU0;РЕЖИМ.
HOLEQU5;СБРОС.
;=======================================
; 1. ПУСК.
;======================
ORG 0
GOTOINIT
ORG 4
GOTOPRER
;=========================================
; 2. ПЕРЕВОД ДОЛЕЙ ГРАДУСА С ОКРУГЛЕНИЕМ.
;=========================================
DESATI
ADDWFPCL,1;
RETLW.0;0
RETLW.1;1
RETLW.1;2
RETLW.2;3
RETLW.3;4
RETLW.3;5
RETLW.4;6
RETLW.4;7
RETLW.5;8
RETLW.6;9
RETLW.6;10
RETLW.7;11
RETLW.7;12
RETLW.8;13
RETLW.9;14
RETLW.9;15
;============================
; 3. ЗАГРУЗКА ЧИСЕЛ В МЕСЯЦЕ.
;============================
DAYMON
ADDWF PCL,F ;
NOP ;0
RETLW .32 ;1-ЯНВАРЬ
RETLW .29 ;2-ФЕВРАЛЬ
RETLW .32 ;3-МАРТ
RETLW .31 ;4-АПРЕЛЬ
RETLW .32 ;5-МАЙ
RETLW .31 ;6-ИЮНЬ
RETLW .32 ;7-ИЮЛЬ
RETLW .32 ;8-АВГУСТ
RETLW .31 ;9-СЕНТЯБРЬ
RETLW .32 ;10-ОКТЯБРЬ
RETLW .31 ;11-НОЯБРЬ
RETLW .32 ;12-ДЕКАБРЬ
;=======================================
; 4. ВЫБОР РЕЖИМА ИНДИКАЦИИ.
;=======================================
VUBOR
BTFSSPORTB,PEJ;ЕСЛИ КНОПКА НАЖАТА,
RETURN;ТО ВЫБОРА НЕТ.
BCFFLAG,4;СБРОС ФЛАГА РЕЖИМА.
MOVFWREID;ПО НОМЕРУ
ADDWFPCL,1;ВЫБИРАЕМ ИНДИКАЦИЮ.
GOTOINDT;ТЕКУЩАЯ.
GOTOINDYC;УСТАНОВКА ДАТЫ, ЧАСОВ.
GOTOINPRO;ПРОСМОТР.
INDT
CALLREGIN;ВОССТАНОВИМ РЕГИСТРЫ.
BTFSCFLAG2,0;ЕСЛИ УСТАНОВКИ СДЕЛАНЫ РАНЕЕ,
RETURN;ТО ВЕРНЕМСЯ.
BCFFLAG2,1;СБРОСИМ: УСТАНОВКУ ЧАСОВ,
BCFFLAG2,2;ПРОСМОТР,
BCFFLAG1,0;ОБЩУЮ УСТАНОВКУ,
BCFFLAG2,6;СЧЕТЧИКА ДНЕЙ,
BCFFLAG2,5;ВЫПОЛНЕННОЙ УСТАНОВКИ.
CALLZHAKCOX;ВОССТАНОВИМ ЗНАЧЕНИЯ ИНДИКАЦИИ.
BSFFLAG2,0;УСТАНОВИМ ТЕКУЩУЮ ИНДИКАЦИЮ.
RETURN
INDYC
CALLREGIN;ВОССТАНОВИМ ЗНАЧЕНИЯ ДАТЫ.
BTFSCFLAG2,1;ЕСЛИ УСТАНОВКИ СДЕЛАНЫ РАНЕЕ,
RETURN;ТО ВЕРНЕМСЯ.
BSFFLAG1,0;УСТАНОВКА.
BCFFLAG2,0;СБРОСИМ: ТЕКУЩУЮ ИНДИКАЦИЮ,
BCFFLAG2,2;ПРОСМОТР.
CLRFKYPC;ОБНУЛИМ КУРСОР.
BSFFLAG2,1;УСТАНОВКА ДАТЫ, ЧАСОВ.
RETURN
INPRO
BTFSCFLAG2,2;ЕСЛИ УСТАНОВКИ СДЕЛАНЫ РАНЕЕ,
GOTO$+6;ТО ПРОВЕРИМ КНОПКУ.
MOVLW.8;УСТАНОВИМ КУРСОР.
MOVWFKYPC;
BCFFLAG2,0;СБРОСИМ: ТЕКУЩУЮ ИНДИКАЦИЮ,
BCFFLAG2,1;УСТАНОВКУ ДАТЫ, ЧАСОВ.
BSFFLAG2,2;УСТАНОВИМ РЕЖИМ ПРОСМОТРА.
BTFSCFLAG1,5;ЕСЛИ КНОПКА ПРОСМОТРА 1-2 БЫЛА НАЖАТА РАНЕЕ,
GOTO$+5;ТО ИДЕМ НА УСТАНОВКУ ФЛАГА.
BTFSSPORTA,HOL;ЕСЛИ КНОПКА НАЖАТА,
BSFFLAG1,5;УСТАНОВИМ ФЛАГ КНОПКИ.
BTFSSPORTA,HOL;ПОКА КНОПКА НАЖАТА,
RETURN;УСТАНОВКИ НЕТ.
BTFSSFLAG1,5;ЕСЛИ КНОПКА ПРОСМОТРА 1-2 БЫЛА НАЖАТА РАНЕЕ,
RETURN;
BCFFLAG1,5;СБРОСИМ ФЛАГ КНОПКИ.
BTFSCFLAG1,1;
GOTO$+3;
BSFFLAG1,1;ИЗМЕНИМ СОСТОЯНИЕ ФЛАГА ПРОСМОТРА
RETURN
BCFFLAG1,1;НА ПРОТИВОПОЛОЖНОЕ.
RETURN
;=======================================
; 5. ВЫБОР РАЗРЯДА УСТАНОВКИ.
;=======================================
YCTAL
BTFSSPORTB,YCPL;ЕСЛИ КНОПКА ПЛЮС НАЖАТА,
RETURN;ТО ВЫБОРА НЕТ.
BCFFLAG,3;СБРОС ФЛАГА РЕЖИМА.
BTFSCFLAG2,2;ПРИ ПРОСМОТРЕ
RETURN;КНОПКА ПЛЮС НЕ РАБОТАЕТ.
BCFFLAG,2;СБРОС ФЛАГА РЕЖИМА.
BCFFLAG1,2;ИНДИКАЦИЯ РАЗРЕШЕНА.
MOVFWKYPC;ПО КУРСОРУ
ADDWFPCL,1;НАХОДИМ РАЗРЯД УСТАНОВКИ.
GOTOYC0;ДЕСЯТКИ ЧАСОВ.
GOTOYC1;ЕДИНИЦЫ ЧАСОВ.
GOTOYC2;ДЕСЯТКИ МИНУТ.
GOTOYC3;ЕДИНИЦЫ МИНУТ.
GOTOYC4;ДЕСЯТКИ ДНЕЙ.
GOTOYC5;ЕДИНИЦЫ ДНЕЙ.
GOTOYC6;ДЕСЯТКИ МЕСЯЦА.
GOTOYC7;ЕДИНИЦЫ МЕСЯЦА.
YCTAM
BTFSCFLAG2,1;ЕСЛИ УСТАНОВКА ДАТЫ, ЧАСОВ,
RETURN;ТО ВЫБОРА НЕТ.
BTFSSPORTB,YCMI;ЕСЛИ КНОПКА МИНУС НАЖАТА,
RETURN;ТО ВЫБОРА НЕТ.
BCFFLAG,2;
BCFFLAG1,2;ИНДИКАЦИЯ РАЗРЕШЕНА.
GOTOYC8M;ЕДИНИЦЫ ДНЕЙ ПРОСМОТРА.
;=========================================
; 6. ИНДИКАЦИЯ КУРСОРА.
;=========================================
JEKYC
MOVLW.14;РАЗРЕШАЕМ МИГАНИЕ КУРСОРА.
CALL JEKOM;ЗАПИШЕМ КОМАНДУ.
CALLJEKYK;НА ВЫБОР МИГАЮЩЕГО РАЗРЯДА.
CALL JEKOM;ЗАПИШЕМ КОМАНДУ.
BSFFLAG,6;ВЫПОЛНЕНА ИНДИКАЦИЯ КУРСОРА.
RETURN
JEKYK
MOVFWKYPC;РЕГИСТР КУРСОРА - В РАБОЧИЙ.
ADDWFPCL,1;
RETLW0x85;ДЕСЯТКИ ЧАСОВ.
RETLW0x86;ЕДИНИЦЫ ЧАСОВ.
RETLW0x88;ДЕСЯТКИ МИНУТ.
RETLW0x89;ЕДИНИЦЫ МИНУТ.
RETLW0xC5;ДЕСЯТКИ ДНЕЙ.
RETLW0xC6;ЕДИНИЦЫ ДНЕЙ.
RETLW0xC8;ДЕСЯТКИ МЕСЯЦА.
RETLW0xC9;ЕДИНИЦЫ МЕСЯЦА.
RETLW0x81;ЕДИНИЦЫ ДНЕЙ.
;======================================================
; 7. ТАБЛИЦЫ ПЕРЕВОДА ДЕСЯТКОВ В ДВОИЧНОЕ ЧИСЛО.
;======================================================
DEBIN
ADDWFPCL,1;
RETLW.0
RETLW.10
RETLW.20
RETLW.30
RETLW.40
RETLW.50
;===============================================
; 8. ВОССТАНОВЛЕНИЕ ЗНАКА ПОСЛЕ ПРОСМОТРА.
;===============================================
ZHAKCOX
MOVLW.251;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
MOVWFSOT1X;
BTFSSFLAG,0;ЕСЛИ ИНАЧЕ,
GOTO$+3;ТО УСТАНОВИМ
MOVLW.253;МИНУС.
MOVWFSOT1X;
MOVLW.251;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
MOVWFSOT1N;
BTFSSFLAG,1;ЕСЛИ ИНАЧЕ,
GOTO$+3;ТО УСТАНОВИМ
MOVLW.253;МИНУС.
MOVWFSOT1N;
MOVLW.251;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
MOVWFSOT2X;
BTFSSFLAG2,3;ЕСЛИ ИНАЧЕ,
GOTO$+3;ТО УСТАНОВИМ
MOVLW.253;МИНУС.
MOVWFSOT2X;
MOVLW.251;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
MOVWFSOT2N;
BTFSSFLAG2,4;ЕСЛИ ИНАЧЕ,
GOTO$+3;ТО УСТАНОВИМ
MOVLW.253;МИНУС.
MOVWFSOT2N;
RETURN
;=================================================
; 9. УСТАНОВКА КУРСОРА (ВЫБОР РАЗРЯДА УСТАНОВКИ).
;=================================================
KYPCY
BTFSCFLAG2,2;ЕСЛИ ИДЕТ ПРОСМОТР,
RETURN;УСТАНОВКА НЕ МЕНЯЕТСЯ.
BTFSSFLAG2,1;УСТАНОВКА ВОЗМОЖНА,
RETURN;ЕСЛИ ИНДИКАЦИЯ УСТАНОВКИ ЧАСОВ.
BTFSSPORTB,PAZ;ПРИ НАЖАТОЙ КНОПКЕ
RETURN;УСТАНОВКА НЕ МЕНЯЕТСЯ.
BCFFLAG,5;СБРОСИМ ФЛАГ.
INCFKYPC,1;ПРИБАВИМ ЕДИНИЦУ В КУРСОР.
MOVLW.8;НЕ БОЛЕЕ 7.
SUBWFKYPC,0;
SKPNC;
CLRFKYPC;ИНАЧЕ ОБНУЛИМ КУРСОР.
RETURN;
;=========================================
; 10. ИНИЦИАЛИЗАЦИЯ DS2.
;=========================================
INIDS2
CALLHYL2;ПОСЫЛ ИМПУЛЬСА ОБНУЛЕНИЯ.
MOVLW0xCC;ПРОПУСК НОМЕРА.
CALLPOSIL2;ПОШЛЕМ.
MOVLW0x4E;РАЗРЕШАЕМ ЗАПИСЬ УСТАНОВКИ 0,1 ГРАДУСА.
CALLPOSIL2;ПОШЛЕМ.
MOVLW0x7D;ВЕРХНИЙ ПРЕДЕЛ +125. МОЖНО ПОСТАВИТЬ ЛЮБОЕ ЗНАЧЕНИЕ.
CALLPOSIL2;ПОШЛЕМ.
MOVLW0x77;НИЖНИЙ ПРЕДЕЛ -55. ЛЮБОЙ.
CALLPOSIL2;ПОШЛЕМ.
MOVLW0x7F;КОНФИГУРАЦИЯ 11 = 0,1 ГРАДУС.
CALLPOSIL2;ПОШЛЕМ.
CALLHYL2;ПОСЫЛ ИМПУЛЬСА ОБНУЛЕНИЯ.
MOVLW0xCC;ПРОПУСК ПОСЫЛА НОМЕРА DS.
CALLPOSIL2;ПОШЛЕМ.
MOVLW0x44;РАЗРЕШАЕМ ПРЕОБРАЗОВАНИЕ.
CALLPOSIL2;ПОШЛЕМ.
MOVLW.3;ПАУЗА 0,75 СЕК.
MOVWFCOUN;МАКСИМАЛЬНО 750 МС.
SPLU
MOVLW.255
MOVWF TEMP
PLUS
MOVLW .255
ADDLW -1
BTFSS STATUS,2
GOTO $-2
DECFSZ TEMP,1
GOTO PLUS
DECFSZCOUN,1
GOTOSPLU
GOTOPRIEM2;НАПРИЕМТЕМПЕРАТУРЫ.
HYL2
CALLWUX2;ВЫХОДНУЛЯ.
MOVLW.125;НУЛЕВОЙИМПУЛЬС
ADDLW-1;= 500 МКС.
BTFSSSTATUS,2;
GOTO$-2;
CALLWXO2;ВЫХОДЕДИНИЦЫ.
MOVLW.125;ИМПУЛЬС =
ADDLW-1;500 МКС.
BTFSSSTATUS,2;
GOTO$-2;
RETURN
;=======================================
; 11. ИЗМЕНЕНИЕ ВХОДА НА ПРИЕМ/ПЕРЕДАЧУ.
;=======================================
WUX2
BCFPORTA,DS2;
BSFSTATUS,5;ПЕРЕХОДИМ В БАНК 1.
BCFTRISA^80H,DS2;НА ВЫХОД.
BCFSTATUS,5;ПЕРЕХОДИМ В БАНК 0.
RETURN
WXO2
BSFSTATUS,5;ПЕРЕХОДИМ В БАНК 1.
BSFTRISA^80H,DS2;НА ВХОД.
BCFSTATUS,5;ПЕРЕХОДИМ В БАНК 0.
RETURN
;====================================
; 12. ПРИЕМ 16 БИТ ОТ DS2.
;====================================
PRIEM2
CALLHYL2;ПОСЫЛ ИМПУЛЬСА ОБНУЛЕНИЯ.
MOVLW0xCC;ПРОПУСК НОМЕРА.
CALLPOSIL2;ПОСЫЛ.
MOVLW0xBE;ЧТЕНИЕ ТЕМПЕРАТУРЫ ИЗ БЛОКНОТА.
CALLPOSIL2;ПОСЫЛ.
BCFINTCON,7;ЗАПРЕТ ПРЕРЫВАНИЙ.
CALL PRIE2;НА ПРИЕМ.
MOVFWLSBH;ПЕРЕПИШЕМ ПРИНЯТЫЙ БАЙТ
MOVWFLSB;В МЛАДШИЙ РЕГИСТР.
BCFINTCON,7;ЗАПРЕТ ПРЕРЫВАНИЙ.
CALLPRIE2;И ПРИМЕМ СТАРШИЙ БАЙТ.
GOTOCXET2;НА ПЕРЕСЧЕТ.
PRIE2
MOVLW.8
MOVWFCOUN;ЗАПИШЕМ ЧИСЛО БИТ.
CLRFLSBH;ОБНУЛИМ РЕГИСТР ПРИЕМА.
PRI2
CALLWUX2;ВЫДАЕМ КОРОТКИЙ НОЛЬ И ЖДЕМ ОТКЛИКА.
CALLWXO2;НА ПРИЕМ.
MOVLW.2;ЗАДЕРЖКА
CALLX4;8 МКС.
MOVFWPORTA;ПЕРЕПИШЕМ
MOVWFTEMP;ЗНАЧЕНИЕ ПОРТА.
BTFSSTEMP,DS2;
BCFSTATUS,0;УСТАНОВИМ БИТ ПРИЕМА В НОЛЬ.
BTFSCTEMP,DS2;
BSFSTATUS,0;ИЛИ ЕДИНИЦУ.
RRFLSBH,1;ЗАПИШЕМ В РЕГИСТР.
MOVLW.12;ОБЩАЯ ПАУЗА 60 МКС.
CALLX4;
DECFSZCOUN,1;УМЕНЬШИМ СЧЕТЧИК.
GOTOPRI2;ПОВТОРИМ ПРИЕМ.
BSFINTCON,7;РАЗРЕШАЕМ ПРЕРЫВАНИЯ.
RETURN;ВЕРНЕМСЯ.
;==========================================
; 13. ПОСЫЛ КОМАНДЫ В DS2.
;==========================================
POSIL2
BCFINTCON,7;ЗАПРЕТ ПРЕРЫВАНИЙ.
MOVWFTEMP;ПЕРЕПИШЕМ ВО ВРЕМЕННЫЙ.
MOVLW.8;ЗАПИШЕМ ЧИСЛО БИТ.
MOVWFCOUN;
POSI2
RRFTEMP,1;ВЫТОЛКНЕМ МЛАДШИЙ БИТ.
BTFSSSTATUS,0;ЕСЛИ ОН НУЛЕВОЙ,
GOTOW0_2;ПОШЛЕМ ИМПУЛЬС НУЛЯ.
GOTOW1_2;ИЛИ ЕДИНИЦЫ.
POS2
DECFSZCOUN,1;УМЕНЬШАЕМ СЧЕТЧИК.
GOTOPOSI2;НА СЛЕДУЮЩИЙ БИТ.
BSFINTCON,7;РАЗРЕШАЕМ ПРЕРЫВАНИЯ.
RETURN;ВОЗВРАТ.
W0_2
CALLWUX2;УСТАНОВИМ ВЫХОД В НОЛЬ.
MOVLW.15;УДЕРЖИВАЕМ 60 МКС.
CALL X4;
CALLWXO2;НА ВХОД = 1 НА ВЫХОДЕ.
GOTOPOS2;ПОВТОРИМ.
W1_2
CALLWUX2;КОРОТКИЙ НУЛЕВОЙ ИМПУЛЬС.
CALLWXO2;НА ВХОД = 1 НА ВЫХОДЕ.
MOVLW.15;УДЕРЖИВАЕМ 60 МКС.
CALLX4;
GOTOPOS2;ПОВТОРИМ.
;==================================
; 14. ВЫДЕЛЕНИЕ 2.
;==================================
CXET2
BTFSCFLAG1,6;ЗАДЕРЖКА ПРИ ВКЛЮЧЕНИИ ВЫПОЛНЕНА.
GOTO$+3;
BSFFLAG1,6;ЗАДЕРЖКА ПРИ ВКЛЮЧЕНИИ.
RETURN;
BCFFLAG1,3;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
BTFSCLSBH,3;ЕСЛИ ИНАЧЕ,
BSFFLAG1,3;ТО УСТАНОВИМ МИНУС.
BTFSSFLAG1,3;ЕСЛИ ЗНАК ПЛЮС,
GOTO$+7;ТО НЕ ИНВЕРТИРУЕМ.
COMFLSB,1;ПРОИНВЕРТИРУЕМ МЛАДШИЙ
COMFLSBH,1;И СТАРШИЙ РЕГИСТРЫ ПРИЕМА.
BCFSTATUS,0;
INCFLSB,1;ПРИБАВИМ ЕДИНИЦУ.
BTFSCSTATUS,0;ЕСЛИ ЕСТЬ ПЕРЕНОС,
INCFLSBH,1;ТО УВЕЛИЧИМ СТАРШИЙ РЕГИСТР.
MOVFWLSB;ВЫДЕЛИМ ДЕСЯТЫЕ.
ANDLWB'00001111';ЗАМАСКИРУЕМ.
CALLDESATI;ПЕРЕКОДИРУЕМ С ОКРУГЛЕНИЕМ.
MOVWFDST2;ЗАПИШЕМ В РЕГИСТР ДЕСЯТЫХ.
MOVLW.4;СДВИГОМ ВПРАВО НА 4 РАЗРЯДА
MOVWFCOUN;
BCFSTATUS,0;ВЫДЕЛИМ ЦЕЛУЮ ЧАСТЬ.
RRFLSBH,1;
RRFLSB,1;
DECFSZCOUN,1;
GOTO$-4;
MOVLW.251;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
MOVWFSOT2;
BTFSSFLAG1,3;ЕСЛИ ИНАЧЕ,
GOTO$+3;ТО УСТАНОВИМ
MOVLW.253;МИНУС.
MOVWFSOT2;
;======================================================
; 15. ВЫБОР СРАВНЕНИЯ ПО СОХРАНЕННОМУ И ИЗМЕРЕННОМУ ЗНАКАМ 2.
;======================================================
MAXZ2
MOVFWSOT2;ЕСЛИ СОХРАНЕННЫЙ
SUBWFSOT2X,0;И ИЗМЕРЕННЫЙ ЗНАКИ РАВНЫ,
SKPZ;ТО ОПРЕДЕЛИМ ЗНАК.
GOTO$+5;
BTFSSFLAG1,3;ЕСЛИ ЗНАК ПОЛОЖИТЕЛЬНЫЙ,
GOTOCOPL2X;ТО СРАВНИМ НА ПРЕВЫШЕНИЕ.
BTFSCFLAG1,3;ЕСЛИ ЗНАК ОТРИЦАТЕЛЬНЫЙ,
GOTOCOMI2X;ТО СРАВНИМ НА УМЕНЬШЕНИЕ.
SKPNC;ЕСЛИ ИЗМЕРЕННЫЙ ЗНАК МЕНЬШЕ (+) СОХРАНЕННОГО,
GOTOCOXP2X;ТО СОХРАНИМ ИЗМЕРЕННОЕ ЗНАЧЕНИЕ.
MINZ2
MOVFWSOT2;ЕСЛИ СОХРАНЕННЫЙ
SUBWFSOT2N,0;И ИЗМЕРЕННЫЙ ЗНАКИ РАВНЫ,
SKPZ;ТО ОПРЕДЕЛИМ ЗНАК.
GOTO$+5;
BTFSCFLAG1,3;ЕСЛИ ЗНАК ОТРИЦАТЕЛЬНЫЙ,
GOTOCOPL2N;ТО СРАВНИМ НА ПРЕВЫШЕНИЕ.
BTFSSFLAG1,3;ЕСЛИ ЗНАК ПОЛОЖИТЕЛЬНЫЙ,
GOTOCOMI2N;ТО СРАВНИМ НА УМЕНЬШЕНИЕ.
SKPC;ЕСЛИ ИЗМЕРЕННЫЙ ЗНАК БОЛЬШЕ (-) СОХРАНЕННОГО,
GOTOCOXP2N;ТО СОХРАНИМ ИЗМЕРЕННОЕ ЗНАЧЕНИЕ.
GOTOBDIN2;НА ЗАПИСЬ ЗНАЧЕНИЙ В РЕГИСТРЫ ИНДИКАЦИИ.
;===================================
; 16. СРАВНЕНИЕ НА MAX 2.
;===================================
COPL2X
MOVFWLSB2X;ЕСЛИ СОХРАНЕННОЕ ЗНАЧЕНИЕ
SUBWFLSB,0;БОЛЬШЕ ИЗМЕРЕННОГО,
BTFSSSTATUS,0;ТО СОХРАНЕНИЯ НЕТ.
GOTOMINZ2;ПРОВЕРИМ НА МИНИМУМ.
BTFSSSTATUS,2;ЕСЛИ РАВЕНСТВО ЦЕЛЫХ,
GOTO$+5;
MOVFWDST2X;ТО ПРОВЕРИМ ДЕСЯТЫЕ.
SUBWFDST2,0;ЕСЛИ ИЗМЕРЕННОЕ БОЛЬШЕ
BTFSSSTATUS,0;ИЛИ РАВНО СОХРАНЕННОМУ, ТО СОХРАНИМ.
GOTOMINZ2;ЕСЛИ МЕНЬШЕ, ТО ПРОВЕРИМ НА МИНИМУМ.
COXP2X
BTFSSFLAG1,3;-0 НЕТ.
GOTO$+4;
TSTFLSB;
BZMINZ2;
MOVFWSOT2;СОХРАНИМЗНАК.
MOVWFSOT2X;
MOVFWLSB;СОХРАНИМ НОВОЕ ЗНАЧЕНИЕ
MOVWFLSB2X;ЦЕЛЫХ
MOVFWDST2;И ДЕСЯТЫХ.
MOVWFDST2X;
MOVFWMIN;СОХРАНИМ
MOVWFMIN2X;МИНУТЫ
MOVFWHOU;
MOVWFHOU2X;И ЧАСЫ.
BTFSCFLAG1,3;ПЕРЕПИШЕМ ЗНАК
BSFFLAG2,3;ВО ФЛАГ ХРАНЕНИЯ.
BTFSSFLAG1,3;
BCFFLAG2,3;
GOTOMINZ2;НА ПРОВЕРКУ ПО МИНИМУМУ.
COMI2X
MOVFWLSB2X;ЕСЛИ СОХРАНЕННОЕ ЗНАЧЕНИЕ
SUBWFLSB,0;РАВНО ИЗМЕРЕННОМУ,
BTFSCSTATUS,2;
GOTO$+3;ТО ПРОВЕРИМ ДЕСЯТЫЕ.
BTFSSSTATUS,0;ЕСЛИ БОЛЬШЕ,
GOTOCOXP2X;ТО СОХРАНИМ.
MOVFWDST2X;ПРОВЕРИМ ДЕСЯТЫЕ.
SUBWFDST2,0;ЕСЛИ СОХРАНЕННОЕ МЕНЬШЕ
BTFSCSTATUS,0;ИЛИ РАВНО ИЗМЕРЕННОМУ,
GOTOMINZ2;ТО ПРОВЕРИМ НА МИНИМУМ.
GOTOCOXP2X;ИЛИ СОХРАНИМ.
;===================================
; 17. СРАВНЕНИЕ НА MIN 2.
;===================================
COPL2N
MOVFWLSB2N;ЕСЛИ СОХРАНЕННОЕ ЗНАЧЕНИЕ
SUBWFLSB,0;БОЛЬШЕ ИЗМЕРЕННОГО,
BTFSSSTATUS,0;ТО СОХРАНЕНИЯ НЕТ.
GOTOBDIN2;ПЕРЕПИШЕМ.
BTFSSSTATUS,2;ЕСЛИ РАВЕНСТВО ЦЕЛЫХ,
GOTO$+5;
MOVFWDST2N;ТО ПРОВЕРИМ ДЕСЯТЫЕ.
SUBWFDST2,0;
BTFSSSTATUS,0;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО, ТО СОХРАНИМ.
GOTOBDIN2;ПЕРЕПИШЕМ.
COXP2N
BTFSSFLAG1,3;-0 НЕТ.
GOTO$+4;
TSTFLSB;
BZBDIN2;
MOVFWSOT2;СОХРАНИМ ЗНАК.
MOVWFSOT2N;
MOVFWLSB;СОХРАНИМ НОВОЕ ЗНАЧЕНИЕ
MOVWFLSB2N;ЦЕЛЫХ
MOVFWDST2;И ДЕСЯТЫХ.
MOVWFDST2N;
MOVFWMIN;СОХРАНИМ
MOVWFMIN2N;МИНУТЫ
MOVFWHOU;
MOVWFHOU2N;И ЧАСЫ.
BTFSCFLAG1,3;ПЕРЕПИШЕМ ЗНАК
BSFFLAG2,4;ВО ФЛАГ ХРАНЕНИЯ.
BTFSSFLAG1,3;
BCFFLAG2,4;
GOTOBDIN2;ПЕРЕПИШЕМ.
COMI2N
MOVFWLSB2N;ЕСЛИ СОХРАНЕННОЕ ЗНАЧЕНИЕ
SUBWFLSB,0;МЕНЬШЕ ИЗМЕРЕННОГО,
BTFSCSTATUS,2;
GOTO$+3;
BTFSSSTATUS,0;ТО СОХРАНЕНИЯ НЕТ.
GOTOCOXP2N;ИНАЧЕ СОХРАНИМ.
MOVFWDST2N;ПРОВЕРИМ ДЕСЯТЫЕ.
SUBWFDST2,0;ЕСЛИ МЕНЬШЕ
BTFSCSTATUS,0;ИЛИ РАВНО,
GOTOBDIN2;
GOTOCOXP2N;ТО СОХРАНИМ.
;==================================
; 18. ЗАДЕРЖКА МКС, УМНОЖЕННАЯ НА 4.
;==================================
X4
ADDLW-1;
BTFSSSTATUS,2;
GOTO$-2;
RETURN;
;=========================================
; 19. ИНИЦИАЛИЗАЦИЯ DS1.
;=========================================
INIDS1
CALLHYL1;ПОСЫЛИМПУЛЬСАОБНУЛЕНИЯ.
MOVLW0xCC;ПРОПУСКНОМЕРА.
CALLPOSIL1;ПОШЛЕМ.
MOVLW0x4E;РАЗРЕШАЕМ ЗАПИСЬ УСТАНОВКИ 0,1 ГРАДУСА.
CALLPOSIL1;ПОШЛЕМ.
MOVLW0x7D;ВЕРХНИЙ ПРЕДЕЛ +125. МОЖНО ПОСТАВИТЬ ЛЮБОЕ ЗНАЧЕНИЕ.
CALLPOSIL1;ПОШЛЕМ.
MOVLW0x77;НИЖНИЙ ПРЕДЕЛ -55. ЛЮБОЙ.
CALLPOSIL1;ПОШЛЕМ.
MOVLW0x7F;КОНФИГУРАЦИЯ 11 = 0,1 ГРАДУС.
CALLPOSIL1;ПОШЛЕМ.
CALLHYL1;ПОСЫЛ ИМПУЛЬСА ОБНУЛЕНИЯ.
MOVLW0xCC;ПРОПУСК ПОСЫЛА НОМЕРА DS.
CALLPOSIL1;ПОШЛЕМ.
MOVLW0x44;РАЗРЕШАЕМ ПРЕОБРАЗОВАНИЕ.
CALLPOSIL1;ПОШЛЕМ.
MOVLW.3;ПАУЗА 0,75 СЕК.
MOVWFCOUN;МАКСИМАЛЬНО 750 МС.
SPLU1
MOVLW.255
MOVWF TEMP
PLUS1
MOVLW .255
ADDLW -1
BTFSS STATUS,2
GOTO $-2
DECFSZ TEMP,1
GOTO PLUS1
DECFSZCOUN,1
GOTOSPLU1
GOTOPRIEM1;НАПРИЕМТЕМПЕРАТУРЫ.
HYL1
CALLWUX1;ВЫХОДНУЛЯ.
MOVLW.125;НУЛЕВОЙИМПУЛЬС
ADDLW-1;= 500 МКС.
BTFSSSTATUS,2;
GOTO$-2;
CALLWXO1;ВЫХОДЕДИНИЦЫ.
MOVLW.125;ИМПУЛЬС =
ADDLW-1;500 МКС.
BTFSSSTATUS,2;
GOTO$-2;
RETURN
;=======================================
; 20. ИЗМЕНЕНИЕ ВХОДА НА ПРИЕМ/ПЕРЕДАЧУ.
;=======================================
WUX1
BCFPORTA,DS1;
BSFSTATUS,5;ПЕРЕХОДИМ В БАНК 1.
BCFTRISA^80H,DS1;НА ВЫХОД.
BCFSTATUS,5;ПЕРЕХОДИМ В БАНК 0.
RETURN
WXO1
BSFSTATUS,5;ПЕРЕХОДИМ В БАНК 1.
BSFTRISA^80H,DS1;НА ВХОД.
BCFSTATUS,5;ПЕРЕХОДИМ В БАНК 0.
RETURN
;====================================
; 21. ПРИЕМ 16 БИТ ОТ DS1.
;====================================
PRIEM1
CALLHYL1;ПОСЫЛ ИМПУЛЬСА ОБНУЛЕНИЯ.
MOVLW0xCC;ПРОПУСК НОМЕРА.
CALLPOSIL1;ПОСЫЛ.
MOVLW0xBE;ЧТЕНИЕ ТЕМПЕРАТУРЫ ИЗ БЛОКНОТА.
CALLPOSIL1;ПОСЫЛ.
BCFINTCON,7;ЗАПРЕТ ПРЕРЫВАНИЙ.
CALL PRIE1;НА ПРИЕМ.
MOVFWLSBH;ПЕРЕПИШЕМ ПРИНЯТЫЙ БАЙТ
MOVWFLSB;В МЛАДШИЙ РЕГИСТР.
BCFINTCON,7;ЗАПРЕТ ПРЕРЫВАНИЙ.
CALLPRIE1;И ПРИМЕМ СТАРШИЙ БАЙТ.
GOTOCXET1;НА ПЕРЕСЧЕТ.
PRIE1
MOVLW.8
MOVWFCOUN;ЗАПИШЕМ ЧИСЛО БИТ.
CLRFLSBH;ОБНУЛИМ РЕГИСТР ПРИЕМА.
PRI1
CALLWUX1;ВЫДАЕМ КОРОТКИЙ НОЛЬ И ЖДЕМ ОТКЛИКА.
CALLWXO1;НА ПРИЕМ.
MOVLW.2;ЗАДЕРЖКА
CALLX4;8 МКС.
MOVFWPORTA;ПЕРЕПИШЕМ
MOVWFTEMP;ЗНАЧЕНИЕ ПОРТА.
BTFSSTEMP,DS1;
BCFSTATUS,0;УСТАНОВИМ БИТ ПРИЕМА В НОЛЬ.
BTFSCTEMP,DS1;
BSFSTATUS,0;ИЛИ ЕДИНИЦУ.
RRFLSBH,1;ЗАПИШЕМ В РЕГИСТР.
MOVLW.12;ОБЩАЯ ПАУЗА 60 МКС.
CALLX4;
DECFSZCOUN,1;УМЕНЬШИМ СЧЕТЧИК.
GOTOPRI1;ПОВТОРИМ ПРИЕМ.
BSFINTCON,7;РАЗРЕШАЕМ ПРЕРЫВАНИЯ.
RETURN;ВЕРНЕМСЯ.
;==========================================
; 22. ПОСЫЛ КОМАНДЫ В DS1.
;==========================================
POSIL1
BCFINTCON,7;ЗАПРЕТ ПРЕРЫВАНИЙ.
MOVWFTEMP;ПЕРЕПИШЕМ ВО ВРЕМЕННЫЙ.
MOVLW.8;ЗАПИШЕМ ЧИСЛО БИТ.
MOVWFCOUN;
POSI1
RRFTEMP,1;ВЫТОЛКНЕМ МЛАДШИЙ БИТ.
BTFSSSTATUS,0;ЕСЛИ ОН НУЛЕВОЙ,
GOTOW0_1;ПОШЛЕМ ИМПУЛЬС НУЛЯ.
GOTOW1_1;ИЛИ ЕДИНИЦЫ.
POS1
DECFSZCOUN,1;УМЕНЬШАЕМ СЧЕТЧИК.
GOTOPOSI1;НА СЛЕДУЮЩИЙ БИТ.
BSFINTCON,7;РАЗРЕШАЕМ ПРЕРЫВАНИЯ.
RETURN;ВОЗВРАТ.
W0_1
CALLWUX1;УСТАНОВИМ ВЫХОД В НОЛЬ.
MOVLW.15;УДЕРЖИВАЕМ 60 МКС.
CALL X4;
CALLWXO1;НА ВХОД = 1 НА ВЫХОДЕ.
GOTOPOS1;ПОВТОРИМ.
W1_1
CALLWUX1;КОРОТКИЙ НУЛЕВОЙ ИМПУЛЬС.
CALLWXO1;НА ВХОД = 1 НА ВЫХОДЕ.
MOVLW.15;УДЕРЖИВАЕМ 60 МКС.
CALLX4;
GOTOPOS1;ПОВТОРИМ.
;==================================
; 23. ВЫДЕЛЕНИЕ 1.
;==================================
CXET1
BTFSCFLAG1,4;НАЧАЛЬНАЯ ПАУЗА.
GOTO$+3;
BSFFLAG1,4;
RETURN;
BCFFLAG1,3;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
BTFSCLSBH,3;ЕСЛИ ИНАЧЕ,
BSFFLAG1,3;ТО УСТАНОВИМ МИНУС.
BTFSSFLAG1,3;ЕСЛИ ЗНАК ПЛЮС,
GOTO$+7;ТО НЕ ИНВЕРТИРУЕМ.
COMFLSB,1;ПРОИНВЕРТИРУЕМ МЛАДШИЙ
COMFLSBH,1;И СТАРШИЙ РЕГИСТРЫ ПРИЕМА.
BCFSTATUS,0;
INCFLSB,1;ПРИБАВИМ ЕДИНИЦУ.
BTFSCSTATUS,0;ЕСЛИ ЕСТЬ ПЕРЕНОС,
INCFLSBH,1;ТО УВЕЛИЧИМ СТАРШИЙ РЕГИСТР.
MOVFWLSB;ВЫДЕЛИМ ДЕСЯТЫЕ.
ANDLWB'00001111';ЗАМАСКИРУЕМ.
CALLDESATI;ПЕРЕКОДИРУЕМ С ОКРУГЛЕНИЕМ.
MOVWFDST1;ЗАПИШЕМ В РЕГИСТР ДЕСЯТЫХ.
MOVLW.4;СДВИГОМ ВПРАВО НА 4 РАЗРЯДА
MOVWFCOUN;
BCFSTATUS,0;ВЫДЕЛИМ ЦЕЛУЮ ЧАСТЬ.
RRFLSBH,1;
RRFLSB,1;
DECFSZCOUN,1;
GOTO$-4;
MOVLW.251;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
MOVWFSOT1;
BTFSSFLAG1,3;ЕСЛИ ИНАЧЕ,
GOTO$+3;ТО УСТАНОВИМ
MOVLW.253;МИНУС.
MOVWFSOT1;
;======================================================
; 24. ВЫБОР СРАВНЕНИЯ ПО СОХРАНЕННОМУ И ИЗМЕРЕННОМУ ЗНАКАМ 1.
;======================================================
MAXZ
MOVFWSOT1;ЕСЛИ ЗНАКИ РАВНЫ,
SUBWFSOT1X,0;
SKPZ;ТО ОПРЕДЕЛИМ ЗНАК.
GOTO$+5;
BTFSSFLAG1,3;ЕСЛИ ЗНАК ПЛЮС,
GOTOCOPL1X;ТО ПРОВЕРЯЕМ НА ПРЕВЫШЕНИЕ.
BTFSCFLAG1,3;ЕСЛИ ЗНАК МИНУС,
GOTOCOMI1X;ТО ПРОВЕРЯЕМ НА УМЕНЬШЕНИЕ.
SKPNC;ЕСЛИ ИЗМЕРЕННЫЙ ЗНАК МЕНЬШЕ (+) СОХРАНЕННОГО,
GOTOCOXPX;ТО СОХРАНИМ ИЗМЕРЕННОЕ ЗНАЧЕНИЕ.
MINZ
MOVFWSOT1;ЕСЛИ ЗНАКИ РАВНЫ,
SUBWFSOT1N,0;
SKPZ;ТО ОПРЕДЕЛИМ ЗНАК.
GOTO$+5;
BTFSCFLAG1,3;ЕСЛИ ЗНАК МИНУС,
GOTOCOPL1N;ТО СРАВНИВАЕМ НА ПРЕВЫШЕНИЕ.
BTFSSFLAG1,3;ЕСЛИ ЗНАК ПЛЮС,
GOTOCOMI1N;ТО СРАВНИВАЕМ НА УМЕНЬШЕНИЕ.
SKPC;ЕСЛИ ИЗМЕРЕННЫЙ ЗНАК БОЛЬШЕ (-) СОХРАНЕННОГО,
GOTOCOXPN;ТО СОХРАНИМ ИЗМЕРЕННОЕ ЗНАЧЕНИЕ.
GOTOBDIN1;НА ПЕРЕКОДИРОВКУ.
;===================================
; 25. СРАВНЕНИЕ НА MAX 1.
;===================================
COPL1X
MOVFWLSB1X;ЕСЛИ СОХРАНЕННОЕ ЗНАЧЕНИЕ
SUBWFLSB,0;БОЛЬШЕ ИЗМЕРЕННОГО,
BTFSSSTATUS,0;ТО СОХРАНЕНИЯ НЕТ.
GOTOMINZ;.
BTFSSSTATUS,2;ЕСЛИ РАВЕНСТВО ЦЕЛЫХ,
GOTO$+5;
MOVFWDST1X;ТО ПРОВЕРИМ ДЕСЯТЫЕ.
SUBWFDST1,0;ЕСЛИ БОЛЬШЕ
BTFSSSTATUS,0;ИЛИ РАВНО, ТО СОХРАНИМ.
GOTOMINZ;ИНАЧЕ ПРОВЕРИМ НА МИНИМУМ.
COXPX
BTFSSFLAG1,3;-0 НЕТ.
GOTO$+4;
TSTFLSB;
BZMINZ;
MOVFWSOT1;СОХРАНИМ МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ.
MOVWFSOT1X;ЗНАК.
MOVFWLSB;СОХРАНИМ НОВОЕ ЗНАЧЕНИЕ
MOVWFLSB1X;ЦЕЛЫХ
MOVFWDST1;И ДЕСЯТЫХ.
MOVWFDST1X;
MOVFWMIN;
MOVWFMIN1X;МИНУТЫ.
MOVFWHOU;
MOVWFHOU1X;ЧАСЫ.
BTFSCFLAG1,3;ПЕРЕПИШЕМ ФЛАГ ЗНАКА
BSFFLAG,0;В ФЛАГ ХРАНЕНИЯ.
BTFSSFLAG1,3;
BCFFLAG,0;
GOTOMINZ;НА ПРОВЕРКУ ПО МИНИМУМУ.
COMI1X
MOVFWLSB1X;ЕСЛИ СОХРАНЕННОЕ ЗНАЧЕНИЕ
SUBWFLSB,0;МЕНЬШЕ ИЗМЕРЕННОГО,
BTFSCSTATUS,2;ТО СОХРАНЕНИЯ НЕТ.
GOTO$+3;
BTFSSSTATUS,0;ЕСЛИ РАВЕНСТВО ЦЕЛЫХ,
GOTOCOXPX;
MOVFWDST1X;ТО ПРОВЕРИМ ДЕСЯТЫЕ.
SUBWFDST1,0;ЕСЛИ МЕНЬШЕ
BTFSCSTATUS,0;ИЛИ РАВНО,
GOTOMINZ;СРАВНИМ ПО МИНИМУМУ.
GOTOCOXPX;ИНАЧЕ СОХРАНИМ.
;===================================
; 26. СРАВНЕНИЕ НА MIN 1.
;===================================
COPL1N
MOVFWLSB1N;ЕСЛИ СОХРАНЕННОЕ ЗНАЧЕНИЕ
SUBWFLSB,0;МЕНЬШЕ ИЗМЕРЕННОГО,
BTFSSSTATUS,0;ТО СОХРАНЕНИЯ НЕТ.
GOTOBDIN1;ПЕРЕПИШЕМ.
BTFSSSTATUS,2;ЕСЛИ РАВЕНСТВО ЦЕЛЫХ,
GOTO$+5;
MOVFWDST1N;ТО ПРОВЕРИМ ДЕСЯТЫЕ.
SUBWFDST1,0;ЕСЛИ ИЗМЕРЕННОЕ МЕНЬШЕ
BTFSSSTATUS,0;ИЛИ РАВНО СОХРАНЕННОМУ, ТО СОХРАНИМ.
GOTOBDIN1;НА ПЕРЕКОДИРОВКУ.
COXPN
BTFSSFLAG1,3;-0 НЕТ.
GOTO$+4;
TSTFLSB;
BZBDIN1;
MOVFWSOT1;СОХРАНЕНИЕ МИНИМАЛЬНОГО.
MOVWFSOT1N;ЗНАК.
MOVFWLSB;СОХРАНИМ НОВОЕ ЗНАЧЕНИЕ
MOVWFLSB1N;ЦЕЛЫХ
MOVFWDST1;И ДЕСЯТЫХ.
MOVWFDST1N;
MOVFWMIN;
MOVWFMIN1N;МИНУТЫ.
MOVFWHOU;
MOVWFHOU1N;ЧАСЫ.
BTFSCFLAG1,3;ПЕРЕПИШЕМ ФЛАГ ЗНАКА
BSFFLAG,1;В ФЛАГ ХРАНЕНИЯ.
BTFSSFLAG1,3;
BCFFLAG,1;
GOTOBDIN1;НА ПЕРЕКОДИРОВКУ.
COMI1N
MOVFWLSB1N;ЕСЛИ СОХРАНЕННОЕ ЗНАЧЕНИЕ
SUBWFLSB,0;МЕНЬШЕ ИЗМЕРЕННОГО,
BTFSCSTATUS,2;
GOTO$+3;ТО СОХРАНЕНИЯ НЕТ.
BTFSSSTATUS,0;ЕСЛИ РАВЕНСТВО ЦЕЛЫХ,
GOTOCOXPN;
MOVFWDST1N;ТО ПРОВЕРИМ ДЕСЯТЫЕ.
SUBWFDST1,0;ЕСЛИ МЕНЬШЕ
BTFSCSTATUS,0;ИЛИ РАВНО,
GOTOBDIN1;
GOTOCOXPN;ТО СОХРАНИМ.
;=======================================
; 27. ПЕРЕКОДИРОВКА 1 ИЗ 2-ГО В 2_10.
;=======================================
BDIN1
CALLPERZAP;ПЕРЕПИШЕМ ТЕКУЩИЕ ЗНАЧЕНИЯ.
MOVFWLSB;ПЕРЕКОДИРУЕМ
GOTOBZT1;
BDIN2
CALLPERZAP;ПЕРЕПИШЕМ ТЕКУЩИЕ ЗНАЧЕНИЯ.
MOVFWLSB;ПЕРЕКОДИРУЕМ
GOTOBZT2;
PERZAP
MOVFWHOU1X;ТЕКУЩИЕ ЗНАЧЕНИЯ
MOVWFHOUZ1X;В РЕГИСТРЫ ИНДИКАЦИИ.
MOVFWMIN1X
MOVWFMINZ1X
MOVFWHOU1N
MOVWFHOUZ1N
MOVFWMIN1N
MOVWFMINZ1N
MOVFWHOU2X
MOVWFHOUZ2X
MOVFWMIN2X
MOVWFMINZ2X
MOVFWHOU2N
MOVWFHOUZ2N
MOVFWMIN2N
MOVWFMINZ2N
MOVFWLSB1X
MOVWFLSBZ1X
MOVFWDST1X
MOVWFDSTZ1X
MOVFWLSB1N
MOVWFLSBZ1N
MOVFWDST1N
MOVWFDSTZ1N
MOVFWLSB2X
MOVWFLSBZ2X
MOVFWDST2X
MOVWFDSTZ2X
MOVFWLSB2N
MOVWFLSBZ2N
MOVFWDST2N
MOVWFDSTZ2N
RETURN
BDINZ1
BTFSCFLAG1,1;ЕСЛИ ИНДИКАЦИЯ 2 ДАТЧИКА,
GOTOBDINZ2;ТО ИДЕМ НА 2 ДАТЧИК.
MOVFWLSBZ1X;ПО МАКСИМУМУ - 1 СТРОКА 1 ДАТЧИКА.
CALLBZT1;
MOVFWDSTZ1X;
MOVWFDST1;
MOVFWLSBZ1N;ПО МИНИМУМУ - 2 СТРОКА 1 ДАТЧИКА.
CALLBZT2;
MOVFWDSTZ1N;
MOVWFDST2;
MOVFWHOUZ1X;ЧАСЫ МАКСИМУМА 1.
CALLHZ67;
MOVFWMINZ1X;МИНУТЫ МАКСИМУМА 1.
CALLMZ910;
MOVFWSOT1X;ЗНАК.
MOVWFR12;
RETURN;
BDIN12
BTFSCFLAG1,1;ЕСЛИ ИНДИКАЦИЯ 2 СТРОКИ,
GOTOBDIN22;ТО ИДЕМ НА 2 СТРОКУ.
MOVFWHOUZ1N;ПЕРЕЗАПИСЬ 1 ДАТЧИКА 2 СТРОКИ.
CALLHZ67;ЧАСЫ МИНИМУМА 1.
MOVFWMINZ1N;МИНУТЫ МИНИМУМА 1.
CALLMZ910;
MOVFWSOT1N;ЗНАК.
MOVWFR12;
RETURN;
BDIN22
MOVFWHOUZ2N;ПЕРЕЗАПИСЬ 2 ДАТЧИКА 2 СТРОКИ.
CALLHZ67;ЧАСЫ МИНИМУМА 2.
MOVFWMINZ2N;МИНУТЫ МИНИМУМА 2.
CALLMZ910;
MOVFWSOT2N;ЗНАК.
MOVWFR12;
RETURN;
BDINZ2
MOVFWLSBZ2X;ПОДГОТОВКА К ИНДИКАЦИИ 2 ДАТЧИКА.
CALLBZT1;ПО МАКСИМУМУ - 1 СТРОКА.
MOVFWDSTZ2X;
MOVWFDST1;
MOVFWLSBZ2N;
CALLBZT2;ПО МИНИМУМУ - 2 СТРОКА
MOVFWDSTZ2N;
MOVWFDST2;
MOVFWHOUZ2X;ЧАСЫ МАКСИМУМА 2.
CALLHZ67;
MOVFWMINZ2X;МИНУТЫ МАКСИМУМА 2.
CALLMZ910;
MOVFWSOT2X;ЗНАК.
MOVWFR12;
RETURN;ПРОВЕРИМ КНОПКУ.
BZT1
MOVWFTEMP;ИЗ 2-ГО В 2_10-Е.
CALLBIDE;ТОЛЬКО ДО 99!
MOVWFDES1;ТЕМПЕРАТУРА В ПЕРВОЙ СТРОКЕ.
MOVFWTEMP;
MOVWFEDI1;
RETURN;
BZT2
MOVWFTEMP;ИЗ 2-ГО В 2_10-Е.
CALLBIDE;ТОЛЬКО ДО 99!
MOVWFDES2;ТЕМПЕРАТУРА ВО ВТОРОЙ СТРОКЕ.
MOVFWTEMP;
MOVWFEDI2;
RETURN;
HZ67
MOVWFTEMP;ИЗ 2-ГО В 2_10-Е.
CALLBIDE;ТОЛЬКО ДО 99!
MOVWFR6;6 И 7 РАЗРЯДЫ ИНДИКАТОРА.
MOVFWTEMP;ЧАСЫ.
MOVWFR7;
RETURN;
MZ910
MOVWFTEMP;ИЗ 2-ГО В 2_10-Е.
CALLBIDE;ТОЛЬКО ДО 99!
MOVWFR9;9 И 10 РАЗРЯДЫ ИНДИКАТОРА.
MOVFWTEMP;МИНУТЫ.
MOVWFR10;
RETURN;
;======================
; 28. ИНИЦИАЛИЗАЦИЯ МК.
;======================
INIT
BCFSTATUS,6;
BSFSTATUS,5;ПЕРЕХОДИМ В БАНК 1.
MOVLWB'00000011';ПРЕДДЕЛИТЕЛЬ ПЕРЕД ТАЙМЕРОМ, К=16 ...11,
MOVWFOPTION_REG^80H;ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ВКЛЮЧЕНЫ.
MOVLWB'10100000';РАЗРЕШЕНИЕ ПРЕРЫВАНИЯ ПРИ ПЕРЕПОЛНЕНИИ ТАЙМЕРА.
MOVWFINTCON;
MOVLWB'00100000';RA5 - НА ВХОД.
MOVWFTRISA^80H
MOVLWB'00000011';RB0, RB1 - НА ВХОД.
MOVWFTRISB^80H
CLRFVRCON^80H;ИОН ВЫКЛЮЧЕН.
CLRFPIE1^80H;
BCFSTATUS,5;ПЕРЕХОДИМ В БАНК 0.
CLRFPORTA;ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ
CLRFPORTB
CLRFT1CON;
CLRFT2CON;
MOVLW7
MOVWFCMCON;КОМПАРАТОРЫ ВЫКЛЮЧЕНЫ.
CLRFTMR0
CLRFFLAG
CLRFFLAG1
CLRFFLAG2
BSFFLAG2,0;ИНДИКАЦИЯ ТЕКУЩАЯ,
CLRFCEK
CLRFMIN
CLRFHOU
CLRFHOUL
CLRFHOUH
CLRFMINL
CLRFMINH
CLRFREID
CLRFKYPC
CLRFCOUN
CLRFCOUZ
CLRFCOUE
CLRFCOYC
CLRFMCK;МИЛЛИСЕКУНД.
CLRFEDI2;ЕДИНИЦЫ 2.
CLRFDES2;ДЕСЯТКИ 2.
CLRFDST2;ДЕСЯТЫЕ 2.
CLRFEDI1;ЕДИНИЦЫ 1.
CLRFDES1;ДЕСЯТКИ 1.
CLRFDST1;ДЕСЯТЫЕ 1.
CLRFMECDI;ДЕСЯТКИ МЕСЯЦА ИНДИКАЦИИ.
CLRFDHUDI;ДЕСЯТКИ ДНЕЙ ИНДИКАЦИИ.
CLRFMECD;ДЕСЯТКИ МЕСЯЦА.
CLRFDHUD;ДЕСЯТКИ ДНЕЙ.
MOVLW.253;-
MOVWFSOT1;ЗНАК 1.
MOVWFSOT2;ЗНАК 2.
MOVWFSOT2X;ЗНАК 2 MAX.
MOVWFSOT1X;ЗНАК 1 MAX.
MOVLW.251;+
MOVWFSOT1N;ЗНАК 1 MIN.
MOVWFSOT2N;ЗНАК 2 MIN.
MOVLW.1
MOVWFDHU;ДНИ ДВОИЧНЫЕ.
MOVWFDHUE;ЕДИНИЦЫ ДНЕЙ.
MOVWFMEC;МЕСЯЦ ДВОИЧНЫЙ.
MOVWFMECE;ЕДИНИЦЫ МЕСЯЦА.
MOVWFMECEI;ЕДИНИЦЫ МЕСЯЦА ИНДИКАЦИИ.
MOVWFMECZ;ДВОИЧНЫЙ МЕСЯЦ ЗАПИСИ/СЧИТЫВАНИЯ.
MOVWFDHUEI;ЕДИНИЦЫ ДНЕЙ ИНДИКАЦИИ.
MOVWFDHUZ;ДВОИЧНЫЕ ДНИ ЗАПИСИ/СЧИТЫВАНИЯ.
CALLPOLNO;УСТАНОВКА МАКСИМАЛЬНЫХ ЗНАЧЕНИЙ.
GOTOJEKINI;НА ИНИЦИАЛИЗАЦИЮ ИНДИКАТОРА.
;=======================================
; 29. УСТАНОВКА ЧАСОВ, ДАТЫ.
;=======================================
YC0
INCFHOUH,1;УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ.
MOVLW.3;НЕ БОЛЕЕ 2.
SUBWFHOUH,0;
SKPNC;
CLRFHOUH;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVFWHOUH;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALLDEBIN;КОД ДЕСЯТКИ.
ADDWFHOUL,0;ПРИБАВИМ ЕДИНИЦЫ
MOVWFHOU;И ПОЛУЧИМ ДВОИЧНОЕ ЧИСЛО.
RETURN;ВЕРНЕМСЯ.
YC1
INCFHOUL,1;УВЕЛИЧИМ ЕДИНИЦЫ ЧАСОВ.
MOVLW.10;НЕ БОЛЕЕ 9.
SUBWFHOUL,0;
SKPNC;
CLRFHOUL;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVFWHOUH;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALLDEBIN;КОД ДЕСЯТКИ.
ADDWFHOUL,0;ПРИБАВИМ ЕДИНИЦЫ
MOVWFHOU;ДВОИЧНОЕ ЗНАЧЕНИЕ НЕ ДОЛЖНО
ADDLW-18H;ПРЕВЫШАТЬ - 24.
SKPC;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 24,
RETURN
CLRFHOU;ТО ОБНУЛИМ ЧАСЫ ДВОИЧНЫЕ
CLRFHOUL;И РАЗРЯДЫ СТАРШИЙ
CLRFHOUH;И МЛАДШИЙ.
RETURN
YC2
INCFMINH,1;УВЕЛИЧИМ ДЕСЯТКИ МИНУТ.
MOVLW.6;НЕ БОЛЕЕ 5.
SUBWFMINH,0;
SKPNC;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 6,
CLRFMINH;ТО ОБНУЛИМ.
MOVFWMINH;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALLDEBIN;КОД ДЕСЯТКИ.
ADDWFMINL,0;ПРИБАВИМ ЕДИНИЦЫ И
MOVWFMIN;ЗАПИШЕМ В ДВОИЧНОМ КОДЕ.
RETURN
YC3
INCFMINL,1;УВЕЛИЧИМ ЕДИНИЦЫ МИНУТ.
MOVLW.10;НЕ БОЛЕЕ 9.
SUBWFMINL,0;
SKPNC;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 10,
CLRFMINL;ТО ОБНУЛИМ.
MOVFWMINH;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALLDEBIN;КОД ДЕСЯТКИ.
ADDWFMINL,0;ПРИБАВИМ ЕДИНИЦЫ И
MOVWFMIN;ЗАПИШЕМ В ДВОИЧНОМ КОДЕ.
RETURN
YC4
INCFDHUD,1;УВЕЛИЧИМ ДЕСЯТКИ ТЕКУЩИХ ДНЕЙ.
MOVLW.4;НЕ БОЛЕЕ 3.
SUBWFDHUD,0;
SKPNC;
CLRFDHUD;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVFWDHUD;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALLDEBIN;КОД ДЕСЯТКИ.
ADDWFDHUE,0;ПРИБАВИМ ЕДИНИЦЫ
MOVWFDHU;И ПОЛУЧИМ ДВОИЧНОЕ ЧИСЛО.
MOVFWMEC;ЕСЛИ В ТЕКУЩЕМ МЕСЯЦЕ
CALLDAYMON;МЕНЬШЕ ДНЕЙ,
SUBWFDHU,0;
SKPC;
GOTO$+4;
MOVLW.1;
MOVWFDHUE;ТО УСТАНОВИМ ЕДИНИЦЫ
GOTO$-0x0B;И ЕЩЕ РАЗ ПРОВЕРИМ СУММУ.
TSTFDHU;ЕСЛИ СУММА ДНЕЙ НУЛЕВАЯ,
BZ$-5;ТО СНОВА УСТАНОВИМ.
MOVFWDHUD;ПЕРЕПИШЕМ В РЕГИСТРЫ
MOVWFDHUDI;ИНДИКАЦИИ.
MOVFWDHUE;
MOVWFDHUEI;
RETURN;ВЕРНЕМСЯ.
YC5
INCFDHUE,1;УВЕЛИЧИМ ЕДИНИЦЫ ДНЕЙ.
MOVLW.10;НЕ БОЛЕЕ 9.
SUBWFDHUE,0;
SKPNC;
CLRFDHUE;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVFWDHUD;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALLDEBIN;КОД ДЕСЯТКИ.
ADDWFDHUE,0;ПРИБАВИМ ЕДИНИЦЫ
MOVWFDHU;И ПОЛУЧИМ ДВОИЧНОЕ ЧИСЛО.
MOVFWMEC;ЕСЛИ В ТЕКУЩЕМ МЕСЯЦЕ
CALLDAYMON;МЕНЬШЕ ДНЕЙ,
SUBWFDHU,0;
SKPC;
GOTO$+5;
CLRFDHUD;ТО ОБНУЛИМ ДЕСЯТКИ ДНЕЙ,
MOVLW.1;УСТАНОВИМ ЕДИНИЦЫ
MOVWFDHUE;ДНЕЙ
GOTO$-0x0C;И ЕЩЕ РАЗ ПРОВЕРИМ СУММУ.
TSTFDHU;ЕСЛИ СУММА ДНЕЙ НУЛЕВАЯ,
BZ$-5;А НУЛЕВОГО ДНЯ НЕТ, ТО СНОВА УСТАНОВИМ.
MOVFWDHUD;ПЕРЕПИШЕМ В РЕГИСТРЫ
MOVWFDHUDI;ИНДИКАЦИИ.
MOVFWDHUE;
MOVWFDHUEI;
RETURN;ВЕРНЕМСЯ.
YC6
INCFMECD,1;УВЕЛИЧИМ ДЕСЯТКИ МЕСЯЦА.
MOVLW.2;НЕ БОЛЕЕ 1.
SUBWFMECD,0;
SKPNC;
CLRFMECD;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVFWMECD;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALLDEBIN;КОД ДЕСЯТКИ.
ADDWFMECE,0;ПРИБАВИМ ЕДИНИЦЫ
MOVWFMEC;И ПОЛУЧИМ ДВОИЧНОЕ ЧИСЛО.
MOVLW.13;НЕ БОЛЕЕ 12.
SUBWFMEC,0;
SKPC;
GOTO$+5;
CLRFMECD;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVLW.1;УСТАНОВИМ ПЕРВЫЙ МЕСЯЦ.
MOVWFMECE;
GOTO$-0x0C;
TSTFMEC;ЕСЛИ МЕСЯЦ НУЛЕВОЙ,
BZ$-5;ТО УСТАНОВИМ.
MOVFWMECD;ПЕРЕПИШЕМ В РЕГИСТРЫ
MOVWFMECDI;ИНДИКАЦИИ.
MOVFWMECE;
MOVWFMECEI;
RETURN;ВЕРНЕМСЯ.
YC7
INCFMECE,1;УВЕЛИЧИМ ЕДИНИЦЫ МЕСЯЦА.
MOVLW.10;НЕ БОЛЕЕ 9.
SUBWFMECE,0;
SKPNC;
CLRFMECE;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVFWMECD;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALLDEBIN;КОД ДЕСЯТКИ.
ADDWFMECE,0;ПРИБАВИМ ЕДИНИЦЫ
MOVWFMEC;И ПОЛУЧИМ ДВОИЧНОЕ ЧИСЛО.
MOVLW.13;НЕ БОЛЕЕ 12.
SUBWFMEC,0;
SKPC;
GOTO$+5;
CLRFMECD;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVLW.1;УСТАНОВИМ ПЕРВЫЙ МЕСЯЦ.
MOVWFMECE;
GOTO$-0x0C;
TSTFMEC;ЕСЛИ МЕСЯЦ НУЛЕВОЙ,
BZ$-5;ТО УСТАНОВИМ.
MOVFWMECD;ПЕРЕПИШЕМ В РЕГИСТРЫ
MOVWFMECDI;ИНДИКАЦИИ.
MOVFWMECE;
MOVWFMECEI;
RETURN;ВЕРНЕМСЯ.
YC8M
DECFDHUEI,1;УМЕНЬШИМ ЕДИНИЦЫ ДНЕЙ ПРОСМОТРА.
MOVLW.255;ЕСЛИ ПЕРЕХОД ЧЕРЕЗ 0,
SUBWFDHUEI,0;
BNC$+8;
MOVLW.9;ТО УСТАНОВИМ 9.
MOVWFDHUEI;
DECFDHUDI,1;УМЕНЬШИМ ДЕСЯТКИ ДНЕЙ
MOVLW.255;ЕСЛИ НЕТ ПЕРЕХОДА ЧЕРЕЗ 0,
SUBWFDHUDI,0;
SKPC;
GOTOYC8COY;ТО УСТАНОВИМ СЧЕТЧИК ДНЕЙ.
MOVFWDHUEI;ЕСЛИ СУММА ДНЕЙ
ADDWFDHUDI,0;НЕ РАВНА НУЛЮ,
SKPZ
GOTOYC8COY;ТО УСТАНОВИМ СЧЕТЧИК ДНЕЙ.
DECFMECZ,1;ИНАЧЕ УМЕНЬШИМ МЕСЯЦ.
SKPZ;ЕСЛИ МЕСЯЦ НУЛЕВОЙ,
GOTO$+3;
MOVLW.12;ТО УСТАНОВИМ ДЕКАБРЬ.
MOVWFMECZ;
MOVFWMECZ;ПРОВЕРИМ ЧИСЛО ДНЕЙ В МЕСЯЦЕ.
CALLDAYMON;
MOVWFDHUDI;ПЕРЕКОДИРУЕМ ДНИ.
MOVWFTEMP;ИЗ 2-ГО В 2_10-Е.
CALLBIDE;ТОЛЬКО ДО 99!
MOVWFDHUDI;
MOVFWTEMP;
MOVWFDHUEI;
MOVFWMECZ;ПЕРЕКОДИРУЕМ МЕСЯЦ.
MOVWFTEMP;ИЗ 2-ГО В 2_10-Е.
CALLBIDE;ТОЛЬКО ДО 99!
MOVWFMECDI;
MOVFWTEMP;
MOVWFMECEI;ДНЕЙ В ТАБЛИЦЕ МЕСЯЦА НА 1 БОЛЬШЕ,
GOTOYC8M;ПОЭТОМУ ПОВТОРИМ.
YC8COY
INCFCOYC,1;УМЕНЬШИМ СЧЕТЧИК ДНЕЙ.
MOVLW.8;НЕ БОЛЕЕ 7.
SUBWFCOYC,0;
SKPC;
GOTOYC8COU;НА УСТАНОВКУ СЧЕТЧИКА СЧИТЫВАНИЯ.
CLRFCOYC;ОБНУЛИМ СЧЕТЧИК.
CALLREGIN;ЗАГРУЗИМ ТЕКУЩИЙ ДЕНЬ.
BCFFLAG2,6;СБРОСИМ ФЛАГ СЧЕТЧИКА ДНЕЙ.
GOTOYC8M;УСТАНОВИМ ВЧЕРАШНИЙ ДЕНЬ.
YC8COU
BSFFLAG2,5;УСТАНОВИМ ФЛАГ ВЫПОЛНЕННОЙ УСТАНОВКИ МИНУС.
BTFSCFLAG2,6;ЕСЛИ ФЛАГ НУЛЕВОЙ,
GOTO$+0x09;
CLRFCOYC;
MOVLW.16;ТО УСТАНОВИМ СЧЕТЧИК СЧИТЫВАНИЯ.
SUBWFCOUZ,0;АДРЕС ЧТЕНИЯ РАВЕН АДРЕСУ ЗАПИСИ
MOVWFCOUE;МИНУС 16.
BNC$+7;ЕСЛИ ПЕРЕХОД ЧЕРЕЗ 0, ТО УСТАНОВИМ .112.
BSFFLAG2,6;УСТАНОВКА ВЫПОЛНЕНА.
RETURN;ВЕРНЕМСЯ.
MOVLW.16;СЛЕДУЮЩИЙ АДРЕС ЧТЕНИЯ
SUBWFCOUE,1;РАВЕН ТЕКУЩЕМУ МИНУС 16.
SKPNC;ЕСЛИ ПЕРЕХОД ЧЕРЕЗ 0,
RETURN
MOVLW.112;ТО УСТАНОВИМ .112.
MOVWFCOUE;
BSFFLAG2,6;УСТАНОВКА ВЫПОЛНЕНА.
RETURN
YC00
CLRFMIN;ОБНУЛЕНИЕ РЕГИСТРОВ
CLRFMINL;МИНУТ И СЕКУНД
CLRFMINH;ПРИ УСТАНОВКЕ ПО СИГНАЛАМ
CLRFCEK;ТОЧНОГО ВРЕМЕНИ.
RETURN
;======================================================
; 30. ВОССТАНОВЛЕНИЕ ТЕКУЩИХ РЕГИСТРОВ ИНДИКАЦИИ ПОСЛЕ ПРОСМОТРА.
;======================================================
REGIN
MOVFWMECD;
MOVWFMECDI;
MOVFWMECE;
MOVWFMECEI;
MOVFWDHUD;
MOVWFDHUDI;
MOVFWDHUE;
MOVWFDHUEI;
MOVFWMEC;
MOVWFMECZ;
RETURN
;=============================================
; 31. ПРЕДЕЛЬНЫЕ УСТАНОВКИ MAX, MIN В ПОЛНОЧЬ.
;=============================================
POLNO
MOVLW.253;-
MOVWFSOT1X;ЗНАК 1 MAX.
MOVWFSOT2X;ЗНАК 2 MAX.
MOVLW.55;-55.
MOVWFLSB1X;СОХРАНЕННОЕ МАКСИМАЛЬНОЕ 1 ДАТЧИКА.
MOVWFLSB2X;-"- 2 ДАТЧИКА.
CLRFDST1X;СОХРАНЕННОЕ МАКСИМАЛЬНОЕ ДЕСЯТЫХ 1 ДАТЧИКА.
CLRFDST2X;-"- 2 ДАТЧИКА.
MOVLW.251;+
MOVWFSOT1N;ЗНАК 1 MIN.
MOVWFSOT2N;ЗНАК 2 MIN.
MOVLW.99;+99.
MOVWFLSB1N;СОХРАНЕННОЕ МИНИМАЛЬНОЕ 1 ДАТЧИКА.40
MOVWFLSB2N;-"- 2 ДАТЧИКА.
MOVLW.9;0,9
MOVWFDST1N;СОХРАНЕННОЕ МИНИМАЛЬНОЕ ДЕСЯТЫХ 1 ДАТЧИКА.
MOVWFDST2N;-"- 2 ДАТЧИКА.
RETURN
;=========================================
; 32. ИНИЦИАЛИЗАЦИЯ ЖКИ.
;=========================================
JEKINI
MOVLW03;
CALLJEKOM;
CALLSTROB;
MOVLW03;
CALLJEKOM;
CALLSTROB;
MOVLW03;
CALLJEKOM;
CALLSTROB;
MOVLW03;
CALLJEKOM;
CALLSTROB;
MOVLW10;ВЫКЛЮЧЕНИЕДИСПЛЕЯ.
CALLJEKOM;
CALLSTROB;
MOVLW06;СМЕЩЕНИЕКУРСОРА.
CALLJEKOM;
CALLSTROB;
MOVLW01;СТИРАНИЕПАМЯТИДИСПЛЕЯ.
CALLJEKOM;
CALLSTROB;
MOVLW28;ФОРМАТОБМЕНА: 4 РАЗР., 5х7, 2 СТРОКИ.
CALLJEKOM;
CALLSTROB;
MOVLW0C;ВКЛЮЧЕНИЕДИСПЛЕЯ, ЗАПРЕТКУРСОРА.
CALLJEKOM;
CALLSTROB;
GOTOMYLTIK;НАРАСПРЕДЕЛИТЕЛЬ.
;=========================================
; 33. ФОРМИРОВАНИЕ СТРОБИРУЮЩЕГО ИМПУЛЬСА.
;=========================================
STROB
BSF PORTB,E ;ВКЛЮЧАЕМ СТРОБ-ИМПУЛЬС.
NOP
BCF PORTB,E ;ВЫКЛЮЧАЕМ СТРОБ.
RETURN ;ВЕРНЕМСЯ.
;===============================================
; 34. ПЕРЕДАЧА КОМАНДЫ В ЖКИ.
;===============================================
JEKOM
MOVWF TEMP ;ПЕРЕПИШЕМ ЗНАЧЕНИЕ ВО ВРЕМЕННЫЙ РЕГИСТР.
ANDLW B'11110000';ЗАМАСКИРУЕМ МЛАДШИЕ РАЗРЯДЫ ПОД НОЛЬ.
MOVWF PORTB ;ОСТАЛЬНЫЕ РАЗРЯДЫ ПЕРЕПИШЕМ В ПОРТ "В".
CALL STROB ;ПРОСТРОБИРУЕМ.
CALL PAUSA ;ПАУЗА.
MOVFW TEMP
SWAPF TEMP,W ;ПОМЕНЯЕМ МЕСТАМИ ПОЛУБАЙТЫ.
ANDLW B'11110000';ЗАМАСКИРУЕМ СТАРШИЕ РАЗРЯДЫ ПОД НОЛЬ.
MOVWF PORTB ;ПЕРЕПИШЕМ В ПОРТ "В".
CALL STROB ;ПРОСТРОБИРУЕМ.
PAUSA
MOVLW .255;1 МС. ПАУЗА ДЛЯ ЗАПИСИ КОМАНДЫ.
ADDLW -1
BTFSS STATUS,2
GOTO $-2
RETURN
;=====================================
; 35. ЗАПИСЬДАННЫХВЖКИ.
;=====================================
JEDAT
MOVWF TEMP;ПЕРЕПИШЕМ ЗНАЧЕНИЕ ВО ВРЕМЕННЫЙ РЕГИСТР.
ANDLW B'11110000';ЗАМАСКИРУЕМ МЛАДШИЕ РАЗРЯДЫ ПОД НОЛЬ.
ADDLW 30;ПЕРЕВОД В КОД ASCII, ТОЛЬКО ДЛЯ ЦИФР!
MOVWF PORTB;ОСТАЛЬНЫЕ РАЗРЯДЫ ПЕРЕПИШЕМ В ПОРТ "В".
BSF PORTB,RS;УСТАНОВИМ R/S НА РАЗРЕШЕНИЕ ЗАПИСИ ДАННЫХ.
CALL STROB;ПРОСТРОБИРУЕМ.
CALL PAUS;ПАУЗА ДЛЯ ОСВОБОЖДЕНИЯ ЖКИ ОТ ЦИКЛА ЗАПИСИ.
MOVFW TEMP;
SWAPF TEMP,0;ПОМЕНЯЕМ МЕСТАМИ ПОЛУБАЙТЫ.
ANDLW B'11110000';ЗАМАСКИРУЕМ СТАРШИЕ РАЗРЯДЫ ПОД НОЛЬ.
MOVWF PORTB;ОСТАЛЬНЫЕ РАЗРЯДЫ ПЕРЕПИШЕМ В ПОРТ "В".
BSF PORTB,RS;УСТАНОВИМ R/S НА РАЗРЕШЕНИЕ ЗАПИСИ ДАННЫХ.
CALL STROB;ПРОСТРОБИРУЕМ.
PAUS
MOVLW .10;40 МКС. ПАУЗА ДЛЯ ЗАПИСИ ДАННЫХ.
ADDLW -1
BTFSS STATUS,2
GOTO $-2
RETURN
;========================================
; 36. ПЕРЕЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ.
;========================================
CTP1
BTFSCFLAG2,0;
GOTOTEK1;ТЕКУЩАЯ ИНДИКАЦИЯ.
BTFSCFLAG2,1;
GOTOINDYC1;УСТАНОВКА ЧАСОВ И ДНЕЙ.
GOTOCMOTP1;ПРОСМОТР.
CTP2
BTFSCFLAG2,0;
GOTOTEK2;ТЕКУЩАЯ ИНДИКАЦИЯ.
BTFSCFLAG2,1;
GOTOINDYC2;УСТАНОВКА ЧАСОВ И ДНЕЙ.
GOTOCMOTP2;ПРОСМОТР.
TEK1
MOVFWDHUDI;ТЕКУЩАЯ ИНДИКАЦИЯ 1 СТРОКИ, ДЕСЯТКИ ДНЕЙ.
MOVWFR1;
MOVFWDHUEI;ЕДИНИЦЫ ДНЕЙ.
MOVWFR2;
MOVLW.240;ПУСТО.
MOVWFR3;
MOVWFR9;
MOVFWHOUH;ДЕСЯТКИ ЧАСОВ.
MOVWFR4;
MOVFWHOUL;ЕДИНИЦЫ ЧАСОВ.
MOVWFR5;
MOVLW.240;ПУСТО.
BTFSCCEK,0;ДВОЕТОЧИЕ ВКЛЮЧАЕТСЯ ЧЕРЕЗ 1 СЕКУНДУ.
MOVLW.10;ДВОЕТОЧИЕ.
MOVWFR6;
MOVFWMINH;ДЕСЯТКИ МИНУТ.
MOVWFR7;
MOVFWMINL;ЕДИНИЦЫ МИНУТ.
MOVWFR8;
MOVFWSOT1;ЗНАК.
MOVWFR10;
MOVFWDES1;ДЕСЯТКИ ТЕМПЕРАТУРЫ 1.
MOVWFR11;
MOVFWEDI1;ЕДИНИЦЫ ТЕМПЕРАТУРЫ 1.
MOVWFR12;
MOVLW.252;ЗАПЯТАЯ 1.
MOVWFR13;
MOVFWDST1;ДЕСЯТЫЕ ТЕМПЕРАТУРЫ 1.
MOVWFR14;
MOVLW.14;>.
MOVWFR15;
MOVLW.1;1.
MOVWFR16;
RETURN
TEK2
MOVFWMECDI;ТЕКУЩАЯ ИНДИКАЦИЯ 2 СТРОКИ, ДЕСЯТКИ МЕСЯЦА.
MOVWFR1;
MOVFWMECEI;ЕДИНИЦЫ МЕСЯЦА.
MOVWFR2;
MOVLW.240;ПУСТО.
MOVWFR3;
MOVWFR4;
MOVWFR5;
MOVWFR6;
MOVWFR7;
MOVWFR8;
MOVWFR9;
MOVFWSOT2;ЗНАК 2.
MOVWFR10;
MOVFWDES2;ДЕСЯТКИ ТЕМПЕРАТУРЫ 2.
MOVWFR11;
MOVFWEDI2;ЕДИНИЦЫ ТЕМПЕРАТУРЫ 2.
MOVWFR12;
MOVLW.252;ЗАПЯТАЯ 2.
MOVWFR13;
MOVFWDST2;ДЕСЯТЫЕ ТЕМПЕРАТУРЫ 2.
MOVWFR14;
MOVLW.14;>.
MOVWFR15;
MOVLW.2;2.
MOVWFR16;
RETURN
INDYC1
BTFSSPORTA,HOL;ЕСЛИ НАЖАТА КНОПКА "СБРОС",
CALLYC00;ТО ОБНУЛИМ СЕКУНДЫ И МИНУТЫ.
MOVLW.123;УСТАНОВКА ЧАСОВ И ДАТЫ 1 СТРОКА.
MOVWFR1;Ч.
MOVLW.17;А.
MOVWFR2;
MOVLW.19;С.
MOVWFR3;
MOVLW.126;Ы.
MOVWFR4;
MOVLW.240;ПУСТО.
MOVWFR5;
MOVWFR11;
MOVWFR12;
MOVWFR13;
MOVWFR14;
MOVWFR15;
MOVWFR16;
MOVFWHOUH;ТЕКУЩИЕ ЗНАЧЕНИЯ: ДЕСЯТКИ ЧАСОВ,
MOVWFR6;
MOVFWHOUL;ЕДИНИЦЫ ЧАСОВ.
MOVWFR7;
MOVLW.10;ДВОЕТОЧИЕ.
MOVWFR8;
MOVFWMINH;ДЕСЯТКИ МИНУТ.
MOVWFR9;
MOVFWMINL;ЕДИНИЦЫ МИНУТ.
MOVWFR10;
RETURN
INDYC2
MOVLW.176;Д.
MOVWFR1;
MOVLW.17;А.
MOVWFR2;
MOVLW.36;Т.
MOVWFR3;
MOVLW.17;А.
MOVWFR4;
MOVLW.240;ПУСТО.
MOVWFR5;
MOVWFR11;
MOVWFR12;
MOVWFR13;
MOVWFR14;
MOVWFR15;
MOVWFR16;
MOVFWDHUDI;ДЕСЯТКИДНЕЙ.
MOVWFR6;
MOVFWDHUEI;ЕДИНИЦЫДНЕЙ.
MOVWFR7;
MOVLW.253;ПРОЧЕРК.
MOVWFR8;
MOVFWMECDI;ДЕСЯТКИ МЕСЯЦА.
MOVWFR9;
MOVFWMECEI;ЕДИНИЦЫ МЕСЯЦА.
MOVWFR10;
RETURN
CMOTP1
MOVFWDHUDI;ЕСЛИ ПРОСМОТР
ADDWFDHUEI,0;СЕГОДНЯШНЕЙ ДАТЫ,
SUBWFDHU,0;ТО РЕГИСТРЫ ИНДИКАЦИИ НЕ МЕНЯЕМ.
SKPC;
GOTO$+5;
MOVFWMECDI;
ADDWFMECEI,0;
SUBWFMEC,0;
SKPNC;
CALLBDINZ1;ИНАЧЕ УСТАНОВИМ СЧИТАННЫЕ ЗНАЧЕНИЯ 1 СТРОКИ.
MOVFWDHUDI;ДЕСЯТКИ ДНЕЙ.
MOVWFR1;
MOVFWDHUEI;ЕДИНИЦЫ ДНЕЙ.
MOVWFR2;
MOVLW.14;>.
MOVWFR3;ПО УМОЛЧАНИЮ
MOVLW.1;1.
BTFSCFLAG1,1;ЕСЛИ ФЛАГ УСТАНОВЛЕН,
MOVLW.2;ТО - 2.
MOVWFR4;
MOVLW.240;ПУСТО.
MOVWFR5;
MOVWFR11;
MOVLW.253;ПРОЧЕРК.
MOVWFR8;
MOVFWDES1;ДЕСЯТКИ ТЕМПЕРАТУРЫ.
MOVWFR13;
MOVFWEDI1;ЕДИНИЦЫ ТЕМПЕРАТУРЫ.
MOVWFR14;
MOVLW.252;ЗАПЯТАЯ 1.
MOVWFR15;
MOVFWDST1;ДЕСЯТЫЕ ТЕМПЕРАТУРЫ.
MOVWFR16;
RETURN
CMOTP2
MOVFWDHUDI;ЕСЛИ ПРОСМОТР
ADDWFDHUEI,0;СЕГОДНЯШНЕЙ ДАТЫ,
SUBWFDHU,0;ТО РЕГИСТРЫ ИНДИКАЦИИ НЕ МЕНЯЕМ.
SKPC;
GOTO$+5;
MOVFWMECDI;
ADDWFMECEI,0;
SUBWFMEC,0;
SKPNC;
CALLBDIN12;ИНАЧЕ УСТАНОВИМ СЧИТАННЫЕ ЗНАЧЕНИЯ 2 СТРОКИ.
MOVFWMECDI;ДЕСЯТКИ МЕСЯЦА.
MOVWFR1;
MOVFWMECEI;ЕДИНИЦЫ МЕСЯЦА.
MOVWFR2;
MOVLW.240;ПУСТО.
MOVWFR3;
MOVWFR4;
MOVWFR5;
MOVWFR11;
MOVLW.253;ПРОЧЕРК.
MOVWFR8;
MOVFWDES2;ДЕСЯТКИ ТЕМПЕРАТУРЫ 2.
MOVWFR13;
MOVFWEDI2;ЕДИНИЦЫ ТЕМПЕРАТУРЫ 2.
MOVWFR14;
MOVLW.252;ЗАПЯТАЯ 2.
MOVWFR15;
MOVFWDST2;ДЕСЯТЫЕ ТЕМПЕРАТУРЫ 2.
MOVWFR16;
RETURN
;======================================================
; 37. ВЫВОД ЗНАЧЕНИЙ РЕГИСТРОВ НА ИНДИКАЦИЮ.
;======================================================
JEKIND
BSFSTATUS,5;ПЕРЕХОДИМ В БАНК 1.
BCFTRISB^80H,YCMI;НА ВЫХОД.
BCFTRISB^80H,YCPL;НА ВЫХОД.
BCFSTATUS,5;ПЕРЕХОДИМ В БАНК 0.
BTFSSFLAG1,0;ЕСЛИ ТЕКУЩАЯ ИНДИКАЦИЯ,
GOTO$+3;ТО ПРОПУСКАЕМ ИНДИКАЦИЮ КУРСОРА.
BTFSSFLAG,6;ЕСЛИ ИНДИКАЦИЯ КУРСОРА ВЫПОЛНЕНА, ТО ПРОПУСКАЕМ ЕЕ.
GOTO JEKYC;ПРОИНДИЦИРУЕМ КУРСОР.
MOVLW 02;ВОЗВРАТ КУРСОРА В ИСХОДНОЕ СОСТОЯНИЕ.
CALL JEKOM;ЗАПИШЕМ КОМАНДУ.
MOVLW B'10000000';КУРСОР НА 0 ПОЗИЦИЮ ПЕРВОЙ СТРОКИ.
CALL JEKOM;ЗАПИШЕМ КОМАНДУ.
CALLCTP1;ПЕРЕПИШЕМ В РЕГИСТРЫ ИНДИКАЦИИ 1 СТРОКУ.
CALLJEKCTP;ЗАПИШЕМ В ИНДИКАТОР 1 СТРОКУ.
MOVLW B'11000000';ВТОРАЯ СТРОКА. 0x0C0
CALL JEKOM;ЗАПИШЕМ КОМАНДУ.
CALLCTP2;ПЕРЕПИШЕМ В РЕГИСТРЫ ИНДИКАЦИИ 2 СТРОКУ.
CALLJEKCTP;ЗАПИШЕМ В ИНДИКАТОР 2 СТРОКУ.
BCFFLAG,6;
RETURN
JEKCTP
MOVLW.16;
MOVWFCOUN;УСТАНОВИМ СЧЕТЧИК ИНДИКАЦИИ ЗНАКОМЕСТ.
MOVLW R1;АДРЕС ПЕРВОГО РЕГИСТРА ИНДИКАЦИИ.
MOVWFFSR;ПО КОСВЕННОЙ АДРЕСАЦИИ
MOVFWINDF;УСТАНОВИМ ЗНАЧЕНИЕ РЕГИСТРА.
CALL JEDAT;ЗАПИШЕМ В ИНДИКАТОР.
DECFCOUN,1;УМЕНЬШИМ СЧЕТЧИК.
BTFSCSTATUS,2;ЕСЛИ НЕТ НУЛЯ,
RETURN;
INCFFSR,1;ТО ВЫБЕРЕМ СЛЕДУЮЩИЙ РЕГИСТР.
GOTO$-6;ПОВТОРИМ ВЫВОД НА ИНДИКАЦИЮ.
;=======================================
; 38. ПРОВЕРКА КНОПОК.
;=======================================
KHOP
BSFSTATUS,5;ПЕРЕХОДИМ В БАНК 1.
BSFTRISB^80H,YCMI;НА ВХОД.
BSFTRISB^80H,YCPL;НА ВХОД.
BCFSTATUS,5;ПЕРЕХОДИМ В БАНК 0.
BTFSSFLAG1,0;ЕСЛИ НЕТ УСТАНОВКИ,
GOTOKHOP1;КНОПКИ НЕ ПРОВЕРЯЮТСЯ.
BTFSCFLAG2,2;ПРИ ПРОСМОТРЕ
GOTO$+0x0D;НЕ ПРОВЕРЯЕТСЯ РАЗРЯД И ПЛЮС.
BTFSCFLAG,3;ЕСЛИ РАНЕЕ БЫЛА НАЖАТА КНОПКА,
CALLYCTAL;ТО ИДЕМ НА УСТАНОВКУ РАЗРЯДА.
BTFSSPORTB,YCPL;ЕСЛИ КНОПКА ПЛЮС НАЖАТА,
BSFFLAG,3;ПОСТАВИМ ФЛАГ.
BTFSSPORTB,YCPL;ЕСЛИ КНОПКА ПЛЮС НАЖАТА,
BSFFLAG1,2;ЗАПРЕЩАЕМ ИНДИКАЦИЮ.
BTFSCFLAG,5;ЕСЛИ РАНЕЕ БЫЛА НАЖАТА КНОПКА "РАЗРЯД",
CALLKYPCY;ТО ИДЕМ НА УСТАНОВКУ КУРСОРА.
BTFSSPORTB,PAZ;ЕСЛИ КНОПКА "РАЗРЯД" НАЖАТА,
BSFFLAG,5;ПОСТАВИМ ФЛАГ.
BTFSCFLAG2,1;ПРИ УСТАНОВКЕ ДАТЫ
GOTOKHOP1;КНОПКА МИНУС НЕ ПРОВЕРЯЕТСЯ.
BTFSCFLAG,2;ЕСЛИ РАНЕЕ БЫЛА НАЖАТА КНОПКА МИНУС,
CALLYCTAM;ТО ИДЕМ НА УСТАНОВКУ РАЗРЯДА.
BTFSSPORTB,YCMI;ЕСЛИ КНОПКА МИНУС НАЖАТА,
BSFFLAG,2;ПОСТАВИМ ФЛАГ.
BTFSSPORTB,YCMI;ЕСЛИ КНОПКА МИНУС НАЖАТА,
BSFFLAG1,2;ЗАПРЕЩАЕМ ИНДИКАЦИЮ.
KHOP1
BTFSSPORTB,PEJ;ЕСЛИ КНОПКА "РЕЖИМ" НАЖАТА,
BSFFLAG,4;ПОСТАВИМ ФЛАГ.
BTFSSFLAG,4;ЕСЛИ КНОПКА "РЕЖИМ" НЕ БЫЛА НАЖАТА,
GOTOVUBOR;ТО ИДЕМ НА ВЫБОР РЕЖИМА ИНДИКАЦИИ.
BTFSSPORTB,PEJ;ЕСЛИ КНОПКА "РЕЖИМ" НАЖАТА,
GOTOVUBOR;ТО ИДЕМ НА ВЫБОР РЕЖИМА ИНДИКАЦИИ.
BCFFLAG,4;СБРОСИМ ФЛАГ КНОПКИ.
INCFREID,1;ИЗМЕНЕНИЕ РЕЖИМА ИНДИКАЦИИ.
MOVLW.3;3 РЕЖИМА ИНДИКАЦИИ.
SUBWFREID,0;ЕСЛИ БОЛЬШЕ,
BTFSSSTATUS,2;ТО ПОЙДЕМ НА СБРОС.
GOTOVUBOR;НА ЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ.
CLRFREID;СБРОС РЕЖИМА.
GOTOVUBOR;НА ВЫБОР РЕЖИМА ИНДИКАЦИИ.
;======================================================
; 39. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ.
;======================================================
PRER
MOVWFWTEMP;СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W И
MOVFWSTATUS;STATUS,
MOVWFSTEMP;
MOVFWFSR;FSR.
MOVWFFTEMP;
CALLS1;
REPER ;ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ.
MOVFWSTEMP;ВОССТАНОВЛЕНИЕ РЕГИСТРОВ:
MOVWFSTATUS;STATUS,
MOVFWFTEMP;
MOVWFFSR;FSR,
MOVFWWTEMP;W.
BCFINTCON,2;СБРАСЫВАЕМ ФЛАГ ПРЕРЫВАНИЯ ОТ TMR0.
RETFIE ;ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ.
;=============================================
; 40. СЧЕТ И ПЕРЕКОДИРОВКА РЕГИСТРОВ Ч-М-С.
;=============================================
S1
INCFMCK,1;ПРИБАВИМ 1 В РЕГИСТР МИЛЛИСЕКУНД.
MOVFWMCK;
ADDLW-0x7D;СЧИТАЕМ ДО 125.
BTFSSSTATUS,2;
RETURN;
CLRFMCK;ОБНУЛИМ.
BTFSCFLAG,7;РАЗДЕЛИМ НА 2.
GOTO$+3;
BSFFLAG,7;
RETURN;
BCFFLAG,7;ОБНУЛИМ ДЕЛИТЕЛЬ.
MOVFWCEK;ЗАГРУЗКА ЗНАЧЕНИЙ СЕКУНД В РАБ. РЕГИСТР.
ADDLW-3BH;ВЫЧЕСТЬ ИЗ РЕГИСТРА 59.236:4=59-0x0EC;
BZM1;СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА M1,
INCFCEK,1;ИНАЧЕ ПРИБАВИТЬ 1 В РЕГИСТР СЕКУНД.
RETURN;
M1
CLRFCEK;ОБНУЛЕНИЕ РЕГИСТРА СЕКУНД.
MOVFWMIN;ЗАГРУЗКА МИНУТ В РАБ. РЕГИСТР.
ADDLW-3BH;-59.
BZH1;СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА H1.
INCFMIN,1;ПРИБАВИТЬ 1 В МИНУТЫ.
MOVFWMIN;MIN >W.
MOVWFTEMP;.
CALLBIDE;ПЕРЕКОДИРУЕМ.
MOVWFMINH;W > В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ МИНУТ.
MOVFWTEMP;ВРЕМЕННЫЙ
MOVWFMINL;В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ МИНУТ.
RETURN;
H1
CLRFMIN;ОБНУЛЯЕМ РЕГИСТР МИНУТ.
CLRFMINL;ОБНУЛЯЕМ ЕДИНИЦЫ МИНУТ ИНДИКАЦИИ.
CLRFMINH;ОБНУЛЯЕМ ДЕСЯТКИ МИНУТ ИНДИКАЦИИ.
MOVFWHOU;ЗАГРУЗКА ЧАСОВ В РАБ. РЕГИСТР.
ADDLW-17H;- 23.
BZD1;СРАВНИТЬ НА 0, ЕСЛИ РАВНО, ПЕРЕЙТИ НА H10.
INCFHOU,1;ПРИБАВИТЬ 1 В ЧАСЫ.
MOVFWHOU;HOU >W.
MOVWFTEMP;
CALLBIDE;ПЕРЕКОДИРУЕМ.
MOVWFHOUH;W > В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ ЧАСОВ.
MOVFWTEMP;ВРЕМЕННЫЙ
MOVWFHOUL;В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ ЧАСОВ.
RETURN;
D1
CLRFHOU;ОБНУЛЕНИЕ РЕГИСТРА ЧАСОВ.
CLRFHOUL;ОБНУЛЕНИЕ ЕДИНИЦ ЧАСОВ.
CLRFHOUH;ОБНУЛЕНИЕ ДЕСЯТКОВ ЧАСОВ.
CALLSAPIS;НА ЗАПИСЬ.
CALLPOLNO;НА УСТАНОВКУ ПРЕДЕЛЬНЫХ ЗНАЧЕНИЙ.
INCFDHU,1;ПРИБАВИТЬ 1 В ДНИ.
MOVFWMEC;ЧИСЛО ДНЕЙ НЕ ДОЛЖНО ПРЕВЫШАТЬ
CALLDAYMON;ЧИСЛА ДАННОГО МЕСЯЦА.
SUBWFDHU,0;
SKPNC;
GOTOME1;ИНАЧЕ УВЕЛИЧИМ МЕСЯЦ.
MOVFWDHU;
MOVWFTEMP;
CALLBIDE;ПЕРЕКОДИРУЕМ.
MOVWFDHUD;W > В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ ДНЕЙ.
MOVFWTEMP;ВРЕМЕННЫЙ
MOVWFDHUE;В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ ДНЕЙ.
RETURN;
ME1
MOVLW.1;УСТАНОВИМ ПЕРВОЕ ЧИСЛО.
MOVWFDHU;
MOVWFDHUE;
CLRFDHUD;
INCFMEC,1;ПРИБАВИМ МЕСЯЦ.
MOVLW.13;НЕ БОЛЕЕ 12.
SUBWFMEC,0;
SKPNC;
GOTOME1ME;ЕСЛИ БОЛЬШЕ, ТО УСТАНОВИМ 1 ЯНВАРЯ.
MOVFWMEC;
MOVWFTEMP;
CALLBIDE;ПЕРЕКОДИРУЕМ.
MOVWFMECD;W > В РЕГИСТР ИНДИКАЦИИ ДЕСЯТКОВ МЕСЯЦА.
MOVFWTEMP;ВРЕМЕННЫЙ
MOVWFMECE;В РЕГИСТР ИНДИКАЦИИ ЕДИНИЦ МЕСЯЦА.
RETURN;
ME1ME
MOVLW.1;1 ЯНВАРЯ.
MOVWFMEC;01-01.
MOVWFMECE;
CLRFMECD;
RETURN;
;=======================================
; 41. ПЕРЕКОДИРОВКА ИЗ 2-ГО В 2_10.
;=======================================
BIDE;ПЕРЕКОДИРОВКА ДЕСЯТКОВ
CLRFCOUN;ОБНУЛЯЕМ СЧЕТЧИК.
ADDLW-.10;ВЫЧТЕМ 10.
BTFSSSTATUS,0;ЕСЛИ ЕСТЬ ПЕРЕХОД ЧЕРЕЗ НОЛЬ,
GOTO$+4;ТО ЗАВЕРШАЕМ ПЕРЕКОДИРОВКУ.
MOVWFTEMP;ИНАЧЕ ПЕРЕПИШЕМ НОВОЕ ЗНАЧЕНИЕ ВО ВРЕМЕННЫЙ.
INCFCOUN,1;УВЕЛИЧИМ СЧЕТЧИК.
GOTO$-5;ПОВТОРИМ ВЫЧИТАНИЕ.
MOVFWCOUN;ЗНАЧЕНИЕ СЧЕТЧИКА (РАВНО ЧИСЛУ ДЕСЯТКОВ) ПЕРЕПИШЕМ В РАБОЧИЙ РЕГИСТР.
RETURN;ВЕРНЕМСЯ.
;================================
; 42. ЗАПИСЬ ЗНАЧЕНИЙ В ПАМЯТЬ.
;================================
SAPIS
CALLPERZAP;ПЕРЕПИШЕМ ТЕКУЩИЕ ЗНАЧЕНИЯ В РЕГИСТРЫ ЗАПИСИ.
BTFSCFLAG,0;ВВОДИМ ЗНАК В РЕГИСТРЫ.
BSFLSBZ1X,7;-
BTFSCFLAG,1;
BSFLSBZ1N,7;-
BTFSCFLAG2,3;
BSFLSBZ2X,7;-
BTFSCFLAG2,4;
BSFLSBZ2N,7;-
MOVLWHOUZ1X;ПЕРВЫЙ АДРЕС ЗАПИСЫВАЕМОГО РЕГИСТРА
MOVWFFSR;В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ.
MOVFWCOUZ;НАЧАЛЬНЫЙ АДРЕС ЗАПИСИ В РАБОЧИЙ РЕГИСТР.
BSFSTATUS,5;БАНК 1.
MOVWFEEADR;ИЗ РАБОЧЕГО В АДРЕС ЗАПИСИ.
BCFINTCON,7;ЗАПРЕТ ПРЕРЫВАНИЙ.
CALLZAPIS;НА ЗАПИСЬ.
INCFEEADR,1;УВЕЛИЧИМ АДРЕС.
INCFFSR,1;ВЫБЕРЕМ СЛЕДУЮЩИЙ РЕГИСТР.
BTFSSFSR,7;ЕСЛИ РЕГИСТР НЕ ПОСЛЕДНИЙ,
GOTO$-4;ПОВТОРИМ ЗАПИСЬ.
BCFSTATUS,5;БАНК 0.
BSFINTCON,7;РАЗРЕШАЕМ ПРЕРЫВАНИЯ.
MOVLW.16;УСТАНОВИМ НАЧАЛЬНЫЙ АДРЕС
ADDWFCOUZ,1;СЛЕДУЮЩЕЙ ЗАПИСИ.
MOVLW.128;ЕСЛИ ЭТО ПОСЛЕДНИЙ АДРЕС,
SUBWFCOUZ,0;
SKPNC;
CLRFCOUZ;ТО НАЧНЕМ С НУЛЯ.
RETURN;ВОЗВРАТ.
ZAPIS
MOVFWINDF;ПЕРЕПИШЕМ ЗАПИСЫВАЕМОЕ ЗНАЧЕНИЕ
MOVWFEEDATA;В РЕГИСТР ДАННЫХ.
BSF EECON1,WREN;РАЗРЕШЕНИЕ ЗАПИСИ.
MOVLW 55H;ОБЯЗАТЕЛЬНАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ
MOVWF EECON2;/
MOVLW 0AAH;/
MOVWF EECON2;/
BSF EECON1,WR;ПРИ ЗАПИСИ ВО ФЛЕШ ПЗУ.
BTFSC EECON1,WR;ПОКА НЕ БУДЕТ ОКОНЧАНИЯ ЗАПИСИ
GOTO $-1;ХОДИМ ПО КРУГУ.
BCF EECON1,WREN;ЗАПРЕТ ЗАПИСИ.
RETURN;ВОЗВРАТ.
;=========================
; 43. ВЫБОРКА ИЗ ПАМЯТИ.
;=========================
CXUTKA
MOVLWHOUZ1X;ПЕРВЫЙ АДРЕС ЗАПИСЫВАЕМОГО РЕГИСТРА
MOVWFFSR;В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ.
MOVFWCOUE;АДРЕС ЗАПИСИ В РАБОЧИЙ РЕГИСТР.
BSFSTATUS,5;БАНК 1.
MOVWFEEADR;ИЗ РАБОЧЕГО В АДРЕС ЗАПИСИ.
BCFINTCON,7;ЗАПРЕТ ПРЕРЫВАНИЙ.
CALLAKT;НА СЧИТЫВАНИЕ.
MOVWFINDF;ПЕРЕПИШЕМ В РЕГИСТР.
INCFEEADR,1;УВЕЛИЧИМ АДРЕС.
INCFFSR,1;ВЫБЕРЕМ СЛЕДУЮЩИЙ РЕГИСТР.
BTFSSFSR,7;ЕСЛИ РЕГИСТР НЕ ПОСЛЕДНИЙ,
GOTO$-5;ПОВТОРИМ СЧИТЫВАНИЕ.
BCFSTATUS,5;БАНК 0.
BSFINTCON,7;РАЗРЕШАЕМ ПРЕРЫВАНИЯ.
MOVLW.251;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
MOVWFSOT1X;
BTFSSLSBZ1X,7;ПО 7 РАЗРЯДУ УСТАНОВИМ ЗНАК.
GOTO$+4;
MOVLW.253;МИНУС.
MOVWFSOT1X;
BCFLSBZ1X,7;СОТРЕМ ЗНАК.
MOVLW.251;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
MOVWFSOT1N;
BTFSSLSBZ1N,7;
GOTO$+4;
MOVLW.253;МИНУС.
MOVWFSOT1N;
BCFLSBZ1N,7;
MOVLW.251;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
MOVWFSOT2X;
BTFSSLSBZ2X,7;
GOTO$+4;
MOVLW.253;МИНУС.
MOVWFSOT2X;
BCFLSBZ2X,7;
MOVLW.251;ПО УМОЛЧАНИЮ ЗНАК ПЛЮС.
MOVWFSOT2N;
BTFSSLSBZ2N,7;
GOTO$+4;
MOVLW.253;МИНУС.
MOVWFSOT2N;
BCFLSBZ2N,7;
BCFFLAG2,5;СБРОС ФЛАГА УСТАНОВКИ МИНУС.
RETURN
AKT
BSFEECON1,RD;ЧТЕНИЕ.
BTFSCEECON1,RD;
GOTO$-1;
MOVLW.255;ЕСЛИ ПАМЯТЬ НЕ ЗАПОЛНЕНА,
SUBWFEEDATA,0;ЗАПИШЕМ -0.
BTFSCSTATUS,Z;
CLRFEEDATA;ОБНУЛИМ, Т.К. 255 НЕКОРРЕКТНО.
MOVFWEEDATA;ПЕРЕПИШЕМ В РАБОЧИЙ РЕГИСТР.
RETURN;ВОЗВРАТ.
;========================================
; 44. РАСПРЕДЕЛИТЕЛЬ.
;========================================
MYLTIK
CALLKHOP;ПРОВЕРИМ КНОПКИ.
BTFSSFLAG2,0;ЕСЛИ ИНДИКАЦИЯ ТЕКУЩАЯ,
GOTOCMOTP;ТО ПРОПУСКАЕМ УСТАНОВКУ.
CALLJEKIND;ПРОИНДИЦИРУЕМ.
BTFSSCEK,0;ЖДЕМ ЧЕТНОЙ СЕКУНДЫ.
GOTO$-1;
CALLINIDS1;ПРОВЕРИМ ДАТЧИК.
CALLKHOP;ПРОВЕРИМ КНОПКИ.
BTFSSFLAG2,0;ЕСЛИ ИНДИКАЦИЯ ТЕКУЩАЯ,
GOTOCMOTP;ТО ПРОПУСКАЕМ УСТАНОВКУ.
CALLJEKIND;ПРОИНДИЦИРУЕМ.
BTFSCCEK,0;ЖДЕМ НЕЧЕТНОЙ СЕКУНДЫ.
GOTO$-1;
CALLINIDS2;ТО ПРОВЕРИМ ВТОРОЙ ДАТЧИК.
GOTOMYLTIK;ВСЕ СНАЧАЛА.
CMOTP
BTFSCFLAG2,0;ЕСЛИ ИНДИКАЦИЯ ТЕКУЩАЯ,
GOTOMYLTIK;ТО ИДЕМ ИЗМЕРЯТЬ ТЕМПЕРАТУРУ.
BTFSCFLAG2,5;ПРИ УСТАНОВКЕ НЕТ ВЫБОРКИ ИЗ ПЗУ.
CALLCXUTKA;ВЫБОРКА ИЗ ПЗУ.
BTFSCFLAG1,2;ЕСЛИ ЗАПРЕТ ИНДИКАЦИИ, ТО ПРОПУСТИМ.
GOTO$+4;
BTFSSFLAG,7;КАЖДЫЕ 0,5 СЕК.
GOTO$-1
CALLJEKIND;ВЫВОДИМ НА ИНДИКАЦИЮ.
BTFSCFLAG,7;КАЖДЫЕ 0,5 СЕК.
GOTO$-1
CALLKHOP;ПРОВЕРИМ КНОПКИ.
GOTOCMOTP;
;========================================
END