Формування сигналів керування й індикації, страница 2

-  Для того щоб сформувати частоту 0,6 Гц (Т=77640мкс). треба внести до таймеру початкове значення 4, преддільник з коефіцієнтом 16, та лічильник VDEL на 11.

-  Очікуємо тереривання від таймера.

-  Після того, як відбудеться переривання від таймера перевыряэмо чи була натиснута кнопка (RA3 = 1), якщо була натиснена змінюється значення RB4 на протележне.

Текст програми2:

; підключення файлу з описом стандартних констант і значень

#include p16f84.inc

; формування конфігураційного слова

            __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

; опис комірок пам'яті даних

            cblock 0x0C   ; починаючи з адреси 0x0C

                        W_TEMP       ; збереження W при виклику переривання

                        VDEL

                        STATUS_TEMP        ; збереження STATUS при перериванні

                        endc

; опис констант

init_porta        equ      b'00001000'    ; RA0 на вводу,інші вивід

init_portb       equ      b'00000000'    ; усі розряди на вивід

init_option      equ      b'00000011'    ; TMR0 рахує CLKOUT/16

init_intcon      equ      b'10100000'    ; переривання від TMR0

; початок програми

            org                  0          ; вектор скидання

            bcf                   INTCON, GIE ; заборона всіх переривань

            goto                 main    ; перехід на початок основної програми

; оброблювач переривання

int_start

            org                  0x04    ; вектор переривання

            movwf             W_TEMP       ; збереження W і STATUS

            swapf              STATUS, W

            movwf            STATUS_TEMP

            decfsz             VDEL,1

            goto                propusk

            btfsc                PORTA,3

            goto                propusk

            btfsc                INTCON,T0IF            ; переривання від таймера?

            goto                 tmr_int           ; перехід на оброблювач переривання

                                   ; при переповненні таймера

propusk           movlw b'00100000'    ; дозвіл переривань тільки від таймера

            movwf            INTCON

            goto                int_end           ; перехід на закінчення оброблювача

; оброблювач переривання від таймера

tmr_int

            bcf       INTCON, T0IF           ; очищення прапорця переповнення TMR0

            call      IntFreq            ; відновлення стану індикатора

int_end                       ; закінчення оброблювача переривання

            swapf              STATUS_TEMP, W  ; відновлення значень

            movwf             STATUS                     ; регістрів W і STATUS

            swapf              W_TEMP, F

            swapf              W_TEMP, W

            movlw             .34

            movwf             TMR0

            retfie               ; повернення з переривання

; підпрограма відновлення стану індикатора

IntFreq

            movlw             0x05

            xorwf              PORTB,1

            movlw            .11

            movwf            VDEL

            movlw            .34

            movwf            TMR0

            return

; підпрограма ініціалізації мікроконтролера

Init

            bsf                   STATUS, RP0            ; вибір банку 1

            movlw             init_portb       ; ініціалізація регістра TRISB

            movwf             TRISB^0x80