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

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

            movwf             TRISA^0x80

            movlw             init_option      ; ініціалізація регістра OPTION

            movwf             OPTION_REG^80h

            clrf                  STATUS         ; вибір банку 0

            movlw            0x01

            movwf            PORTB

            movlw            .11

            movwf            VDEL

            movlw            init_intcon      ; ініціалізація регістра INTCON,    movwf INTCON            ; ;дозвіл переривань

            movwf             INTCON

            return

; основна програма

main

            call                  Init      ; ініціалізація мікроконтролера

            movlw             .34

            movwf            TMR0

m1       goto                m1

            end                  ; кінець програми

Алгоритм програми3:

-  Ініціалізуємо контролер. Настроюємо PORTB на вивід, RA3 – на ввід, дозволяємо переривання від таймера. dig0=1, dig1=4, dig2=Б, dig3=Б. , dig4=A. , dig5=С.

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

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

-  Перевіряємо чи було переривання від таймера. Якщо так, то переходимо на обробчик переривання.

-  Читаєто, який сегмент виводити та код сегменту виводимо на PORTB. Виходимо з обробчика переривання та скидаємо прапор переповнення таймера.

-  Переходимо на очікування переривання від таймера.

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

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

#include p16f84.inc

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

            __CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

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

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

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

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

                        dig0     ; буфер на 6 розряди

                        dig1

                        dig2

                        dig3

                        dig4

                        dig5

                        segment          ; номер відображуваного розряду

                        endc

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

init_porta        equ      b'00000000'    ; RA2 на вводу,інші вивід

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

init_option      equ      b'00000100'    ; TMR0 рахує CLKOUT/32

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

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

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

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

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

            movwf             INTCON