; 12. СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ ПРИ ПРЕРЫВАНИИ.
;======================================================
PRER
MOVWF WTEMP ;СОХРАНЕНИЕ ЗНАЧЕНИЙ РЕГИСТРОВ W,
MOVFW STATUS ;STATUS,
MOVWF STEMP ;
MOVFW FSR ;FSR.
MOVWF FTEMP ;
BSF FLAG1,1 ;1 СЕК ЦИКЛА.
CALL S1 ;ПОДСЧИТАЕМ ВРЕМЯ.
BTFSC FLAG,2 ;
CALL TAIM ;
REPER ;ВОССТАНОВЛЕНИЕ СОХРАНЕННЫХ ЗНАЧЕНИЙ.
MOVFW STEMP ;ВОССТАНОВЛЕНИЕ РЕГИСТРОВ:
MOVWF STATUS ;STATUS,
MOVFW FTEMP ;
MOVWF FSR ;FSR,
MOVFW WTEMP ;W.
BCF INTCON,2;СБРАСЫВАЕМ ФЛАГ ПРЕРЫВАНИЯ ОТ TMR0.
RETFIE ;ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ.
;=============================================
; 13. ПОДСЧЕТ ВРЕМЕНИ.
;=============================================
S1
BTFSC FLAG1,5 ;
GOTO $+8 ;
BTFSS FLAG1,4 ;
GOTO $+6 ;
BTFSC PORTC,0 ;СМЕНА ВКЛЮЧЕНИЯ ЗУММЕРА.
GOTO $+3 ;
BSF PORTC,0 ;ВКЛЮЧИМ СИГНАЛ.
GOTO $+2 ;
BCF PORTC,0 ;
MOVLW .9 ;ЕСЛИ УЖЕ 9 СЕКУНД,
SUBWF CL,0 ;
BC SH ;ИДЕМ НА СРАВНЕНИЕ ДЕСЯТКОВ СЕКУНД.
INCF CL,1 ;ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ.
RETURN
SH
CLRF CL ;ОБНУЛИМ СЕКУНДЫ.
MOVFW CH ;ЕСЛИ ДЕСЯТКИ СЕКУНД
ADDLW -5H ;РАВНЫ 5,
BZ MIL ;ИДЕМ СРАВНИВАТЬ МИНУТЫ.
INCF CH,1 ;ИНАЧЕ УВЕЛИЧИМ ДЕСЯТКИ СЕКУНД.
RETURN
MIL
CLRF CH ;ОБНУЛИМ ДЕСЯТКИ СЕКУНД.
MOVFW ML ;ЕСЛИ ЕДИНИЦЫ МИНУТ
ADDLW -9H ;РАВНЫ 9,
BZ MIH ;ИДЕМ СРАВНИВАТЬ ДЕСЯТКИ.
INCF ML,1 ;ИНАЧЕ УВЕЛИЧИМ МИНУТЫ.
RETURN
MIH
BSF FLAG1,4 ;ПРОШЛО 10 МИНУТ КУРСОР ВЫКЛЮЧАЕТСЯ.
BCF FLAG,7 ;НЕТ УСТАНОВКИ.
CLRF KYPC ;НЕТ КУРСОРА.
CLRF ML ;ОБНУЛИМ ЕДИНИЦЫ МИНУТ.
MOVFW MH ;ЕСЛИ ДЕСЯТКИ МИНУТ
ADDLW -5H ;РАВНЫ 5,
BZ HOL ;ИДЕМ СРАВНИВАТЬ ЧАСЫ.
INCF MH,1 ;ИЛИ УВЕЛИЧИМ ДЕСЯТКИ МИНУТ.
RETURN
HOL
BCF FLAG1,5 ;НАПОМИНАНИЕ ОБ АВАРИИ НАПРЯЖЕНИЯ.
CLRF MH ;ОБНУЛИМ ДЕСЯТКИ МИНУТ.
MOVFW HH ;ЕСЛИ ДЕСЯТКИ ЧАСОВ
ADDLW -2H ;РАВНЫ 2,
BZ HL4 ;ПРОВЕРИМ ЕДИНИЦЫ ЧАСОВ.
MOVFW HL ;ЕСЛИ ЕДИНИЦЫ ЧАСОВ РАВНЫ 9,
ADDLW -9H ;
BZ $+3 ;УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ.
INCF HL,1 ;ИЛИ УВЕЛИЧИМ ЕДИНИЦЫ ЧАСОВ.
RETURN
CLRF HL ;
INCF HH,1 ;
RETURN
HL4
MOVFW HL ;ЕСЛИ ЕДИНИЦЫ ЧАСОВ
ADDLW -3H ;РАВНЫ 3,
BZ HOH ;ИДЕМ ОБНУЛЯТЬ.
INCF HL,1 ;ИЛИ ПРИБАВИМ ЕДИНИЦУ.
RETURN
HOH
CLRF HL ;
CLRF HH ;ОБНУЛИМ ДЕСЯТКИ ЧАСОВ.
RETURN ;
;=============================================
; 14. ТАЙМЕР.
;=============================================
TAIM
BSF FLAG,5 ;СЛЕДУЮЩАЯ ОСТАНОВКА ТАЙМЕРА.
MOVLW .9 ;ЕСЛИ УЖЕ 9 СЕКУНД,
SUBWF TCL,0 ;
BC $+3 ;ИДЕМ НА СРАВНЕНИЕ ДЕСЯТКОВ СЕКУНД.
INCF TCL,1 ;ИНАЧЕ ПРИБАВИМ ЕДИНИЦУ.
RETURN
CLRF TCL ;ОБНУЛИМ СЕКУНДЫ.
MOVFW TCH ;ЕСЛИ ДЕСЯТКИ СЕКУНД
ADDLW -5H ;РАВНЫ 5,
BZ $+3 ;ИДЕМ СРАВНИВАТЬ МИНУТЫ.
INCF TCH,1 ;ИНАЧЕ УВЕЛИЧИМ ДЕСЯТКИ СЕКУНД.
RETURN
CLRF TCH ;ОБНУЛИМ ДЕСЯТКИ СЕКУНД.
MOVFW TML ;ЕСЛИ ЕДИНИЦЫ МИНУТ
ADDLW -9H ;РАВНЫ 9,
BZ $+3 ;ИДЕМ СРАВНИВАТЬ ДЕСЯТКИ.
INCF TML,1 ;ИНАЧЕ УВЕЛИЧИМ МИНУТЫ.
RETURN
CLRF TML ;ОБНУЛИМ ЕДИНИЦЫ МИНУТ.
MOVFW TMH ;ЕСЛИ ДЕСЯТКИ МИНУТ
ADDLW -5H ;РАВНЫ 5,
BZ $+3 ;УВЕЛИЧИМ ЧАСЫ.
INCF TMH,1 ;ИЛИ УВЕЛИЧИМ ДЕСЯТКИ МИНУТ.
RETURN
CLRF TMH ;ОБНУЛИМ ДЕСЯТКИ МИНУТ.
MOVFW THL ;ЕСЛИ ЕДИНИЦЫ ЧАСОВ РАВНЫ 9,
ADDLW -9H ;
BZ $+3 ;УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ.
INCF THL,1 ;ИЛИ УВЕЛИЧИМ ЕДИНИЦЫ ЧАСОВ.
RETURN
CLRF THL ;ОБНУЛИМ ЧАСЫ.
MOVFW THH ;ЕСЛИ ДЕСЯТКИ ЧАСОВ РАВНЫ 9,
ADDLW -9H ;
BZ $+3 ;ОБНУЛИМ.
INCF THH,1 ;ИЛИ УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ.
RETURN
CLRF THH ;
RETURN
T00
BTFSS FLAG,5 ;
GOTO $+4 ;
BCF FLAG,2 ;ТАЙМЕР ВЫКЛЮЧЕН.
BCF FLAG,5 ;СЛЕДУЮЩЕЕ ВКЛЮЧЕНИЕ ТАЙМЕРА.
RETURN ;
CLRF TCL ;ВСЕ ОБНУЛЯЕМ.
CLRF TCH ;
CLRF TML ;
CLRF TMH ;
CLRF THL ;
CLRF THH ;
BSF FLAG,2 ;ВКЛЮЧИМ ТАЙМЕР.
RETURN
;===================================================
; 15. АЦП - ПРЕОБРАЗОВАНИЯ (ИЗМЕРЕНИЕ ВХОДНЫХ ВЕЛИЧИН).
;===================================================
ADP
MOVLW B'10000001' ;СИНХРОНИЗАЦИЯ ОТ RC
MOVWF ADCON0 ;ГЕНЕРАТОРА, ВХОД 0, ВКЛЮЧЕНИЕ АЦП (YBX).
CALL ZAD ;
BSF ADCON0,1 ;ВКЛЮЧИМ ПРЕОБРАЗОВАНИЕ.
BTFSC ADCON0,1 ;ОЖИДАЕМ ЗАВЕРШЕНИЯ
GOTO $-1 ;ПРЕОБРАЗОВАНИЯ.
MOVFW ADRESH ;ПЕРЕПИШЕМ РЕЗУЛЬТАТ ПРЕОБРАЗОВАНИЯ
MOVWF TEKH ;В СТАРШИЙ ТЕКУЩИЙ РЕГИСТР.
BSF STATUS,5 ;ПЕРЕХОДИМ В БАНК 1.
MOVLW 58 ;
MOVWF FSR ;ПО КОСВЕННОЙ АДРЕСАЦИИ
MOVFW ADRESL ;ЗАПИСЬ МЛ. РЕГИСТРА АЦП
MOVWF INDF ;В РЕГИСТР TEKL.
BCF STATUS,5 ;ПЕРЕХОДИМ В БАНК 0.
CALL COMPA ;
GOTO BINDEC ;ПЕРЕКОДИРУЕМ В 2_10 КОД.
ZAD
MOVLW .5 ;ЗАДЕРЖКА 20 МКС.
ADDLW -1 ;
BTFSS STATUS,2 ;
GOTO $-2 ;
RETURN
;===========================
; 16. СРАВНЕНИЕ С УСТАНОВКОЙ.
;===========================
COMPA
TSTF TEKL ;
BTFSC STATUS,2;
GOTO VUKL ;
MOVFW YCTL ;УСТАНОВКА МАКСИМУМА.
SUBWF TEKL,0 ;ИЗМЕРЕНИЕ,
BTFSC STATUS,0;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО,
GOTO VUKL ;ТО ВКЛЮЧАЕТСЯ ЗУММЕР.
MOVFW YCTLI ;УСТАНОВКА МИНИМУМА.
SUBWF TEKL,0 ;ИЗМЕРЕНИЕ,
BTFSS STATUS,0;ЕСЛИ МЕНЬШЕ,
GOTO VUKL ;ТО ВКЛЮЧАЕТСЯ ЗУММЕР.
BTFSC STATUS,2;ЕСЛИ РАВНО,
GOTO VUKL ;ТО ВКЛЮЧАЕТСЯ ЗУММЕР.
BCF FLAG1,4 ;ЗУММЕР ВЫКЛЮЧЕН.
BCF FLAG1,5 ;ЗУММЕР ВЫКЛЮЧЕН.
BCF PORTC,0 ;ВЫКЛЮЧИМ СИГНАЛ.
RETURN
VUKL
BTFSC PORTA,KY;
GOTO $+5 ;
BSF FLAG1,5 ;ПОСТАВИМ СТОРОЖОК НА 1 ЧАС.
BCF PORTC,0 ;ВЫКЛЮЧИМ СИГНАЛ.
BTFSC FLAG1,5 ;ЕСЛИ 1 ЧАС ПРОШЕЛ, ТО ВКЛЮЧИМ СИГНАЛ.
RETURN
BTFSC FLAG1,4 ;ЕСЛИ ВЫХОД УЖЕ ВЫКЛЮЧЕН,
RETURN ;СРАВНЕНИЙ НЕТ.
BSF PORTC,0 ;ВКЛЮЧИМ СИГНАЛ.
BSF FLAG1,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
MOVLW B'00001111' ;ИЗВЛЕКАЕМ ПОЛУБАЙТЫ
ANDWF DEA,0 ;В РЕГИСТРЫ ИНДИКАЦИИ.
MOVWF COI ;
MOVLW B'11110000' ;
ANDWF EDA,0 ;
MOVWF DEI ;
SWAPF DEI,1 ;
MOVLW B'00001111' ;
ANDWF EDA,0 ;
MOVWF EDI ;
CLRF EDA ;
CLRF DEA ;
RETURN ;
;==================================================
; 19. СМЕНА ИНДИКАЦИИ ПРИ СМЕНЕ РЕЖИМА.
;==================================================
INDH
BTFSC FLAG,7 ;ЕСЛИ КУРСОР ЕСТЬ,
CALL YCT ;ТО ИДЕМ НА УСТАНОВКУ.
MOVLW .10 ;ПУСТО.
CALL SEG ;ЗАПОЛНИМ РЕГИСТРЫ ИНДИКАЦИИ.
MOVWF R1 ;
MOVWF R2 ;
MOVWF R8 ;
BTFSS FLAG,6 ;
GOTO $+6 ;
MOVLW .11 ;ПРОЧЕРК СРЕДНИЙ.
CALL SEG ;
MOVWF R5 ;
BCF FLAG,6 ;
GOTO $+5 ;
MOVLW .12 ;ПРОЧЕРК НИЖНИЙ.
CALL SEG ;
MOVWF R5 ;
BSF FLAG,6 ;
MOVFW ML ;
CALL SEG ;
MOVWF R3 ;
MOVFW MH ;
CALL SEG ;
MOVWF R4 ;
MOVFW HL ;
CALL SEG ;
MOVWF R6 ;
MOVFW HH ;
CALL SEG ;
MOVWF R7 ;
BSF FLAG,1 ;ВКЛЮЧИМ РЕЖИМ ЧАСОВ.
CLRF ZPT ;
RETURN ;
INDT
BTFSS PORTA,KY;ЕСЛИ КНОПКА НАЖАТА,
CALL T00 ;ТО ИДЕМ ОБНУЛЯТЬ ТАЙМЕР.
MOVFW TCL ;ЗАПОЛНИМ РЕГИСТРЫ ИНДИКАЦИИ
CALL SEG ;МИНУТ И СЕКУНД ПРАВЫХ ЧАСОВ.
MOVWF R1 ;
MOVFW TCH ;
CALL SEG ;
MOVWF R2 ;
MOVFW TML ;
CALL SEG ;
MOVWF R4 ;
MOVFW TMH ;
CALL SEG ;
MOVWF R5 ;
MOVLW .11 ;ПРОЧЕРК.
CALL SEG ;
MOVWF R3 ;
MOVWF R6 ;
MOVFW THL ;
CALL SEG ;
MOVWF R7 ;
MOVFW THH ;
CALL SEG ;
MOVWF R8 ;
BCF FLAG,1 ;РЕЖИМ ЧАСЫ ВЫКЛЮЧЕН.
BCF FLAG,7 ;НЕТ УСТАНОВКИ.
RETURN ;
INDU
MOVLW .10 ;ПУСТО.
CALL SEG ;ЗАПОЛНИМ РЕГИСТРЫ ИНДИКАЦИИ.
MOVWF R1 ;
MOVWF R2 ;
MOVWF R3 ;
MOVWF R7 ;
MOVWF R8 ;
MOVFW COI ;
CALL SEG ;
MOVWF R6 ;
MOVFW DEI ;
CALL SEG ;
MOVWF R5 ;
MOVFW EDI ;
CALL SEG ;
MOVWF R4 ;
BSF ZPT,4 ;
RETURN ;
;===================================================
; 20. РАСПРЕДЕЛИТЕЛЬ.
;===================================================
PAC
BTFSS FLAG1,1 ;ЖДЕМ 1 СЕКУНДУ.
GOTO $-1 ;
CALL ADP ;
CALL KHOP ;НА ПРОВЕРКУ КНОПОК.
CALL IND ;НА ИНДИКАЦИЮ.
BCF FLAG1,1 ;
GOTO PAC ;ПОВТОРИМ.
;=====================================================
; 21. УСТАНОВКА ВРЕМЕНИ.
;=====================================================
YC0
INCF ML,1 ;УВЕЛИЧИМ ЕДИНИЦЫ МИНУТ.
MOVLW .10 ;НЕ БОЛЕЕ 9.
SUBWF ML,0 ;
SKPNC ;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 10,
CLRF ML ;ТО ОБНУЛИМ.
RETURN
YC1
INCF MH,1 ;УВЕЛИЧИМ ДЕСЯТКИ МИНУТ.
MOVLW .6 ;НЕ БОЛЕЕ 5.
SUBWF MH,0 ;
SKPNC ;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 6,
CLRF MH ;ТО ОБНУЛИМ.
RETURN
YC2
INCF HL,1 ;УВЕЛИЧИМ ЕДИНИЦЫ ЧАСОВ.
MOVLW .10 ;НЕ БОЛЕЕ 9.
SUBWF HL,0 ;
SKPNC ;
CLRF HL ;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVFW HH ;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALL DEBIN ;КОД ДЕСЯТКИ.
ADDWF HL,0 ;ПРИБАВИМ ЕДИНИЦЫ
MOVWF HOU ;ДВОИЧНОЕ ЗНАЧЕНИЕ НЕ ДОЛЖНО
ADDLW -18H ;ПРЕВЫШАТЬ - 24.
SKPC ;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 24,
RETURN
CLRF HOU ;ТО ОБНУЛИМ ЧАСЫ ДВОИЧНЫЕ
CLRF HL ;И РАЗРЯДЫ СТАРШИЙ
CLRF HH ;И МЛАДШИЙ.
RETURN
YC3
INCF HH,1 ;УВЕЛИЧИМ ДЕСЯТКИ ЧАСОВ.
MOVLW .3 ;НЕ БОЛЕЕ 2.
SUBWF HH,0 ;
SKPNC ;
CLRF HH ;ЕСЛИ БОЛЬШЕ, ТО ОБНУЛИМ.
MOVFW HH ;ПЕРЕКОДИРУЕМ В ДВОИЧНЫЙ
CALL DEBIN ;КОД ДЕСЯТКИ.
ADDWF HL,0 ;ПРИБАВИМ ЕДИНИЦЫ
MOVWF HOU ;И ПОЛУЧИМ ДВОИЧНОЕ ЧИСЛО.
ADDLW -18H ;
SKPC ;ЕСЛИ БОЛЬШЕ ИЛИ РАВНО 24,
RETURN
CLRF HOU ;ТО ОБНУЛИМ ЧАСЫ ДВОИЧНЫЕ
CLRF HL ;И РАЗРЯДЫ СТАРШИЙ
CLRF HH ;И МЛАДШИЙ.
RETURN ;ВЕРНЕМСЯ.
YCE
CLRF CL ;ОБНУЛЕНИЕ.
CLRF CH ;
CLRF ML ;
RETURN ;
;======================================================
END
;======================================================