Реферат: Автомобильные часы-термометр-вольтметр на базе микроконтроллера

КУРСОВОЙ ПРОЕКТ

Автомобильные часы-термометр-вольтметр на базе микроконтроллера

Содержание

Введение

1. Описание объекта и функциональная спецификация

2. Описание структуры системы

3. Описание ресурсов МК AT89C2051

4. Ассемблирование

5. Разработка алгоритма работы устройства

6. Описание выбора элементной базы и работы принципиальной схемы

Заключение

Список литературы

Приложение. Листинг программы и объектный файл

Введение

Современную микроэлектронику трудно представить без такой важной составляющей, как микроконтроллеры. Микроконтроллеры незаметно завоевали весь мир. Микроконтроллерные технологии очень эффективны. Одно и то же устройство, которое раньше собиралось на традиционных элементах, будучи собрано с применением микроконтроллеров, становится проще, не требует регулировки и меньше по размерам. С применением микроконтроллеров появляются практически безграничные возможности по добавлению новых потребительских функций и возможностей к уже существующим устройствам. Для этого достаточно просто изменить программу.

Однокристальные (однокорпусные) микроконтроллеры представляют собой приборы, конструктивно выполненные в виде БИС и включающие в себя следующие составные части: микропроцессор, память программ и память данных, а также программируемые интерфейсные схемы для связи с внешней средой.

Мировая промышленность выпускает огромную номенклатуру микроконтроллеров. По области применения их можно разделить на два класса: специализированные, предназначенные для применения в какой-либо одной конкретной области (контроллер для телевизора, контроллер для модема, контроллер для компьютерной мышки ) и универсальные, которые не имеют конкретной специализации и могут применяться в самых различных областях микроэлектроники, с помощью которых можно создать как любое из перечисленных выше устройств, так и принципиально новое устройство.

Цель курсового проекта – разработка микропроцессорной системы автомобильные часы-термометр-вольтметр на базе микроконтроллера.

1. Описание объекта и функциональная спецификация

Данное устройство предназначено для использования в автомобиле.

Основой устройства является микроконтроллер AT89C2051 фирмы «Atmel». Для отображения информации используется жидкокристаллический индикатор типа ЖКИ13-8/7-02. Несмотря на то, что в настоящее время доступны ЖКИ с встроенными контроллерами, иногда оказывается целесообразным применение специального ЖКИ. Причин может быть несколько. Распространенные ЖКИ со встроенными контроллерами обладают целым рядом недостатков: отсутствие десятичных точек, плохой угол обзора, недостаточный в некоторых случаях размер символов. В то же время существует доступная и довольно удобная в использовании микросхема драйвера ЖКИ КР1820ВГ1. Она выпускается Минским ПО «Интеграл».

Рассмотренное в этой работе устройство устанавливается в автомобиле для индикации времени, контроля заряда аккумулятора и регистрации температуры. Диапазон контролируемого напряжения можно выбрать любой, однако в программе он установлен в пределах от 12,0 В до 15,0 В, а при отклонении от этих значений напряжения включается зуммер.

Функциональная спецификация

Входы

4 датчика температуры

Кнопка запуска (включение питания)

Панель управления с сенсорным переключателем и ИФ приемником

Выходы

Жидкокристаллический индикатор

Звуковой динамик

Функции

индикация текущего времени

будильник

таймер

индикация температуры в четырех точках

звуковая сигнализация при повышении температуры

индикация напряжения в бортовой сети автомобиля

звуковая сигнализация при падении напряжения бортовой сети

управление режимами работы устройства с помощью ИК-пульта

2.Описание структуры системы

После определения входов и выходов устройства разработана структурная схема устройства. Структурная схема автомобильных вольтметра-термометра-часов приведена на рис. 1.

/>/>

/>

/>/>

/>/>

/>/>/>

/>/>

/>/>/>

/>/>/>/>Громкоговоритель

/>/>/>

/>

/>/>

Рис. 1. Структурная схема автомобильных часов-термометра-вольтметра

3. Описание ресурсов МК AT89C2051

AT89C2051 разработан по технологии КМОП. Микроконтроллер оснащенный Flash программируемым и стираемым ПЗУ, а также совместим по системе команд и по выводам со стандартными приборами семейства MCS-51. Объем Flash ПЗУ — 2 Кбайта, ОЗУ — 128 байтов. Имеет 15 линий ввода/вывода, один 16-разрядный таймера/счетчика событий, полнодуплексный порт (UART) пять векторных двухуровневых прерываний, встроенный прецизионный аналоговый компаратор, встроенные генератор и схему формирования тактовой последовательности. Напряжение программирования Flash памяти — 12 В и ее содержимие может быть защищено от несанкционированных записи/считывания. Имеется возможность очистки Flash памяти за одну операцию и возможность считывания встроенного кода идентификации. Ток потребления в активном режиме на частоте 12 МГц не превышает 15 мА при 6 В и 5,5 мА при напряжении питания 3 В. В пассивном режиме (ЦПУ остановленно, но система прерываний, ОЗУ, таймер/счетчик событий и последовательный порт остаются активными) потребление не превышает 5 мА и 1мА. В стоповом режиме ток потребления не превышает 100 мкА и 20 мкА при напряжении питания 6 В и 3 В, соответственно. Микроконтроллер AT89C2051 ориентирован на использование в качестве встроенного управляющего контороллера.

Для питания устройства используется интегральный стабилизатор U5 типа 7805. Потребляемый устройством ток очень небольшой, поэтому радиатор для этой микросхемы не нужен.

Поскольку микросхемы контроллера ЖКИ требуют небольшого количества сигналов для связи с микроконтроллером, индикатор можно выполнить конструктивно в отдельном корпусе минимального размера и расположить его в удобном для обозрения месте. Провода датчиков температуры могут иметь длину несколько метров. При этом обязательно должен присутствовать земляной провод. Использовать в качестве земли кузов автомобиля нежелательно. Удобно для термометров использовать аудио кабель, который имеет два провода в общем экране, изолированном снаружи.

AT89C2051 — 8-разрядный микроконтроллер с FlashПЗУ

/>

Рис.2.Структурная схема AT89C2051

Микроконтроллер AT89C51 построен по процессорной архитектуре MCS-51, т.е. он умеет выполнять ассемблерные команды описанные этим стандартом. Стандарт был разработан фирмой INTEL и в дальнейшем стал основой для создания современных INTEL процессоров, но проблема создания маленьких устройств (микроконтроллерных систем) осталась актуальной и по сей день. В результате первые миниатюрные процессоры эксплуатируется до сих пор (например в телефонах АОН).

Цифры 31 или 51 в названии процессора (контроллера) указывают на принадлежность к системе команд MCS-51 (31 в отличии от 51, не имеет возможности использовать порт P0 и P2 как порты — на 31 кристалле это только адресные линии и линии данных внешних устройств [ПЗУ, ОЗУ, Регистров...] = 51 же кристалл имеет возможность незадействованные выводы адресов использовать как выводы портов ввода — вывода). Цифра 80 в начале указывает на то, что исполняемая программа может быть размещена только во внешней ПЗУ. Цифра 83,87 или 89 указывает, что программа может быть как во внешней ПЗУ, так и в ПЗУ кристалла (это более поздние модели 1990-е годы, уже научились ПЗУ делать на одной подложке вместе с самим процессором), 83 — масочная ПЗУ (программируется на заводе изготовителе — например контроллер клавиатуры AT-XT), 87 — однократно программируемая ПЗУ на кристалле процессора в корпусе из пластика или многократно (до 100 раз ) перепрограммируемая ПЗУ на кристалле в керамическом корпусе и окошком для УФ стирания. 89 — многократно (до 10000 раз ) перепрограммируемая ПЗУ на кристалле, электрически стираемая. AT- название фирмы изготовителя ATMEL www.atmel.com/или www.atmel.ru/(русскоязычный сайт ATMEL). Кроме того это может быть DS — Dallas, N- Intel, P-Philips… Так что данная микросхема — это микропроцессор (правильнее сказать микроконтроллер) со встроенной ПЗУ, которую (ПЗУ внутри процессора) и надо запрограммировать, чтобы микросхема начала выполнять требуемые функции. Данный микроконтроллер программируется стандартным программатором, поддерживающим программирование этого типа микроконтроллеров (например программатор UNIPRO).

--PAGE_BREAK--

/>

Рис.3.Общий вид выводов AT89C2051

4.Ассемблирование

Для ассемблирования используется макpоассемблеp MPASM, он содеpжит все необходимые нам возможности. MPASMвходит в пакет программ Microchip MPLAB фирмы Microchip Technology.

В pезультате pаботы ассемблеpа создаются файлы со следующими pасшиpениями: * HEX — объектный файл * LST — файл листинга * ERR — файл ошибок и пpедупpеждений * COD Объектный файл создается в 16-pичном фоpмате и содеpжит код, котоpый должен быть записан в микpосхему. Файл листинга содеpжит полный листинг пpогpаммы вместе с загpузочным кодом. В файл ошибок и пpедупpеждений записываются все ошибки и пpедупpеждения, возникающие в пpоцессе ассемблиpования. Они также пpисутствуют и в файле листинга. После обpаботки нашей пpогpаммы ассемблеp должен был выдать сообщение «Assembly Successful», означающее, что ошибок обнаpужено не было. Файл ошибок не должен был создаться.

Листинг программы и объектный файл приведен в Приложении.

5. Разработка алгоритма работы устройства

Алгоритм работы программы показан на рис. 4. После запуска и инициализации микроконтроллера программа переходит к распределителю, в котором каждую секунду последовательно измеряется напряжение, проверяются кнопки, и выполняется вывод на индикацию. Прерывание от этой последовательности происходит каждую секунду для подсчета времени в часах и таймере, если он включен.

После установки флага «Одна секунда» проверяется бортовое напряжение. Если присутствует его отклонение от установленного, то включается звуковой сигнал. Если отклонения нет, то измеренные значения перекодируются для индикации в двоично-десятичный код.

Далее программа переходит к проверке кнопок. Поскольку кнопки — многофункциональные, то и их проверка несколько усложнена. Вначале проверяется флаг индикации часов. Если индикация часов отсутствует, то кнопка установки курсора «Разряд» не проверяется, а сразу проверяется кнопка «Режим». Если индикация часов включена и нажата кнопка «Разряд», то к регистру курсора прибавляется единица.

Если кнопка «Режим» нажата, то на единицу увеличивается регистр режима. По значению регистра режима из таблицы выбирается режим индикации (рис. 5).

При индикации напряжения ранее перекодируемые значения напряжения переписываются в регистры индикации.

При индикации часов проверяется, был ли ранее введен курсор в поле индикатора. Если значение регистра курсора — ненулевое, то выполняется установка часов. Если при этом нажата кнопка «Установка», то к выбранному разряду прибавляется единица, а регистры индикации заполняются новыми значениями. Если установка отсутствует, то регистры индикации заполняются значениями текущего времени.

/>

Рис. 4. Алгоритм работы автомобильных часов (начало)

/>

Рис. 5. Алгоритм работы автомобильных часов (продолжение)

Однако заполненные регистры индикации еще не готовы к выводу на индикацию — в них необходимо записать значение курсора. Если значение курсора — ненулевое (т.е. он находится в поле индикатора), то он вводится в младший разряд регистра индикации соответствующего знакоместа.

Если курсор в поле индикатора отсутствует, то обнуляется счетчик цикла записи, и первым импульсом выводится значение запятой для N-го разряда. В принципе, запятая в данном устройстве необходима только одна: для выделения десятых долей напряжения, — однако подпрограмма вывода на индикацию универсальна, и потому нет смысла ее изменять. Значения запятых заранее записываются в позиционном коде в регистр запятой (т.е. если необходимо высветить запятую в пятом разряде индикатора, то записывают единицу в пятый разряд регистра). При этом необходимо помнить, что первыми в импульсной последовательности идут значения крайнего справа разряда.

После вывода запятой последовательно выводится значение N-ro регистра, начиная с младшего разряда. Затем прибавляется единица к счетчику циклов и, если его значение не равно девяти, цикл вывода данных на индикатор повторяется со следующим регистром. После вывода значения последнего регистра программа возвращается к ожиданию установки флага «Одна секунда» во время прерывания.

Прерывание организовано обычным образом: по переполнению таймера TMR0. При частоте кварцевого резонатора 32 768 Гц коэффициент деления предделителя составляет 32, что вместе с коэффициентом деления таймера, равным 256, и циклом, равным 4, дает одну секунду (4x32x256 = 32 768).

6. Описание выбора элементной базы и работы принципиальной схемы

Микросхема КР1820ВГ1 [1] используется для управления 36-сегментным ЖКИ в режиме 3-уровневого мультиплексирования. Микросхема изготавливается по КМОП-технологии и выпускается в 20-выводном пластмассовом DIP-корпусе. Микросхема содержит встроенный тактовый генератор, резистивный делитель напряжения и делители частоты, с помощью которых формируются сигналы управления строками (общими электродами) и столбцами (сегментными электродами) ЖКИ в режиме 3-уровневого мультиплексирования. Одна микросхема имеет три выхода управления строками и 12 выходов управления столбцами. Предусмотрена возможность каскадирования схем, что позволяет использавать их для управления мультиплексным ЖКИ с числом сегментов более 36. Микросхема не требует никаких навесных компонентов и работает в диапазоне напряжения питания от 3 до 6 вольт. Назначение выводов микросхемы КР1820ВГ1 показано в таблице 1.

Таблица 1. Назначение выводов микросхемы КР1820ВГ1.

Вывод

Обозначение

Тип

Назначение

1...3

COB1, COC3, COB3

Выход

Управление столбцами В1, С3, В3

4

CS

Вход

Выбор кристалла

5

Ucc

-

Напряжение источника питания

6

GND

-

Общий

7

D

Вход

Данные

8...13

COA2, COB4, COB2, COA1, COC2, COC4

Выход

Управление столбцами A2, B4, B2, A1, C2, C4

14

C

Вход

Тактовый сигнал С

15

COA/G

Выход

Управление сторокой А (вход генератора G)

16

COC/G

Выход

Управление сторокой С (выход генератора G)

17

COB

Выход

Управление строкой В

18...20

COC1, COA3, COA4

Выход

Управление столбцами B1, A3, A4

Микросхема КР1820ВГ1 имеет четыре режима работы: одиночный, старший, младший и тестовый. В одиночном режиме одна микросхема управляет 36-сегментным ЖКИ, обеспечивая полную синхронизацию его работы. Старший и младний режимы предназначены для организации управления ЖКИ с числом сегментов более 36, тестовый режим – для контроля качества микросхем в процессе изготовления. Данные вводятся в микросхему в последовательном коде по входу D с синхронизацией записи фронтом тактовых импульсов по входу C (рис. 6).

/>

Рис. 6. Загрузка микросхемы КР1820ВГ1 по последовательной шине

Код записываемых данных определяется конкретной схемой подключения шин управления строками и столбцами к сегментам ЖКИ, а также конфигурацией ЖКИ.

/>

Рис.7. Конфигурация сегментов ЖКИ.

На рис. 7 показан пример конфигурации ЖКИ, а в таблице 2 показан порядок следования битов в кодовой посылке для этого варианта подключения такого ЖКИ.

Таблица 2. Порядок следования битов в кодовой посылке

Бит

Вывод

Сегмент ЖКИ

Бит

Вывод

Сегмент ЖКИ

D0

    продолжение
--PAGE_BREAK----PAGE_BREAK----PAGE_BREAK--

0

01H

20H

16

BACKSPACE

12H

22H

17

1

02H

28H

18

2

03H

29H

19

3

04H

2AH

20

ENTER

0BH

2BH

Вот краткое описание команд управления:

CLOCK – вход в режим установки текущего времени

ALARM – вход в режим установки времени будильника

ALARM DISABLE – выключение будильника

TIMER – включение индикации значения таймера

TIMER CLEAR – очистка таймера

LIST – включение циклической смены параметров

LOCK – запрещение смены параметров

0..9 – кнопки для ввода числовых значений параметров

ENTER – ввод отредактированного параметра

ESCAPE – отказ от редактирования параметра

BACKSPACE – возврат на один символ при редактировании

В качестве ИК приемника использована интегральная микросхема SFH-506 фирмы Siemens. Эта микросхема весьма чувствительна к помехам по цепи питания, поэтому применен RC фильтр R15 C7.

В случае срабатывания будильника, превышения температурой установленного порога или понижения напряжения в бортовой сети формируется звуковой сигнал. Для его формирования использована малогабаритная динамическая головка HA1, которая подключена через транзисторный ключ VT1. Звуковые сигналы также формируются при нажатиях на кнопки управления.

/>

Рис. 9. Принципиальная схема в AccelEDA.

Заключение

В данном курсовом проекте разработано устройство — электронные часы-вольтметр-термометр. Разработана схема электрическая принципиальная этого устройства и программа для микроконтроллера. В результате ассеблирования получена прошивка программы для памяти микроконтроллера. Применение микроконтроллера позволило упростить принципиальную схему и расширить функциональные возможности микроконтроллера, так как для изменения функций устройства достаточно внести изменения в программу микроконтроллера.

Список литературы

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с.

7.Техническая документация на микроконтроллеры AT89C2051 фирмы «Atmel». ООО «Микро -Чип», Москва, 2002.-184 с.

Приложение А

Листинг программы и объектный файл

; ЧАСЫ-ТЕРМОМЕТР-ВОЛЬТМЕТР ДЛЯ АВТОМОБИЛЯ.

РАЗРАБОТАЛ ДЕРКАЧ

; ПРОГРАММА = ABTO.ASM

; ВЕРСИЯ: 20-01-07.

; АССЕМБЛЕР И ОТЛАДЧИК: MPLAB IDE, ВЕРСИЯ: 5.70.40.

LISTP=16F676

#INCLUDE P16F676.INC

__CONFIG 31D0H

;==============================================

; ИСПОЛЬЗУЕТСЯ КВАРЦ ЧАСТОТОЙ 32768 ГЦ.

; КОЭФФИЦИЕНТ ДЕЛЕНИЯ ПРЕДДЕЛИТЕЛЯ РАВЕН 32, ЧТО ВМЕСТЕ

; С TMR0 (256) И ЦИКЛОМ, РАВНЫМ 4 ТАКТАМ

; ДАЕТ НА ВЫХОДЕ 1 СЕКУНДУ (4х32х256=32768).

;==============================================

; RA1 — РЕЖИМ — УСТАНОВКА, RA2 — РАЗРЯД — ПУСК,

; RA3 — ВЫХОД ИЗЛУЧАТЕЛЯ,

; RC5 — LOAD, RC3 — DIN,

; RC4 — DCLK

;===========================================

CBLOCK H'20'

;===========================================

; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ВРЕМЕНИ.

;===========================================

HOU; ЧАСЫ ДВОИЧНЫЕ.

CL; ЕДИНИЦЫ СЕКУНД ЧАСОВ.

CH; ДЕСЯТКИ СЕКУНД.

ML; ЕДИНИЦЫ МИНУТ.

MH; ДЕСЯТКИ МИНУТ.

HL; ЕДИНИЦЫ ЧАСОВ.

HH; ДЕСЯТКИ ЧАСОВ.

TCL; ДЛЯ ТАЙМЕРА.

TCH;

TML;

TMH;

THL;

THH;

;===============================================

; РЕГИСТРЫ ДЛЯ ОРГАНИЗАЦИИ ИНДИКАЦИИ.

;===============================================

ZPT; РЕГИСТР ЗАПЯТОЙ.

TZPT; ЗАПЯТАЯ ДЛЯ ВЫВОДА НА ИНДИКАЦИЮ.

COUZ; СЧЕТЧИК ВЫВОДА ЗАПЯТЫХ.

COU; СЧЕТЧИК ВЫВОДА БИТ.

KYPC; ВЫБОР РАЗРЯДА УСТАНОВКИ.

KYPCI; ИНДИКАЦИИ.

PEID; РЕЖИМА ИНДИКАЦИИ.

TEMP; ВРЕМЕННЫЙ.

EDI; ДЕСЯТЫЕ НАПРЯЖЕНИЯ.

DEI; ЕДИНИЦЫ ВОЛЬТ.

COI; ДЕСЯТКИ ВОЛЬТ.

;================================================

; ВРЕМЕННЫЕ.

;================================================

WTEMP; БАЙТ СОХРАНЕНИЯ РЕГИСТРА W ПРИ ПРЕРЫВАНИИ.

STEMP; БАЙТ СОХРАНЕНИЯ РЕГИСТРА STATUS ПРИ ПРЕРЫВАНИИ.

FTEMP; ВРЕМЕННЫЙ ДЛЯ FSR.

TEKH;

EDA;

DEA;

YCTL;

YCTLI;

    продолжение
--PAGE_BREAK--

;===========================================

; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ ФЛАГОВ.

;===========================================

FLAG

;

;0-> ВКЛЮЧЕНИЕ СИГНАЛА.

;1-> ТЕКУЩЕЕ ВРЕМЯ.

;2-> ВКЛЮЧЕН РЕЖИМ ТАЙМЕРА.

;3-> ИНДИКАЦИЯ НАПРЯЖЕНИЯ.

;4-> НЕТ КУРСОРА.

;5-> ПУСК-СТОП.

;6-> ПРОЧЕРК В ЧАСАХ.

;7-> УСТАНОВКИ.

;=============================================

FLAG1

;

;1-> 1 СЕК ЦИКЛА.

;2-> ПЕРЕДАНА ЗАПЯТАЯ.

;4-> ЗУММЕР ВКЛЮЧЕН.

;5-> СТОРОЖОК НАПОМИНИНИЯ АВАРИИ ЧЕРЕЗ 1 ЧАС.

;===========================================

ENDC

;===========================================

; ОПРЕДЕЛЕНИЕ РЕГИСТРОВ ИНДИКАЦИИ.

;===========================================

R1EQU50H; МЛАДШИЙ РАЗРЯД.

R2EQU51H;

R3EQU52H;

R4EQU53H;

R5EQU54H;

R6EQU55H;

R7EQU56H;

R8EQU57H;СТАРШИЙРАЗРЯД.

TEKLEQU58H;

;===========================================

; ОПРЕДЕЛЕНИЕ БИТ ПОРТОВ ВВОДА/ВЫВОДА.

;===========================================

YCEQU1; РЕЖИМ/УСТАНОВКА.

KYEQU2; ПУСК/КУРСОР.

LOADEQU5; ЗАГРУЗКА.

DINEQU3; ДАННЫЕ.

DCLKEQU4; СИНХРОИМПУЛЬСЫ.

;===========================================

; 1. ПУСК.

;===========================================

ORG0

GOTOINIT

ORG4

GOTOPRER

;===========================================

; 2. ИНИЦИАЛИЗАЦИЯ.

;===========================================

INIT

BSFSTATUS,5; ПЕРЕХОДИМ В БАНК 1.

MOVLW0FFH;

MOVWFADCON1^80H; ТАКТ АЦП ОТ ВНУТРЕННЕГО ГЕНЕРАТОРА 500 кГц.

MOVLWB'00000100'; К=32.

MOVWFOPTION_REG^80H; РЕЗИСТОРЫ ВКЛЮЧЕНЫ.

MOVLWB'10100000'; РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ ОТ TMR0.

MOVWFINTCON ;

CLRFPIE1^80H; ЗАПРЕЩЕНЫ ВСЕ ПЕРИФЕРИЙНЫЕ ПРЕРЫВАНИЯ.

MOVLWB'00001111'; ВСЕ ВЫХОДЫ. 0 — ВХОД АЦП.

MOVWFTRISA^80H ;

CLRFTRISC^80H; ВСЕ ВЫХОДЫ.

CLRFVRCON^80H; ИОН ОТКЛЮЧЕН.

CLRFPCON^80H; ПРЕРЫВАНИЯ ПО ПИТАНИЮ ЗАПРЕЩЕНЫ.

MOVLWB'00000110' ;

MOVWFWPUA^80H; ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ ВКЛЮЧЕНЫ.

CLRFIOCA^80H; ПРЕРЫВАНИЯ ЗАПРЕЩЕНЫ.

MOVLW.1

MOVWFANSEL^80H; ВЫБРАН АНАЛОГОВЫЙ ВХОД RA0/AN0.

BCFSTATUS,5; ПЕРЕХОДИМ В БАНК 0.

CLRFPORTC; ВЫХОД И СВЕТОДИОД ВЫКЛЮЧЕНЫ.

CLRFT1CON; ТАЙМЕР 1 ОТКЛЮЧЕН.

MOVLW.7

MOVWFCMCON; КОМПАРАТОР ВЫКЛЮЧЕН.

CLRFFLAG; ВСЕ ОБНУЛЯЕМ И УСТАНАВЛИВАЕМ.

CLRFFLAG1

CLRFEDI

CLRFDEI

CLRFCOI

CLRFCL

CLRFCH

CLRFML

CLRFMH

CLRFHL

CLRFHH

CLRFTCL

CLRFTCH

CLRFTML

CLRFTMH

CLRFTHL

CLRFTHH

CLRFPEID

CLRFZPT

CLRFCOUZ

CLRFCOU

CLRFHOU

MOVLW96H

MOVWFYCTL; УСТАНОВКА МАКСИМУМА = 15,0 B.

MOVLW78H

MOVWFYCTLI; УСТАНОВКА МИНИМУМА = 12,0 B.

CLRFKYPC

BSFFLAG,4

GOTOPAC

;==========================================

; 3. ТАБЛИЦА СЕГМЕНТОВ.

;==========================================

SEG

;D E G F A B C K

ADDWFPCL,1;

RETLWB'11011110';0

RETLWB'00000110';1

RETLWB'11101100';2

RETLWB'10101110';3

RETLWB'00110110';4

RETLWB'10111010';5

RETLWB'11111010';6

RETLWB'00001110';7

RETLWB'11111110';8

RETLWB'10111110';9

RETLWB'00000000';10-> ПУСТО.

    продолжение
--PAGE_BREAK--

RETLWB'00100000';11-> ПРОЧЕРК.

RETLWB'10000000';12-> ПРОЧЕРК.

;=================================================

; 4. ТАБЛИЦА ПЕРЕКОДИРОВКИ КУРСОРА.

;=================================================

KYPCY

MOVFWKYPC;

ADDWFPCL,1;

RETURN; НЕТ КУРСОРА.

RETLWB'00000100';3

RETLWB'00001000';4

RETLWB'00010000';5

RETLWB'00100000';6

RETLWB'01000000';7

;===================================================

; 5. ВЫБОР РЕЖИМА ИНДИКАЦИИ.

;===================================================

VUBOR

MOVFWPEID; ИЗМЕНЯЕМ РЕЖИМ ИНДИКАЦИИ.

ADDWFPCL,1;

GOTOINDH; ИНДИКАЦИЯ ЧАСОВ.

GOTOINDT; ТАЙМЕРА.

GOTOINDU; НАПРЯЖЕНИЯ.

;======================================================

; 6. ВЫБОР РАЗРЯДА УСТАНОВКИ.

;======================================================

YCT

BTFSCPORTA,YC; ЕСЛИ КНОПКА «РЕЖИМ» НАЖАТА,

RETURN

MOVFWKYPC; ТО ПО КУРСОРУ

ADDWFPCL,1; ВЫБИРАЕМ РАЗРЯД УСТАНОВКИ.

RETURN; НЕТ КУРСОРА.

GOTOYC0; МИНУТЫ.

GOTOYC1; ДЕСЯТКИ МИНУТ.

GOTOYCE; ОБНУЛЕНИЕ.

GOTOYC2; ЧАСЫ.

GOTOYC3; ДЕСЯТКИ ЧАСОВ.

;=====================================================

; 7. ТАБЛИЦЫ ПЕРЕВОДА ДЕСЯТКОВ В ДВОИЧНОЕ ЧИСЛО.

;=====================================================

DEBIN

ADDWFPCL,1;

RETLW.0

RETLW.10

RETLW.20

RETLW.30

RETLW.40

RETLW.50

RETLW.60

RETLW.70

RETLW.80

RETLW.90

;======================================================

; 8. ПРОВЕРКА НАЖАТЫХ КНОПОК УСТАНОВКИ.

;======================================================

KHOP

BTFSSFLAG,1; ЕСЛИ НЕТ РЕЖИМА ЧАСОВ,

GOTO$+5; ТО КУРСОР НЕ МЕНЯЕТСЯ.

BTFSSPORTA,KY; ПРИ НАЖАТОЙ КНОПКЕ

CALLKYPCOP; ИДЕМ НА УСТАНОВКУ КУРСОРА.

BTFSCFLAG,7; ЕСЛИ ИДЕТ УСТАНОВКА,

GOTOVUBOR; ТО РЕЖИМ НЕ МЕНЯЕТСЯ.

BTFSCPORTA,YC; ЕСЛИ КНОПКА «РЕЖИМ» НАЖАТА,

GOTOVUBOR; ИЛИ ИДЕМ НА ВЫБОР РЕЖИМА ИНДИКАЦИИ.

INCFPEID,1; ИЗМЕНЕНИЕ РЕЖИМА ИНДИКАЦИИ.

MOVLW.3;3 РЕЖИМОВ ИНДИКАЦИИ.

SUBWFPEID,0; ЕСЛИ БОЛЬШЕ,

BTFSSSTATUS,2; ТО ПОЙДЕМ НА СБРОС.

GOTOVUBOR; НА ЗАПИСЬ В РЕГИСТРЫ ИНДИКАЦИИ.

CLRFPEID; СБРОС РЕЖИМА.

GOTOVUBOR; НА ВЫБОР РЕЖИМА ИНДИКАЦИИ.

RETURN

;=================================================

; 9. УСТАНОВКА КУРСОРА (ВЫБОР РАЗРЯДА УСТАНОВКИ).

;=================================================

KYPCOP

BSFFLAG,7; УСТАНОВКА.

BCFFLAG,4; СБРОС ФЛАГА НЕТ КУРСОРА.

INCFKYPC,1; ПРИБАВИМ ЕДИНИЦУ В КУРСОР.

MOVLW.6; НЕ БОЛЕЕ 5.

SUBWFKYPC,0;

SKPC; ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 6,

RETURN;

CLRFKYPC; ОБНУЛИМ.

BSFFLAG,4; НЕТ КУРСОРА В ПОЛЕ.

BCFFLAG,7; НЕТ УСТАНОВКИ.

RETURN;

;=========================================

; 10. ВВОД КУРСОРА В МЛ. РАЗРЯД РЕГИСТРОВ.

;=========================================

KYPVO

BTFSCFLAG,4; ЕСЛИ НЕТ КУРСОРА,

RETURN; ТО ВЕРНЕМСЯ.

CALLKYPCY; УСТАНОВИМ РЕЖИМЫ.

MOVWFKYPCI; В КУРСОР ИНДИКАЦИИ.

RRFKYPCI,1; ЗАПОЛНИМ БИТ «С».

ADDCFR1,1; ПЕРЕНЕСЕМ В РЕГИСТР ИНДИКАЦИИ.

RRFKYPCI,1; ЗАПОЛНИМ БИТ «С».

ADDCFR2,1; ПЕРЕНЕСЕМ В РЕГИСТР ИНДИКАЦИИ.

RRFKYPCI,1; ОСТАЛЬНЫЕ РЕГИСТРЫ

ADDCFR3,1; ЗАПОЛНЯЕМ АНАЛОГИЧНО.

RRFKYPCI,1;

ADDCFR4,1;

RRFKYPCI,1;

ADDCFR5,1;

RRFKYPCI,1;

ADDCFR6,1;

RRFKYPCI,1;

ADDCFR7,1;

RRFKYPCI,1;

ADDCFR8,1;

RETURN;

;=============================================

; 11. ВЫВОД НА ИНДИКАЦИЮ.

;=============================================

IND

CALLKYPVO; ВВЕДЕМ КУРСОРЫ В РЕГИСТРЫ ИНДИКАЦИИ.

MOVFWZPT; ЗНАЧЕНИЯ ЗАПЯТЫХ ПЕРЕПИШЕМ

MOVWFTZPT; ВО ВРЕМЕННЫЙ РЕГИСТР.

BSFFLAG1,2; ЗАПЯТАЯ ПЕРЕДАНА.

BCFPORTC,DIN; ДАННЫЕ РАВНЫ НУЛЮ.

    продолжение
--PAGE_BREAK--

BCFPORTC,LOAD; НАЧАЛО ПЕРЕДАЧИ (LOAD=0).

RRFTZPT,1; ВЫТОЛКНЕМ ОЧЕРЕДНУЮ ЗАПЯТУЮ.

CALLVUV0;

BCFFLAG1,2; ЗАПЯТАЯ ПЕРЕДАНА.

MOVLWR1; ЗАПИШЕМ АДРЕС ПЕРВОГО РЕГИСТРА ИНДИКАЦИИ.

MOVWFFSR;

MOVFWINDF; ЗНАЧЕНИЕ ПЕРВОГО РЕГИСТРА

MOVWFTEMP; ПЕРЕПИШЕМ ВО ВРЕМЕННЫЙ.

BCFPORTC,LOAD; НАЧАЛО ПЕРЕДАЧИ (LOAD=0).

CALLVUVOD; НА ВЫВОД.

POVT

BSFFLAG1,2; ЗАПЯТАЯ ПЕРЕДАНА.

RRFTZPT,1; ВЫТОЛКНЕМ ОЧЕРЕДНУЮ ЗАПЯТУЮ.

CALLVUV0;

BCFFLAG1,2; ЗАПЯТАЯ ПЕРЕДАНА.

INCFFSR,1; УВЕЛИЧИМ АДРЕС РЕГИСТРА ИНДИКАЦИИ.

MOVFWINDF; ПЕРЕПИШЕМ ЕГО ЗНАЧЕНИЕ

MOVWFTEMP; ВО ВРЕМЕННЫЙ.

CALLVUVOD; НА ВЫВОД.

INCFCOUZ,1; ПОДСЧИТАЕМ ЧИСЛО

MOVLW.7; ПЕРЕДАВАЕМЫХ

SUBWFCOUZ,0; ЗАПЯТЫХ.

BTFSCSTATUS,2;

CLRFCOUZ; ОБНУЛИМ СЧЕТЧИК.

BTFSSSTATUS,2;

GOTOPOVT; ПОВТОРИМ ВЫВОД.

BSFPORTC,LOAD; КОНЕЦ ПЕРЕДАЧИ.

RETURN;

CUNX

BSFPORTC,DCLK; СИНХРОТМПУЛЬС = 1.

CALLPAUS; ПАУЗА.

BCFPORTC,DCLK; СИНХРОИМПУЛЬС = 0.

RETURN; ВОЗВРАТ.

PAUS

MOVLW .5; МОЖНО ПОДБИРАТЬ ЗНАЧЕНИЕ ПАУЗЫ.

ADDLW -1; ПАУЗА = ЧИСЛО Х 4 МКС.

BTFSS STATUS,2;

GOTO $-2;ПОВТОРИМ.

RETURN;ВЕРНЕМСЯ.

VUVOD

RRFTEMP,1;СДВИНЕМВПРАВО.

VUV0

BTFSSSTATUS,0;ПОНУЛЕВОМУРАЗРЯДУ

BCFPORTC,DIN; УСТАНАВЛИВАЕМ ДАННЫЕ

BTFSCSTATUS,0; В 0 ИЛИ 1.

BSFPORTC,DIN;

CALLCUNX; СИНХРОНИЗИРУЕМ ДАННЫЕ.

BTFSCFLAG1,2; ЕСЛИ ЗАПЯТАЯ ПЕРЕДАНА,

RETURN; ТО ВЕРНЕМСЯ.

INCFCOU,1; ПОДСЧИТАЕМ ЧИСЛО БИТ.

MOVLW.8;

SUBWFCOU,0;

BTFSSSTATUS,2; ЕСЛИ НЕ ВСЕ БИТЫ ПЕРЕДАНЫ,

GOTOVUVOD; ПОВТОРИМ ВЫВОД.

CLRFCOU; ОБНУЛИМ СЧЕТЧИК.

RETURN;

;======================================================

; 12. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ.

;======================================================

PRER

MOVWFWTEMP; СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W,

MOVFWSTATUS;STATUS,

MOVWFSTEMP;

MOVFWFSR;FSR.

MOVWFFTEMP;

BSFFLAG1,1;1 СЕКЦИКЛА.

CALLS1;ПОДСЧИТАЕМВРЕМЯ.

BTFSCFLAG,2;

CALLTAIM;

REPER; ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ.

MOVFWSTEMP; ВОССТАНОВЛЕНИЕ РЕГИСТРОВ:

MOVWFSTATUS;STATUS,

MOVFWFTEMP;

MOVWFFSR;FSR,

MOVFWWTEMP;W.

BCFINTCON,2; СБРАСЫВАЕМ ФЛАГ ПРЕРЫВАНИЯ ОТ TMR0.

RETFIE; ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ.

;=============================================

; 13. ПОДСЧЕТ ВРЕМЕНИ.

;=============================================

S1

BTFSCFLAG1,5;

GOTO$+8;

BTFSSFLAG1,4;

GOTO$+6;

BTFSCPORTC,0; СМЕНА ВКЛЮЧЕНИЯ ЗУММЕРА.

GOTO$+3;

BSFPORTC,0; ВКЛЮЧИМ СИГНАЛ.

GOTO$+2;

BCFPORTC,0;

MOVLW.9; ЕСЛИ УЖЕ 9 СЕКУНД,

SUBWFCL,0;

BCSH; ИДЕМ НА СРАВНЕНИЕ ДЕСЯТКОВ СЕКУНД.

INCFCL,1; ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ.

RETURN

SH

CLRFCL; ОБНУЛИМ СЕКУНДЫ.

MOVFWCH; ЕСЛИ ДЕСЯТКИ СЕКУНД

ADDLW-5H; РАВНЫ 5,

BZMIL; ИДЕМ СРАВНИВАТЬ МИНУТЫ.

INCFCH,1; ИНАЧЕ УВЕЛИЧИМ ДЕСЯТКИ СЕКУНД.

RETURN

MIL

CLRFCH; ОБНУЛИМ ДЕСЯТКИ СЕКУНД.

MOVFWML; ЕСЛИ ЕДИНИЦЫ МИНУТ

ADDLW-9H; РАВНЫ 9,

BZMIH; ИДЕМ СРАВНИВАТЬ ДЕСЯТКИ.

INCFML,1; ИНАЧЕ УВЕЛИЧИМ МИНУТЫ.

RETURN

MIH

BSFFLAG1,4; ПРОШЛО 10 МИНУТ КУРСОР ВЫКЛЮЧАЕТСЯ.

BCFFLAG,7; НЕТ УСТАНОВКИ.

CLRFKYPC; НЕТ КУРСОРА.

CLRFML; ОБНУЛИМ ЕДИНИЦЫ МИНУТ.

MOVFWMH; ЕСЛИ ДЕСЯТКИ МИНУТ

ADDLW-5H; РАВНЫ 5,

BZHOL; ИДЕМ СРАВНИВАТЬ ЧАСЫ.

INCFMH,1; ИЛИ УВЕЛИЧИМ ДЕСЯТКИ МИНУТ.

RETURN

HOL

    продолжение
--PAGE_BREAK--

BCFFLAG1,5; НАПОМИНАНИЕ ОБ АВАРИИ НАПРЯЖЕНИЯ.

CLRFMH; ОБНУЛИМ ДЕСЯТКИ МИНУТ.

MOVFWHH; ЕСЛИ ДЕСЯТКИ ЧАСОВ

ADDLW-2H; РАВНЫ 2,

BZHL4; ПРОВЕРИМ ЕДИНИЦЫ ЧАСОВ.

MOVFWHL; ЕСЛИ ЕДИНИЦЫ ЧАСОВ РАВНЫ 9,

ADDLW-9H;

BZ$+3; УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ.

INCFHL,1; ИЛИ УВЕЛИЧИМ ЕДИНИЦЫ ЧАСОВ.

RETURN

CLRFHL;

INCFHH,1;

RETURN

HL4

MOVFWHL; ЕСЛИ ЕДИНИЦЫ ЧАСОВ

ADDLW-3H; РАВНЫ 3,

BZHOH; ИДЕМ ОБНУЛЯТЬ.

INCFHL,1; ИЛИ ПРИБАВИМ ЕДИНИЦУ.

RETURN

HOH

CLRFHL;

CLRF HH; ОБНУЛИМ ДЕСЯТКИ ЧАСОВ.

RETURN;

;=============================================

; 14. ТАЙМЕР.

;=============================================

TAIM

BSFFLAG,5; СЛЕДУЮЩАЯ ОСТАНОВКА ТАЙМЕРА.

MOVLW.9; ЕСЛИ УЖЕ 9 СЕКУНД,

SUBWFTCL,0;

BC$+3; ИДЕМ НА СРАВНЕНИЕ ДЕСЯТКОВ СЕКУНД.

INCFTCL,1; ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ.

RETURN

CLRFTCL; ОБНУЛИМ СЕКУНДЫ.

MOVFWTCH; ЕСЛИ ДЕСЯТКИ СЕКУНД

ADDLW-5H; РАВНЫ 5,

BZ$+3; ИДЕМ СРАВНИВАТЬ МИНУТЫ.

INCFTCH,1; ИНАЧЕ УВЕЛИЧИМ ДЕСЯТКИ СЕКУНД.

RETURN

CLRFTCH; ОБНУЛИМ ДЕСЯТКИ СЕКУНД.

MOVFWTML; ЕСЛИ ЕДИНИЦЫ МИНУТ

ADDLW-9H; РАВНЫ 9,

BZ$+3; ИДЕМ СРАВНИВАТЬ ДЕСЯТКИ.

INCFTML,1; ИНАЧЕ УВЕЛИЧИМ МИНУТЫ.

RETURN

CLRFTML; ОБНУЛИМ ЕДИНИЦЫ МИНУТ.

MOVFWTMH; ЕСЛИ ДЕСЯТКИ МИНУТ

ADDLW-5H; РАВНЫ 5,

BZ$+3; УВЕЛИЧИМ ЧАСЫ.

INCFTMH,1; ИЛИ УВЕЛИЧИМ ДЕСЯТКИ МИНУТ.

RETURN

CLRFTMH; ОБНУЛИМ ДЕСЯТКИ МИНУТ.

MOVFWTHL; ЕСЛИ ЕДИНИЦЫ ЧАСОВ РАВНЫ 9,

ADDLW-9H;

BZ$+3; УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ.

INCFTHL,1; ИЛИ УВЕЛИЧИМ ЕДИНИЦЫ ЧАСОВ.

RETURN

CLRFTHL; ОБНУЛИМ ЧАСЫ.

MOVFWTHH; ЕСЛИ ДЕСЯТКИ ЧАСОВ РАВНЫ 9,

ADDLW-9H;

BZ$+3; ОБНУЛИМ.

INCFTHH,1; ИЛИ УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ.

RETURN

CLRFTHH;

RETURN

T00

BTFSSFLAG,5;

GOTO$+4;

BCFFLAG,2; ТАЙМЕР ВЫКЛЮЧЕН.

BCFFLAG,5; СЛЕДУЮЩЕЕ ВКЛЮЧЕНИЕ ТАЙМЕРА.

RETURN;

CLRFTCL;ВСЕОБНУЛЯЕМ.

CLRFTCH;

CLRFTML;

CLRFTMH;

CLRFTHL;

CLRFTHH;

BSFFLAG,2;ВКЛЮЧИМТАЙМЕР.

RETURN

;===================================================

; 15. АЦП — ПРЕОБРАЗОВАНИЯ (ИЗМЕРЕНИЕ ВХОДНЫХ ВЕЛИЧИН).

;===================================================

ADP

MOVLWB'10000001'; СИНХРОНИЗАЦИЯ ОТ RC

MOVWFADCON0; ГЕНЕРАТОРА, ВХОД 0, ВКЛЮЧЕНИЕ АЦП (YBX).

CALLZAD;

BSFADCON0,1; ВКЛЮЧИМ ПРЕОБРАЗОВАНИЕ.

BTFSCADCON0,1; ОЖИДАЕМ ЗАВЕРШЕНИЯ

GOTO$-1; ПРЕОБРАЗОВАНИЯ.

MOVFWADRESH; ПЕРЕПИШЕМ РЕЗУЛЬТАТ ПРЕОБРАЗОВАНИЯ

MOVWFTEKH; В СТАРШИЙ ТЕКУЩИЙ РЕГИСТР.

BSFSTATUS,5; ПЕРЕХОДИМ В БАНК 1.

MOVLW58;

MOVWFFSR; ПО КОСВЕННОЙ АДРЕСАЦИИ

MOVFWADRESL; ЗАПИСЬ МЛ. РЕГИСТРА АЦП

MOVWFINDF; В РЕГИСТР TEKL.

BCFSTATUS,5; ПЕРЕХОДИМ В БАНК 0.

CALLCOMPA;

GOTOBINDEC; ПЕРЕКОДИРУЕМ В 2_10 КОД.

ZAD

MOVLW.5; ЗАДЕРЖКА 20 МКС.

ADDLW-1;

BTFSSSTATUS,2;

GOTO$-2;

RETURN

;===========================

; 16. СРАВНЕНИЕСУСТАНОВКОЙ.

;===========================

COMPA

TSTFTEKL;

BTFSCSTATUS,2;

GOTOVUKL;

MOVFWYCTL;УСТАНОВКАМАКСИМУМА.

SUBWFTEKL,0; ИЗМЕРЕНИЕ,

BTFSCSTATUS,0; ЕСЛИ БОЛЬШЕ ИЛИ РАВНО,

GOTOVUKL; ТО ВКЛЮЧАЕТСЯ ЗУММЕР.

MOVFWYCTLI; УСТАНОВКА МИНИМУМА.

SUBWFTEKL,0; ИЗМЕРЕНИЕ,

BTFSSSTATUS,0; ЕСЛИ МЕНЬШЕ,

GOTOVUKL; ТО ВКЛЮЧАЕТСЯ ЗУММЕР.

BTFSCSTATUS,2; ЕСЛИ РАВНО,

GOTOVUKL; ТО ВКЛЮЧАЕТСЯ ЗУММЕР.

    продолжение
--PAGE_BREAK--

BCFFLAG1,4; ЗУММЕР ВЫКЛЮЧЕН.

BCFFLAG1,5; ЗУММЕР ВЫКЛЮЧЕН.

BCFPORTC,0; ВЫКЛЮЧИМ СИГНАЛ.

RETURN

VUKL

BTFSCPORTA,KY;

GOTO$+5;

BSFFLAG1,5; ПОСТАВИМ СТОРОЖОК НА 1 ЧАС.

BCFPORTC,0; ВЫКЛЮЧИМ СИГНАЛ.

BTFSCFLAG1,5; ЕСЛИ 1 ЧАС ПРОШЕЛ, ТО ВКЛЮЧИМ СИГНАЛ.

RETURN

BTFSCFLAG1,4; ЕСЛИ ВЫХОД УЖЕ ВЫКЛЮЧЕН,

RETURN; СРАВНЕНИЙ НЕТ.

BSFPORTC,0; ВКЛЮЧИМ СИГНАЛ.

BSFFLAG1,4; ЗУММЕР ВКЛЮЧЕН.

RETURN

;======================================================

; 17. ПЕРЕКОДИРОВКА ИЗ 16-И РАЗРЯДНОГО 2-ГО В 5- РАЗРЯДНОЕ 2-10-Е.

; АЛГОРИТМ ПЕРЕКОДИРОВКИ ОСНОВЫВАЕТСЯ НА ПРИБАВЛЕНИИ 3 В МЛАДШИЙ

; И СТАРШИЙ ПОЛУБАЙТЫ. ЕСЛИ РЕЗУЛЬТАТ СПЕРЕНОСОМ 1 В 3 РАЗРЯД (10=7+3), ТО ЗАПИСЫВАЕМ

; НОВОЕ ЗНАЧЕНИЕ В РЕГИСТР. ВЫПОЛНЯЕМ 16 РАЗ СДВИГАЯ БИТЫ РЕГИСТРОВ.

;======================================================

BINDEC

MOVLW .16; ЗАПИШЕМ ЧИСЛО СДВИГОВ

MOVWF COU; В СЧЕТЧИК.

BIDE

BCF STATUS,0; ОБНУЛИМ БИТ «С».

RLF TEKL,1; СДВИНЕМ ПЕРЕКОДИРУЕМОЕ

RLF TEKH,1; ЧИСЛО ПЕРЕМЕЩАЯ ЕГО СТАРШИЙ БИТ

RLF EDA,1; В МЛАДШИЙ БИТ РЕГИСТРОВ

RLF DEA,1; РЕЗУЛЬТАТА.

DECFSZ COU,1; ЗАФИКСИРУЕМ СДВИГ В СЧЕТЧИКЕ.

GOTO RASDEC; ПРОВЕРИМ ПОЛУБАЙТЫ НА СЕМЕРКУ.

GOTO MESTO; ЕСЛИ СЧЕТЧИК ПУСТ, ЗАПОЛНИМ РЕГИСТРЫ ИНДИКАЦИИ.

RASDEC

MOVLW EDA; ЗАПИШЕМ АДРЕС РЕГИСТРА

MOVWF FSR; В РЕГИСТР КОСВЕННОЙ АДРЕСАЦИИ.

CALL BCD; ПРОВЕРИМ ЗНАЧЕНИЕ РЕГИСТРА НА 7.

MOVLW DEA; АНАЛОГИЧНЫЕ ОПЕРАЦИИ ПРОДЕЛАЕМ

MOVWF FSR; С ДРУГИМИ РЕГИСТРАМИ.

CALL BCD ;

GOTO BIDE; ПОЙДЕМ ПОВТОРЯТЬ СДВИГ.

BCD

MOVLW 3 ;0000 0011

ADDWF 0,0; ПРИБАВИМ 3 К РЕГИСТРУ И РЕЗУЛЬТАТ

MOVWF TEMP; ЗАПИШЕМ ВО ВРЕМЕННЫЙ РЕГИСТР.

BTFSC TEMP,3; ПРОВЕРИМ 3 БИТ И ЕСЛИ ОН РАВЕН НУЛЮ,

MOVWF 0; ПРОПУСКАЕМ ЗАПИСЬ РЕЗУЛЬТАТА В РЕГИСТР.

MOVLW 30 ;48=0011 0000

ADDWF 0,0; ПРИБАВИМ 3 К СТАРШЕМУ ПОЛУБАЙТУ РЕГИСТРА И РЕЗУЛЬТАТ

MOVWF TEMP; ЗАПИШЕМ ВО ВРЕМЕННЫЙ РЕГИСТР.

BTFSC TEMP,7; ЕСЛИ БИТ ЕДИНИЧНЫЙ,

MOVWF 0; ТО ЗАПИШЕМ НОВОЕ ЗНАЧЕНИЕ В РЕГИСТР.

RETURN; ВЕРНЕМСЯ ДЛЯ ЗАГРУЗКИ НОВОГО ЗНАЧЕНИЯ РЕГИСТРА.

;======================================================

; 18. ИЗВЛЕКАЕМ ПОЛУБАЙТЫ ИЗ РЕГИСТРОВ СЧЕТА В РЕГИСТРЫ ИНДИКАЦИИ.

;======================================================

MESTO

MOVLWB'00001111'; ИЗВЛЕКАЕМ ПОЛУБАЙТЫ

ANDWFDEA,0; В РЕГИСТРЫ ИНДИКАЦИИ.

MOVWFCOI;

MOVLWB'11110000';

ANDWFEDA,0 ;

MOVWFDEI ;

SWAPFDEI,1 ;

MOVLWB'00001111';

ANDWFEDA,0;

MOVWFEDI;

CLRFEDA;

CLRFDEA;

RETURN;

;==================================================

; 19. СМЕНА ИНДИКАЦИИ ПРИ СМЕНЕ РЕЖИМА.

;==================================================

INDH

BTFSCFLAG,7; ЕСЛИ КУРСОР ЕСТЬ,

CALLYCT; ТО ИДЕМ НА УСТАНОВКУ.

MOVLW.10; ПУСТО.

CALLSEG; ЗАПОЛНИМ РЕГИСТРЫ ИНДИКАЦИИ.

MOVWFR1;

MOVWFR2;

MOVWFR8;

BTFSSFLAG,6;

GOTO$+6;

MOVLW.11;ПРОЧЕРКСРЕДНИЙ.

CALLSEG;

MOVWFR5;

BCFFLAG,6;

GOTO$+5;

MOVLW.12;ПРОЧЕРКНИЖНИЙ.

CALLSEG;

MOVWFR5;

BSFFLAG,6;

MOVFWML;

CALLSEG;

MOVWFR3;

MOVFWMH;

CALLSEG;

MOVWFR4;

MOVFWHL;

CALLSEG;

MOVWFR6;

MOVFWHH;

CALLSEG;

MOVWFR7;

BSFFLAG,1; ВКЛЮЧИМ РЕЖИМ ЧАСОВ.

CLRFZPT;

RETURN;

INDT

BTFSSPORTA,KY;ЕСЛИКНОПКАНАЖАТА,

CALLT00; ТО ИДЕМ ОБНУЛЯТЬ ТАЙМЕР.

MOVFWTCL; ЗАПОЛНИМ РЕГИСТРЫ ИНДИКАЦИИ

CALLSEG; МИНУТ И СЕКУНД ПРАВЫХ ЧАСОВ.

MOVWFR1;

MOVFWTCH;

CALLSEG;

MOVWFR2;

MOVFWTML;

CALLSEG;

    продолжение
--PAGE_BREAK--

MOVWFR4;

MOVFWTMH;

CALLSEG;

MOVWFR5;

MOVLW.11;ПРОЧЕРК.

CALLSEG;

MOVWFR3;

MOVWFR6;

MOVFWTHL;

CALLSEG;

MOVWFR7;

MOVFWTHH;

CALLSEG;

MOVWFR8;

BCFFLAG,1; РЕЖИМ ЧАСЫ ВЫКЛЮЧЕН.

BCFFLAG,7; НЕТ УСТАНОВКИ.

RETURN;

INDU

MOVLW.10; ПУСТО.

CALLSEG; ЗАПОЛНИМ РЕГИСТРЫ ИНДИКАЦИИ.

MOVWFR1;

MOVWFR2;

MOVWFR3;

MOVWFR7;

MOVWFR8;

MOVFW COI;

CALLSEG;

MOVWFR6;

MOVFW DEI;

CALLSEG;

MOVWFR5;

MOVFW EDI;

CALLSEG;

MOVWFR4;

BSFZPT,4;

RETURN;

;===================================================

; 20. РАСПРЕДЕЛИТЕЛЬ.

;===================================================

PAC

BTFSSFLAG1,1;ЖДЕМ1 СЕКУНДУ.

GOTO$-1;

CALLADP;

CALLKHOP; НА ПРОВЕРКУ КНОПОК.

CALLIND; НА ИНДИКАЦИЮ.

BCFFLAG1,1;

GOTOPAC; ПОВТОРИМ.

;=====================================================

; 21. УСТАНОВКА ВРЕМЕНИ.

;=====================================================

YC0

INCFML,1; УВЕЛИЧИМ ЕДИНИЦЫ МИНУТ.

MOVLW.10; НЕ БОЛЕЕ 9.

SUBWFML,0;

SKPNC; ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 10,

CLRFML; ТО ОБНУЛИМ.

RETURN

YC1

INCFMH,1; УВЕЛИЧИМ ДЕСЯТКИ МИНУТ.

MOVLW.6; НЕ БОЛЕЕ 5.

SUBWFMH,0;

SKPNC; ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 6,

CLRFMH; ТО ОБНУЛИМ.

RETURN

YC2

INCFHL,1; УВЕЛИЧИМ ЕДИНИЦЫ ЧАСОВ.

MOVLW.10; НЕ БОЛЕЕ 9.

SUBWFHL,0;

SKPNC;

CLRFHL; ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.

MOVFWHH; ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ

CALLDEBIN; КОД ДЕСЯТКИ.

ADDWFHL,0; ПРИБАВИМ ЕДИНИЦЫ

MOVWFHOU; ДВОИЧНОЕ ЗНАЧЕНИЕ НЕ ДОЛЖНО

ADDLW-18H; ПРЕВЫШАТЬ — 24.

SKPC; ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 24,

RETURN

CLRFHOU; ТО ОБНУЛИМ ЧАСЫ ДВОИЧНЫЕ

CLRFHL; И РАЗРЯДЫ СТАРШИЙ

CLRFHH; И МЛАДШИЙ.

RETURN

YC3

INCFHH,1; УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ.

MOVLW.3; НЕ БОЛЕЕ 2.

SUBWFHH,0;

SKPNC;

CLRFHH; ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.

MOVFWHH; ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ

CALLDEBIN; КОД ДЕСЯТКИ.

ADDWFHL,0; ПРИБАВИМ ЕДИНИЦЫ

MOVWFHOU; И ПОЛУЧИМ ДВОИЧНОЕ ЧИСЛО.

ADDLW-18H;

SKPC; ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 24,

RETURN

CLRFHOU; ТО ОБНУЛИМ ЧАСЫ ДВОИЧНЫЕ

CLRFHL; И РАЗРЯДЫ СТАРШИЙ

CLRFHH; И МЛАДШИЙ.

RETURN; ВЕРНЕМСЯ.

YCE

CLRFCL; ОБНУЛЕНИЕ.

CLRFCH;

CLRFML;

RETURN;

;=====================================================

END

;=====================================================


еще рефераты
Еще работы по коммуникациям