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
Dank. Gelöst! – aligholamee