Перейти к содержанию

boomO

Members
  • Постов

    1
  • Зарегистрирован

  • Посещение

Электроника

  • Стаж в электронике
    Не связан с электроникой

Достижения boomO

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Здравствуйте, задали написать программу - "Исходное состояние - все светодиоды погашены, при нажатии 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
×
×
  • Создать...