Пт дек 06, 2019 22:22:46
#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
Пт дек 06, 2019 22:39:52
Пт дек 06, 2019 22:41:20
Пт дек 06, 2019 22:47:06
Пт дек 06, 2019 23:02:23
Пт дек 06, 2019 23:17:11
Пт дек 06, 2019 23:25:40
SA3PR: BSF STAT1,1 ;установка бита состояния
BCF STATUS,RP1 ;выбираем банк регистров 1
BSF STATUS,RP0 ;|
MOVLW D'50' ;
MOVWF PR2 ;
BCF STATUS,RP0 ;выбираем банк регистров 0
CALL SA3H ;обработка действий по нажатию кнопки SA3
CALL T1S ;запись начальных значений TMR1
BCF T1CON,TMR1ON ;включение TMR1
RETURN
;обработка действий по нажатию кнопки SA3
SA3H:
BSF PORTC,1
BSF PORTC,3
Пт дек 06, 2019 23:35:30
Пт дек 06, 2019 23:47:53
Сб дек 07, 2019 00:09:37
Сб дек 07, 2019 00:15:36
Сб дек 07, 2019 00:46:21
Сб дек 07, 2019 09:13:13
Сб дек 07, 2019 09:45:41
Как я понимаю, когда я нажму кнопку SA3, программа перейдёт
Сб дек 07, 2019 12:29:50
Сб дек 07, 2019 13:11:07
Сб дек 07, 2019 14:53:05