Мегаобучалка Главная | О нас | Обратная связь


Подпрограмма двоично-десятичной коррекции



2020-03-19 162 Обсуждений (0)
Подпрограмма двоично-десятичной коррекции 0.00 из 5.00 0 оценок




Данная подпрограмма осуществляет конвертирование двоичного кода, предварительно записанного в буферных регистрах TEMP_TL TEMP_TH в двоично-десятичный код, записываемый в регистры индикации IND_0, IND_1, IND_2, IND_3.

Листинг подпрограммы приведен ниже.

 

;-_DEC                              ; ПОДПРОГРАММА ДВОИЧНО-ДЕСЯТИЧНОЙ КОРРЕКЦИИ

;-

; РАСПРЕДЕЛЕНИЕ ТЕТРАД РЕГИСТРОВ TEMP_TL И TEMP_TH ПО РЕГИСТРАМ IND_0 - IND_3

MOVF   TEMP_TL, W 0x0F

MOVWF IND_0            ; ПОМЕСТИТЬ МЛАДШУЮ ТЕТРАДУ TEMP_TL В IND_0

 

SWAPF TEMP_TL, W 0x0F

MOVWF IND_1            ; ПОМЕСТИТЬ СТАРШУЮ ТЕТРАДУ TEMP_TL В IND_1

 

MOVF   TEMP_TH, W 0x0F

MOVWF IND_2            ; ПОМЕСТИТЬ МЛАДШУЮ ТЕТРАДУ TEMP_TH В IND_2

 

SWAPF TEMP_TH, W 0x0F

MOVWF IND_3            ; ПОМЕСТИТЬ СТАРШУЮ ТЕТРАДУ TEMP_TH В IND_3

;-

; КОРРЕКЦИЯ РЕЗУЛЬТАТА STATUS, Z    STATUS, C

MOVLW 0x0A              IND_0, W STATUS, C

GOTO   $+5 STATUS, Z    ; ЕСЛИ ЗНАЧЕНИЕ IND_0 НЕ МЕНЬШЕ 0x0A $+3 IND_0            ; В РЕГИСТР IND_0 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И

; 0x0A   IND_1, F ; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_1

 

BCF STATUS, Z              STATUS, C

MOVLW 0x0A     ; ИНАЧЕ ЗНАЧЕНИЯ РЕГИСТРОВ ОСТАВИТЬ БЕЗ ИЗМЕНЕНИЯ

SUBWF IND_1, W STATUS, C

GOTO   $+5 STATUS, Z    ; ЕСЛИ ЗНАЧЕНИЕ IND_1 НЕ МЕНЬШЕ 0x0A $+3 IND_1            ; В РЕГИСТР IND_1 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И

; 0x0A   IND_2, F ; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_2

 

BCF STATUS, Z    STATUS, C

MOVLW 0x0A     ; ИНАЧЕ ЗНАЧЕНИЯ РЕГИСТРОВ ОСТАВИТЬ БЕЗ ИЗМЕНЕНИЯ

SUBWF IND_2, W STATUS, C

GOTO   $+5 STATUS, Z    ; ЕСЛИ ЗНАЧЕНИЕ IND_2 НЕ МЕНЬШЕ 0x0A $+3 IND_2            ; В РЕГИСТР IND_2 ЗАПИСАТЬ РАЗНОСТЬ ЕГО СОДЕРЖИМОГО И

; 0x0A   IND_3, F ; И УВЕЛИЧИТЬ НА 1 СОДЕРЖИМОЕ IND_3

;-

 

Обработка прерываний

Вектор прерываний находится по адресу 0х04.

Обработчик прерываний включает в себя следующие подпрограммы:

1.  Подпрограмма сохранения контекста.

2. Подпрограмма определения источника прерывания.

.   Подпрограмма часов.

.   Подпрограмма обработки прерываний от таймера TMR2.

.   Подпрограмма обработки прерываний по входу INT.

.   Подпрограмма обработки прерываний по входам <RB4: RB7>.

.   Подпрограмма приема / передачи данных через USART.

.   Подпрограмма восстановления контекста.

Подпрограмма сохранения контекста

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

Ниже приведен листинг подпрограммы, осуществляющей сохранение контекста во временные регистры W_TEMP и STATUS_TEMP. Регистр STATUS_TEMP определен в 0-м банке по адресу 0х39, а регистр W_TEMP - в 0-м банке по адресу 0х3А и в 1-м банке по адресу 0хВА.

 

;-

; СОХРАНЕНИЕ АККУМУЛЯТОРА И РЕГИСТРА STATUS STATUS, RP0     ; ОПРЕДЕЛЕНИЕ ТЕКУЩЕГО БАНКА    RP0_CLR                STATUS, RP0       ; УСТАНОВИТЬ БАНК 0 W_TEMP       ; СОХРАНИТЬ АККУМУЛЯТОР   STATUS, W   STATUS_TEMP     ; СОХРАНИТЬ РЕГИСТР STATUS STATUS_TEMP, 5 ; ВОССТАНОВИТЬ ЗНАЧЕНИЕ БИТА RP0 $+4_CLR W_TEMP       ; СОХРАНИТЬ АККУМУЛЯТОР

SWAPF STATUS, W   STATUS_TEMP     ; СОХРАНИТЬ РЕГИСТР STATUS

;-

Подпрограмма определения источника прерывания

Данная подпрограмма по состоянию флагов прерываний в регистрах PIR1 и INTCON определяет источник прерывания и осуществляет вызов соответствующей подпрограммы обработки.

Листинг подпрограммы приведен ниже.

 

;-

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

INT_SOURCE STATUS ; ОЧИСТИТЬ РЕГИСТР STATUS

BTFSC  PIR1, CCP1IF ; ЕСЛИ ПРЕРЫВАНИЕ ОТ МОДУЛЯ CCP1    CLOCK          ; ПЕРЕХОД НА ПОДПРОГРАММУ ЧАСОВ

    PIR1, TMR2IF ; ЕСЛИ ПРЕРЫВАНИЕ ОТ ТАЙМЕРА TMR2    INT_TMR2    ; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ОТ

; TMR2

    INTCON, INTF ; ЕСЛИ ПРЕРЫВАНИЕ ПО ВХОДУ INT  INT_INT    ; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ПО

; INT

    INTCON, RBIF ; ЕСЛИ ПРЕРЫВАНИЕ ПО ВХОДАМ <RB4:RB7>    INT_RB ; ПЕРЕХОД НА ПОДПРОГРАММУ ОБРАБОТЧИКА ПРЕРЫВАНИЙ ПО

; ВХОДАМ <RB4:RB7>  PIR1, RCIF ; ЕСЛИ ПРЕРЫВАНИЕ ОТ ПРИЕМНИКА USART    SERIAL_PRT ; ПЕРЕХОД НА ПОДПРОГРАММУ ПРИЕМА/ПЕРЕДАЧИ

; ДАННЫХ ЧЕРЕЗ USART END_INT ; ИНАЧЕ ПЕРЕХОД НА ПОДПРОГРАММУ ВОССТАНОВЛЕНИЯ

; КОНТЕКСТА

;-

 

Подпрограмма часов

Данная подпрограмма осуществляет счет и вывод на индикацию (в случае включения режима отображения текущего времени) текущего времени. Кроме того подпрограмма проверяет совпадение текущего времени с временем начала и поддержания температуры. В случае их совпадения подпрограмма включает либо выключает режим поддержания температуры. Для счета используется 6 регистров-счетчиков:

SEC_L - счетчик единиц секунд;

SEC_H - счетчик десятков секунд;

MIN_L - счетчик единиц минут;

MIN_H - счетчик десятков минут;

HOUR_L - счетчик единиц часов;

HOUR_H - счетчик десятков часов.

Счетчики SEC_L, MIN_L, HOUR_L инкрементируются от 0х00 до 0х0А. При достижении 0х0А счетчики сбрасываются. Счетчики SEC_H и MIN_H инкрементируются от 0х00 до 0х06. При достижении 0х06 счетчики сбрасываются. Счетчик HOUR_H инкрементируется от 0х00 до 0х02. Счетчик сбрасывается, когда в нем записано значение 0х02, а счетчик HOUR_L досчитал до 0х04.

Листинг подпрограммы часов приведен ниже.


;-                              ; ПОДПРОГРАММА ТАЙМЕРА PIR1, CCP1IF ; СБРОСИТЬ ФЛАГ ПРЕРЫВАНИЯ ОТ МОДУЛЯ CCP1

;-

; СЧЕТЧИК ЕДИНИЦ СЕКУНД       SEC_L, F ; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК СЕКУНД SEC_L, W ; СЧЕТЧИК ДОСЧИТАЛ ДО 10 0x0A    STATUS, Z    CURR_TIME ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ   SEC_L            ; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК СЕКУНД

;-

; СЧЕТЧИК ДЕСЯТКОВ СЕКУНД   SEC_H, F ; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК СЕКУНД STATUS, Z              SEC_H, W ; СЧЕТЧИК ДОСЧИТАЛ ДО 6  0x06 STATUS, Z    CURR_TIME ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ   SEC_H           ; ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК СЕКУНД

;-

; СЧЕТЧИК ЕДИНИЦ МИНУТ         MIN_L, F ; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ STATUS, Z    MIN_L, W ; СЧЕТЧИК ДОСЧИТАЛ ДО 10 0x0A STATUS, Z    CURR_TIME ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ   MIN_L            ; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК МИНУТ

;-

; СЧЕТЧИК ДЕСЯТКОВ МИНУТ MIN_H, F ; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК МИНУТ STATUS, Z    MIN_H, W ; СЧЕТЧИК ДОСЧИТАЛ ДО 6

XORLW 0x06 STATUS, Z        

GOTO   CURR_TIME ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ   MIN_H           ; ДА - ОЧИСТИТЬ СТАРШИЙ СЧЕТЧИК МИНУТ

;-

; СЧЕТЧИКИ ЧАСОВ     HOUR_L, F    ; ИНКРЕМЕНТИРОВАТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ STATUS, Z    HOUR_H, W  ; СТАРШИЙ СЧЕТЧИК ДОСЧИТАЛ ДО 2  0x02 STATUS, Z    M3        ; НЕТ - ПЕРЕХОД НА ПРОВЕРКУ МЛАДШЕГО СЧЕТЧИКА

BCF STATUS, Z    HOUR_L, W  0x04 STATUS, Z    M3 STATUS, Z    HOUR_L ; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ

CLRF    HOUR_H CURR_TIME ; ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ   HOUR_L, W  0x0A     ; СЧЕТЧИК ДОСЧИТАЛ ДО 10 STATUS, Z    CURR_TIME ; НЕТ - ПЕРЕХОД НА ПОДПРОГРАММУ УПРАВЛЕНИЯ ВЫВОДОМ

; ТЕКУЩЕГО ВРЕМЕНИ НА ИНДИКАЦИЮ   HOUR_L ; ДА - ОЧИСТИТЬ МЛАДШИЙ СЧЕТЧИК ЧАСОВ HOUR_H ; ИНКРЕМЕНТИРОВАТЬ СТАРШИЙ СЧЕТЧИК ЧАСОВ

;-_TIME                   ; ПОДПРОГРАММА УПРАВЛЕНИЯ ВЫВОДОМ ТЕКУЩЕГО

; ВРЕМЕНИ НА ИНДИКАЦИЮ

;-

; ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ РЕЖИМА ПОДДЕРЖАНИЯ ТЕМПЕРАТУРЫ

BCF STATUS, Z    START_ML, W MIN_L, W STATUS, Z    M4

    STATUS, Z    START_MH, W MIN_H, W STATUS, Z    M4

    STATUS, Z    START_HL, W HOUR_L, W  STATUS, Z    M4

    STATUS, Z    START_HH, W HOUR_H, W  STATUS, Z    M4

    FLAG_R1,0    STATUS, Z    STOP_ML, W MIN_L, W STATUS, Z    M5

    STATUS, Z    STOP_MH, W MIN_H, W STATUS, Z    M5

    STATUS, Z    STOP_HL, W HOUR_L, W  STATUS, Z    M5

    STATUS, Z    STOP_HH, W HOUR_H, W  STATUS, Z    M5

    FLAG_R1,0

;-  FLAG_R, 6 ; ВКЛЮЧЕН РЕЖИМ ОТОБРАЖЕНИЯ ТЕКУЩЕГО ВРЕМЕНИ INT_SOURCE ; НЕТ - ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

; -     

; ВКЛЮЧЕНИЕ/ВЫКЛЮЧЕНИЕ РАЗДЕЛЯЮЩЕЙ ТОЧКИ POINT, 2    POINT, 1 ; ДЕЦИМАЛЬНАЯ ТОЧКА ВКЛЮЧЕНА $+3            POINT, 1 ; ДА - ВЫКЛЮЧИТЬ ТОЧКУ  $+2 POINT, 1 ; НЕТ - ВКЛЮЧИТЬ ТОЧКУ

; -     

MOVF   MIN_L, W IND_0   MIN_H, W IND_1   HOUR_L, W    IND_2   HOUR_H, W  IND_3

GOTO   INT_SOURCE ; НЕТ - ВЕРНУТЬСЯ К ПОИСКУ ИСТОЧНИКОВ ПРЕРЫВАНИЙ

;-

 



2020-03-19 162 Обсуждений (0)
Подпрограмма двоично-десятичной коррекции 0.00 из 5.00 0 оценок









Обсуждение в статье: Подпрограмма двоично-десятичной коррекции

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (162)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)