Я хочу создать программу в сборке AVR, которая будет опроса состояния мгновенного кнопочного выключателя и переключения состояния светодиода при каждом нажатии переключателя. Я использую Arduino Duemilanove с чипом ATMega328P. У меня есть кнопочный переключатель, подключенный между цифровым выводом 0 и землей, и светодиод с резистором 330 Ом, подключенным между цифровыми выводами 8 и + 5 В. Вот мой код до сих пор:Создание тумблера в сборе AVR
;==============
; Declarations:
.def temp = r16
.org 0x0000
rjmp Reset
;==============
Reset:
ser temp
out DDRB, temp ; set all pins on Port B to OUTPUT mode
ldi temp, 0b11111110 ; set pin 0 on Port D to INPUT mode
out DDRD, temp
clr temp
out PORTB, temp ; clear temp and set all pins on Port B to LOW state
ldi temp, 0b00000001 ; set pin 0 on Port D to HIGH state
out PORTD, temp
;==============
; Main Program:
switch:
in temp, PIND ; get state of pins on Port D
cpi temp, 0 ; compare result to 0 (pushbutton is pressed)
brne PC+3 ; if != 0, go check again
ldi temp, (1<<PB0) ; otherwise, write logic 1 to pin 0 of Port B
out PINB, temp ; which toggles the state of the pin
rjmp switch
К сожалению, все это делает свет СИД и держать его на независимо от того, сколько раз нажимается кнопка. Я основываю этот код на программе, найденной here, которая включает светодиод на , пока кнопка нажата. Я просто хочу расширить это, чтобы удерживать светодиод в его текущем состоянии, пока кнопка не будет нажата снова. Какие-либо предложения?
Вы должны сравнить только 'PIND0' в '0', используя маску не весь' PIND'. Особенно, если ваш порт оставлен плавающим (освещение на диоде может изменить уровень плавающего штыря и сделать 'cpi temp, 0' всегда неправильным). Кроме того, вы можете использовать инструкцию 'SBI' для изменения отдельных битов в' PINB'. Не уверен, что это сработает, но на данный момент я не вижу других проблем. – Julien
Кнопки отскок. Это не имеет значения в примере кода, но в вашем случае вы получите случайные результаты, даже после намека @ Жюльена. – datafiddler
Я попытался окутать голову, как написать логику 1, чтобы просто PB0 с помощью 'sbi', но я не могу заставить его работать. Использование 'sbi PORTB0, 1' не дает ожидаемых результатов. Я вижу, что вы говорите об отказе кнопки. Может быть, подпрограмма задержки где-нибудь в главном цикле отменит коммутатор? –