;Зaдача прежняя только добавим есчо одну кнопку чтобы была отктава.Будем использовать режим 1011 ССР1,при котором будет формироваться прерывание.Всё это есть в даташите.
LIST P=16F628A
INCLUDE P16F628A.INC
__CONFIG _INTOSC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_LVP_OFF
ERRORLEVEL -302
CBLOCK 20H
W_TEMP
STATUS_TEMP
COUNT
TEMP
ENDC
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
ORG 0
GOTO START
ORG 4
GOTO ISR
START MOVLW 7
MOVWF CMCON
BANK1
BCF TRISB,3
MOVLW B'11111111'
MOVWF TRISA
BANK0
;сбрасываем биты прерывания и регистр таймер1
INT_STOP BCF INTCON,GIE
BCF INTCON,PEIE
CLRF T1CON
BANK1
BCF PIE1,CCP1IE ;этот регистр находится в банке1
BANK0
;проверка кнопок
MAIN CLRF COUNT
MOVF PORTA,W
MOVWF TEMP
TEST RRF TEMP,F
BTFSS STATUS,C
GOTO INIT_CCP1 ;идем сюда,если какая нибудь из кнопок нажата
INCF COUNT,F
MOVLW 8
SUBWF COUNT,W
BTFSS STATUS,Z
GOTO TEST
GOTO MAIN
;инициализация модуля CCP1,TIMER1 и прерываний
INIT_CCP1 RLF COUNT,F
MOVF COUNT,W
CALL TABLE
MOVWF CCPR1L
INCF COUNT,F
MOVF COUNT,W
CALL TABLE
MOVWF CCPR1H
MOVLW B'00100001'
MOVWF T1CON
MOVLW B'00001011'
MOVWF CCP1CON
BANK1
BSF PIE1,CCP1IE
BANK0
BSF INTCON,PEIE
BSF INTCON,GIE
;проверка кнопок
TEST1 CLRF COUNT
MOVF PORTA,W
MOVWF TEST
LOOP RRF TEST,F
BTFSS STATUS,C
GOTO TEST1
INCF COUNT,F
MOVLW 8
SUBWF COUNT,W
BTFSS STATUS,Z
GOTO LOOP
GOTO INT_STOP ;выходим если кнопки отпущены
;процедура прерывания.Сюда будем попадать при совпадении CCPR1 и TMR1
ISR MOVWF W_TEMP ;сохраняем рабочий регистр
SWAPF STATUS,W ;сохраняем Status регистр
MOVWF STATUS_TEMP
BTFSS PIR1,CCP1IF;прерывание от совпадения?
GOTO EXIT_ISR ;нет,выходим из процедуры прерывания
BCF PIR1,CCP1IF;да,сбрасываем флаг прерывания от CCP1
BTFSS PORTB,3 ;на ножке порта Б единица?
GOTO SET_BIT ;нет,идём на установку
BCF PORTB,3 ;да,установим ноль
GOTO EXIT_ISR ;на выход
SET_BIT BSF PORTB,3 ;устанавливаем бит на ножке порта Б
;востанавливаем рабочий и статус регистры,выходим туда откуда вошли
EXIT_ISR SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;таблица значений,которые будем загружать в регистр сравнения CCPR1
TABLE ADDWF PCL,F
RETLW 51H
RETLW 02H
RETLW 11H
RETLW 02H
RETLW 0D7H
RETLW 01H
RETLW 0BCH
RETLW 01H
RETLW 8CH
RETLW 01H
RETLW 60H
RETLW 01H
RETLW 38H
RETLW 01H
RETLW 28H
RETLW 01H
END
НАЗАД Assembler AVR Си AVR ДАЛЬШЕ