62174 (611441), страница 4
Текст из файла (страница 4)
; 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).
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
BCFFLAG1,5;НАПОМИНАНИЕ ОБ АВАРИИ НАПРЯЖЕНИЯ.
CLRFMH;ОБНУЛИМ ДЕСЯТКИ МИНУТ.
MOVFWHH;ЕСЛИ ДЕСЯТКИ ЧАСОВ
ADDLW-2H;РАВНЫ 2,
BZHL4;ПРОВЕРИМ ЕДИНИЦЫ ЧАСОВ.
MOVFWHL;ЕСЛИ ЕДИНИЦЫ ЧАСОВ РАВНЫ 9,
ADDLW-9H;
BZ$+3;УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ.
INCFHL,1;ИЛИ УВЕЛИЧИМ ЕДИНИЦЫ ЧАСОВ.