2017-04-03 6 views
0

Ich schreibe Assembly-Code für ATMEL ATmega16 mit AtmelStudio 7. Ich möchte nur eine LED einschalten, während ich eine Taste drücke und ich möchte es ausgeschaltet sein, wenn ich drücke es wieder. Genau wie ein Raumlicht. Aus irgendeinem Grund schaltet dieser Code nur das Licht ein und erlischt niemals mit dem Drücken der Taste (Taste wird im Proteus simuliert). Kann mir jemand mit diesem einfachen Code helfen?AVR LED-Ein/Aus-Programm in Assembly mit Tasten

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 

Antwort

1

Sie haben eine unendliche Schleife in Ihrer delay Funktion. Verstand unter Verwendung:

delay: 
    ldi r16, 0xFF 
delay_loop_1: 
    dec r16 
    brne delay_loop_1 
    ret 
+0

Dank. Gelöst! – aligholamee