STATUS equ 3; Регистр STATUS
INTCON equ h’0B’; Регистр управления прерываниями
INTF equ 1; Флаг внешнего прерывания — бит 1
INTE equ 4; Бит маски внешнего прерывания — бит 4
GIE equ 7; Бит глобального разрешения прерываний — бит 7
_status equ h’4F’; Ячейка для сохранения регистра STATUS
EVENT equ h’20’; Счетчик общего числа посетителей
; Вектор сброса --------------
org 000; При сбросе в PC заносится число h’000’
goto MAIN; Переходим к началу фоновой программы
; Вектор прерывания --------
org 004; При прерывании PС переходит к адресу h’004’
goto PERS_COUNT; Переходим к обработчику прерывания
; Фоновая программа начинается с инициализации
MAIN bsf INTCON,INTE; Разрешаем внешнее прерывание
bsf INTCON,GIE; Разрешаем работу системы прерываний
clrf EVENT; Обнуляем счетчик посетителей
; Бесконечный цикл основной программы —
M_LOOP; Выполняем то
; Выполняем это
; Выполняем еще что-нибудь
goto M_LOOP
; ****************
; * ФУНКЦИЯ: Обработчик инкрементирует счетчик EVENT *
; ****************
PERS_COUNT
movwf _work; Сохраняем W в памяти данных
swapf STATUS,w; Считываем регистр STATUS, не меняя флагов
movwf _status; Сохраняем его в памяти данных
; -----------------
bcf INTCOM,TNTF; Сбрасываем флаг прерывания
incf EVENT,f; Регистрируем событие
; -----------------
swapf _status,w; Восстанавливаем исходное состояние
movwf STATUS; регистра STATUS
swapf _work,f; Теперь восстанавливаем исходное состояние W,
swapf _work,w; не воздействуя на флаги
retfie ; и возвращаемся в фоновую программу
В самом начале Программы 7.1 указано два вектора. По адресу h’000’, который является
В основной программе просто устанавливаются биты маски INTE и GIE для разрешения внешних прерываний, а также обнуляется счетчик посетителей EVENT. Расположенный далее бесконечный цикл представляет собой фоновые задачи процессора.