Номер команды
|
Название команды
|
Внутренний код команды (после перекодировки)
|
Код ИК ДУ (до перекодировки)
|
1
|
TIMER
|
0CH
|
00H
|
2
|
CLOCK
|
0DH
|
01H
|
3
|
ALARM
|
0EH
|
02H
|
4
|
LOCK
|
0FH
|
03H
|
5
|
7
|
08H
|
08H
|
6
|
8
|
09H
|
09H
|
7
|
9
|
0AH
|
0AH
|
8
|
LIST
|
10H
|
0BH
|
9
|
4
|
05H
|
10H
|
10
|
5
|
06H
|
11H
|
11
|
6
|
07H
|
12H
|
12
|
ESCAPE
|
11H
|
13H
|
13
|
ALARM DISABLE
|
14H
|
18H
|
14
|
TIMER CLEAR
|
13H
|
1AH
|
15
|
0
|
01H
|
20H
|
16
|
BACKSPACE
|
12H
|
22H
|
17
|
1
|
02H
|
28H
|
18
|
2
|
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. Принципиальная схема в Accel EDA.
Заключение
В данном курсовом проекте разработано устройство - электронные
часы-вольтметр-термометр. Разработана схема электрическая принципиальная этого
устройства и программа для микроконтроллера. В результате ассеблирования
получена прошивка программы для памяти микроконтроллера. Применение
микроконтроллера позволило упростить принципиальную схему и расширить
функциональные возможности микроконтроллера, так как для изменения функций
устройства достаточно внести изменения в программу микроконтроллера.
Список литературы
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;
;===========================================
; ОПРЕДЕЛЕНИЕ БИТОВ СОСТОЯНИЯ ФЛАГОВ.
;===========================================
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-> ПУСТО.
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;ДАННЫЕ РАВНЫ НУЛЮ.
BCFPORTC,LOAD;НАЧАЛО ПЕРЕДАЧИ (LOAD=0).
RRFTZPT,1;ВЫТОЛКНЕМ ОЧЕРЕДНУЮ ЗАПЯТУЮ.
CALLVUV0;
BCFFLAG1,2;ЗАПЯТАЯ ПЕРЕДАНА.
MOVLWR1;ЗАПИШЕМ АДРЕС ПЕРВОГО РЕГИСТРА ИНДИКАЦИИ.
MOVWFFSR;
MOVFWINDF;ЗНАЧЕНИЕ ПЕРВОГО РЕГИСТРА
MOVWFTEMP;ПЕРЕПИШЕМ ВО ВРЕМЕННЫЙ.
BCFPORTC,LOAD;НАЧАЛО ПЕРЕДАЧИ (LOAD=0).
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
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;ТО ВКЛЮЧАЕТСЯ ЗУММЕР.
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;
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
;=====================================================