da-nie писал(а):надеялся на подтяжку внутри мк
А там подтяжка встроенная случайно не к плюсу питания?
К плюсу питания, естественно.
Для реализации опроса кнопок в варианте использования внутренних резисторов подтяжки кнопки нужно замыкать на "землю". Тогда при разомкнутой кнопке вывод будет в состоянии лог.1 за счет подтяжки внутренним резистором, а при замкнутой кнопке вывод будет с состоянии лог.0
zyhelman писал(а):имеется тинька 13, к ногам 2,3,7 подключены кнопки повешенные на VCC
Давайте я чуток подкорректирую.
Если у Вас кнопки подключены к выводам 2,3 и 7, то это означает, что кнопки подключены к линиям PB3, PB4 и PB2 соответственно.
Хорошо. Во-первых, кнопки должны быть подключены не к VCC, а к "земле".
А дальше так:
Код: Выделить всё
.include "tn13def.inc"
.cseg
.org 0x00
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp PCINT0_ ; PCINT0 Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TIM0_COMPA ; Timer0 CompareA Handler
rjmp TIM0_COMPB ; Timer0 CompareB Handler
rjmp WATCHDOG ; Watchdog Interrupt Handler
rjmp ADC_ ; ADC Conversion Handler
EXT_INT0: ; IRQ0 Handler
PCINT0_: ; PCINT0 Handler
TIM0_OVF: ; Timer0 Overflow Handler
EE_RDY: ; EEPROM Ready Handler
ANA_COMP: ; Analog Comparator Handler
TIM0_COMPA: ; Timer0 CompareA Handler
TIM0_COMPB: ; Timer0 CompareB Handler
WATCHDOG: ; Watchdog Interrupt Handler
ADC_: ; ADC Conversion Handler
reti
RESET: ldi R16, low(RAMEND) ;Инициализировать
out SPL,R16 ;указатель вершины стека
ldi R16,(1<<PB0)|(1<<PB1) ;Установить в рег.R16 биты 0 и 1
out DDRB,R16 ;Установить линии PB0 и PB1 в состояние "выход"
ldi R16,(1<<PB2)|(1<<PB3)|(1<<PB4) ;Установить в рег.R16 биты 2,3 и 4
out PORTB,R16 ;Включить резисторы подтяжки на линиях PB2,PB3 и PB4
; sbi/cbi PORTB,PB0 ;Определите начальное состояние выводов, управляющих полевиками
; sbi/cbi PORTB,PB1 ;
;Опрос кнопок
BUTTON: sbis PINB,PB2 ;Кнопка PB2 нажата?
rjmp PRESS_PB2 ;Если да, то переход на обработчик нажатия кнопки PB2
sbis PINB,PB3 ;Иначе кнопка PB3 нажата?
rjmp PRESS_PB3 ;Если да, то переход на обработчик нажатия кнопки PB3
sbis PINB,PB4 ;Иначе кнопка PB4 нажата?
rjmp PRESS_PB4 ;Если да, то переход на обработчик нажатия кнопки PB4
rjmp BUTTON ;Иначе возврат на опрос кнопки PB2
;Обработчик нажатия на кнопку PB2
PRESS_PB2:
;Подавление "дребезга"
sbis PINB,PB2 ;Кнопка PB2 нажата?
rjmp PRESS_PB2 ;Если да, то вернуться на опрос кнопки PB2
rcall DELAY300 ;Кнопка PB2 отпущена, вызвать подпрограмму задержки
;Подавление "дребезга" завершено
; Код, который должен выполниться при нажатии на кнопку PB2
rjmp BUTTON
;Обработчик нажатия на кнопку PB3
PRESS_PB3:
;Подавление "дребезга"
sbis PINB,PB3 ;Кнопка PB3 нажата?
rjmp PRESS_PB3 ;Если да, то вернуться на опрос кнопки PB3
rcall DELAY300 ;Кнопка PB3 отпущена, вызвать подпрограмму задержки
;Подавление "дребезга" завершено
; Код, который должен выполниться при нажатии на кнопку PB3
rjmp BUTTON
;Обработчик нажатия на кнопку PB4
PRESS_PB4:
;Подавление "дребезга"
sbis PINB,PB4 ;Кнопка PB4 нажата?
rjmp PRESS_PB4 ;Если да, то вернуться на опрос кнопки PB4
rcall DELAY300 ;Кнопка PB4 отпущена, вызвать подпрограмму задержки
;Подавление "дребезга" завершено
; Код, который должен выполниться при нажатии на кнопку PB4
rjmp BUTTON
;Подпрограмма задержки 0,3 секунды (300 мс)
DELAY300:
; Код продпрограммы задержки
ret
Вот простейшая программа опроса кнопок. Допишите сами начальную инициализацию выводов, к которым подключены полевики, допишите, какие действия должны выполняться в обработчиках нажатий на кнопки, а также допишите подпрограмму, реализующую задержку на 300 мс.
Чуть посложнее реализуется опрос кнопок по прерываниям, но тоже ничего супер трудного. В этом случае действия при нажатии на кнопку будут также выполнены в обработчике прерывания, при этом пока Вы раздумываете, на какую кнопку нажать, основная программа будет заниматься чем-нибудь общественно-полезным
