Программа включения-выключения светодиода AVR в сборке с помощью кнопок

Я пишу ассемблерный код для ATMEL ATmega16, используя AtmelStudio 7. Я просто хочу, чтобы светодиод включался, когда я нажимаю кнопку, и я хочу, чтобы он выключался, когда я нажимаю ее снова. Точно так же, как комнатный свет. По какой-то причине этот код только включает свет и никогда не гаснет при нажатии кнопки (кнопка симулируется в протеусе). Может ли кто-нибудь помочь мне с этим простым кодом?

start:
    /* set the PIND2 data direction to 0 for input */
    /* This one simulates the key */
    ldi R16, (0 << PD2) ; Make PD2 as input
    out DDRB,R16    ; Configure the PIND2 as input

    /* set the PORTB7 data direction to 1 for output */
    /* this one causes the LED to be ON/OFF */
    ldi R17, (1 << PB7) ; Make PB7 as output 
    out DDRB,R17    ; Configure the PORTB7 as output

OFF_MODE:
    /* Put the PORTB7 to 0 */ 
    ldi R18,(0 << PB7)
    out PORTB,R18
    call delay
    /* Skip if PIN 2 in PORT D is set */
    sbis PIND,2
    jmp OFF_MODE    ; Branch to the OFF_MODE if the key isn't pressed yet

ON_MODE:
    /* Put the PORTB to 1 */
    ldi R18,(1 << PB7)
    out PORTB,R18
    call delay
    /* Skip if PIN 2 in PORT D is set */
    sbis PIND,2
    jmp ON_MODE ; Branch to the ON_MODE if the key isn't unpressed yet
rjmp start
delay:
    ldi r16, 0xFF
delay_loop_1:
    dec r16
    cpi r16, 0x00
    jmp delay_loop_1
ret

person hexpheus    schedule 03.04.2017    source источник


Ответы (1)


У вас есть бесконечный цикл в вашей функции delay. Разум, используя:

delay:
    ldi r16, 0xFF
delay_loop_1:
    dec r16
    brne delay_loop_1
    ret
person nopasara    schedule 03.04.2017