Смекни!
smekni.com

Разработка микропроцессорной системы Автомобильные часы-термометр-вольтметр на базе микроконтроллера (стр. 5 из 5)

; 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

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