Здравствуйте, задали написать программу - "Исходное состояние - все светодиоды погашены, при нажатии SA3 реализуются 2 бегущих светодиода от середины к краям и обратно с длительностью горения каждого светодиода 0,5 сек. SA4 – пауза/снятие с паузы. Во время паузы – звуковое сопровождение.". Реализовать с помощью таймеров и прерывания.Посидел, с помощью выданного примера - кое-что да написал, а что дальше не могу понять. Помогите пожалуйста.
Вот код
#include p16f873a.inc
__CONFIG _HC_OSC & _WDT_OFF ;
;объявление переменных
STAT1 EQU H'20' ;регистр состояния
GOTO BEGIN ;переход к настройке после включения
ORG H'004' ;вектор прерывания
GOTO INT ;переход к обработке прерываний
;начало основной программы
BEGIN: BCF STATUS,RP1 ;выбираем банк регистров 1
BSF STATUS,RP0 ;|
MOVLW B'00001110' ;задаем аналоговый вход PORTA,0
MOVWF ADCON1 ;программируем регистр АЦП 1
MOVLW B'00000001' ;PORTA,7-1 выходы, PORTA,0 вход
MOVWF TRISA ;программируем регистр направления PORTA
MOVLW B'11111111' ;PORTB,7-0 входы
MOVWF TRISB ;программируем регистр направления PORTB
MOVLW B'11000000' ;PORTC,7-6 вход, PORTC,5-0 выходы
MOVWF TRISC ;программируем регистр направления PORTC
MOVLW B'00000111' ;включение подтягивающих резисторов и предд. TMRO 1:256
BSF PIE1,TMR1IE ;разрешение прерывания TMR1
BSF PIE1,TRM2IE ;разрешение прерывания TMR2
BCF STATUS,RP0 ;выбираем банк регистров 0
MOVLW B'00110000' ;коэфф.деления предделителя 1:8
MOVWF T1CON ;|
MOVLW B'00000001' ;коэфф.деления предделителя 1:4
MOVWF T2CON ;|
CALL OFF ;сброс в исходное состояние
MOVLW B'11100000' ;биты GIE,PEIE,T0IE и INTE=1
MOVWF INTCON ;программируем регистр управления прерываниями
M10 GOTO M10 ;зацикливаемся здесь
;задаем режим работы таймера TMR1
T1S: MOVLW H'0B' ;задаем выдержку времени 8*(65536-3036)=500000
MOVWF TMR1H ;|
MOVLW H'DC' ;|
MOVWF TMR1L ;|
RETURN
;выключение светодиодов и пищалки
DL: CLRF PORTC ;гасим все светодиоды
CLRF PORTA ;выключаем пищалку
RETURN
;исходное состояние
OFF: CLRF STAT1 ;сброс регистра состояния
CLRF STATC ;сброс счетчика времени работы
BCF T1CON,TMR1ON ;выключение TMR1
BCF T2CON,TMR2ON ;выключение TMR2
CALL DL ;переход к выкл. светодиодов и пищалки
RETURN
;драйвер прерываний от таймеров
INT: BTFSS INTCON,T0IF ;проверка флага прерывания от таймера 0
CALL TMR0INT ;переход к обработке прерывания TMR0, если оно произошло
BTFSS PIR1,TMR1IF ;проверка флага прерывания от таймера 1
CALL TMR1INT ;переход к обработке прерывания TMR1, если оно произошло
BTFSS PIR1,TMR2IF ;проверка флага прерывания от таймера 2
CALL TMR2INT ;переход к обработке прерывания TMR2, если оно произошло
RETFIE
;обработка прерывания TMR0
TMR0INT:MOVF STAT1,F ;проверка регистра на 0
BTFSS STATUS,Z ;если не равен 0, то выйти
GOTO T0EX ;выход
BTFSS PORTB,4 ;скачок, если не нажата кнопка SA3
GOTO SA3 ;переход к обработке
BTFSS PORTB,2 ;скачок, если не нажата кнопка SA4
GOTO SA4 ;переход к обработке
GOTO T0EX ;выход
;обработка нажатия SA3
SA3: CALL SA3PR ;
GOTO T0EX ;
;обработка нажатия SA4
SA4: CALL SA4PR ;
;завершение обработки прерывания
TOEX: MOVLW D'60' ;
MOVWF TMR0 ;запись начального значения TMR0
BCF INTCON,T0IF ;сброс бита прерывания
RETURN