;Если нажать на кнопку и отпустить,то загорится светодиод.Если повторно нажать и отпустить,то светодиод погаснет.
LIST P=16F628A
INCLUDE P16F628A.INC ;Включение файла .INC
;Конфигурация контроллера
__CONFIG _INTOSC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_LVP_OFF
ERRORLEVEL -302 ;Чтобы небыло сообщения про банки
CBLOCK 20H ;С адреса 20Н начало Регистров Общего Назначения
ENDC ;Конец блока Регистров Общего Назначения
BANK0 MACRO ;Макрос Банка0
BCF STATUS,RP0 ;Скидываем бит выбора банка
BCF STATUS,RP1 ;Скидываем бит выбора банка
ENDM ;Конец макроса
BANK1 MACRO ;Макрос Банка1
BSF STATUS,RP0 ;Подымаем бит выбора банка
BCF STATUS,RP1 ;Скидываем бит выбора банка
ENDM ;Конец макроса
ORG 0 ;Адрес начала кода
GOTO START ;Идём на 0
ORG 4 ;Адрес начала подпрограммы прерывания
GOTO ISR ;Идём на 4
START MOVLW 7 ;В WREG 0000 0111
MOVWF CMCON ;Отключаем компаратор
BANK1 ;Переход в Банк1
MOVLW 0 ;В WREG 0000 0000
MOVWF TRISA ;PORTA на выход
MOVLW 0xFF ;В WREG 1111 1111
MOVWF TRISB ;PORTB на вход
MOVLW 0 ;Подключаем подтягивающие резисторы
MOVWF OPTION_REG ;Таймер от внутреннего генератора
BANK0 ;Переход в Банк0
MOVLW .255 ;В WREG 1111 1111
MOVWF PORTA ;Тушим светодиод
MAIN MOVF PORTB,W ;Читаем PORTB
BTFSC PORTB,0 ;Проверяем бит 0 в PORTB
GOTO MAIN ;Если кнопка нажата,то пропустим
BTFSS PORTA,0 ;Светодиод горит?
GOTO SETBIT ;Да,выключем 1-цей
BCF PORTA,0 ;Нет,включим 0-ом
GOTO CHECK ;Идём на проверку кнопки
SETBIT BSF PORTA,0 ;Сюда попадём если светодиод горит
CHECK BTFSS PORTB,0 ;Кнопка нажата,т.е. 0 или 1 на PORTB,0
GOTO CHECK ;Если 0,то бесконечный цикл
GOTO MAIN ;Если 1,то всё сначала
ISR ;Начало программы прерывания
RETFIE ;Выход из программы прерывания
END ;Конец программы