;В схеме R1 - подтягивающий резистор PULLUP.Если кнопка не нажата на нём +5В,если кнопку нажать,то на резисторе будет 0В,и ток протекать будет через резистор очень маленький т.к. 5В делить на 10000 Ом = 0,0005А.
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
BSF TRISA,0 ;Бит 0 порта RA на вход
BCF TRISB,0 ;Бит 0 порта RB на выход
BANK0 ;Переход в Банк0
BCF PORTB,0 ;Выключаем светодиод
MAIN BTFSC PORTA,0 ;Проверяем на RA0 единица(кнопка нажата)?
GOTO MAIN ;Нет бесконечный цикл
BTFSS PORTB,0 ;Проверяем светодиод включен?
GOTO SETBIT ;Нет
BCF PORTB,0 ;Да.Выключаем светодиод
GOTO CHECK ;На проверку кнопки
SETBIT BSF PORTB,0 ;Включаем светодиод
CHECK BTFSS PORTA,0 ;Кнопка нажата?
GOTO CHECK ;Да
GOTO MAIN ;Нет.Всё начинается сначала
ISR ;Начало программы прерывания
RETFIE ;Выход из программы прерывания
END ;Конец программы
НАЗАД Assembler AVR Си AVR ДАЛЬШЕ