Das ist der Lik,"
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten"
Mein Quellcode
/*
* Tasten_1.asm
Das folgende Programm soll bei jedem Tastendruck eines
Tasters am Port D (egal welcher Pin) eine LED am Port B0
in den jeweils anderen Zustand umschalten:
*************************************************
Nun kann es natürlich sein, dass ein neuer Taster zunächst
überhaupt nicht prellt. Ist der Taster vom Hersteller nicht
explizit als 'prellfreier Taster' verkauft worden, besteht
aber kein Grund zur Freude. Auch wenn der Taster heute
noch nicht prellt, irgendwann wird er es tun. Dann nämlich,
wenn die Kontaktfeder ein wenig ihrer Spannung verliert
und ausleiert, bzw. wenn sich die Kontaktflächen durch
häufige Benutzung abgewetzt haben.
****************************************************
Entprellung
Aus diesem Grund müssen Tasten entprellt werden.
Im Prinzip kann eine Entprellung sehr einfach durchgeführt
werden. Ein 'Tastendruck' wird nicht bei der Erkennung der
ersten Flanke akzeptiert, sondern es wird noch eine zeitlang
gewartet. Ist nach Ablauf dieser Zeitdauer die Taste immer
noch gedrückt, dann wird diese Flanke als Tastendruck
akzeptiert und ausgewertet.
*/
;************************************
; Include datei
;************************************
.Include "m8def.inc"
;************************************
; Definition
;************************************
.def key_old = r3
.def key_now = r4
.def temp1 = r17
.def temp2 = r18
.equ key_pin = PIND
.equ key_port = PORTD
.equ key_ddr = DDRD
.equ led_port = PORTB
.equ led_ddr = DDRB
.equ LED = 0
;************************************
; I)nitialiesierung
;************************************
ldi temp1, 1<<LED
out led_ddr, temp1 ; Port B als Ausgang
ldi temp1, $00 ; Port D auf Eingaenge
out key_ddr, temp1
ldi temp1, $FF ; die pull up einschalten
out key_port, temp1
mov key_old, temp1 ; war kein taster gedruckt
;*************************************
; Programmstart
;*************************************
Start:
in key_now, key_pin ; Zustand der Taster holen
mov temp1, key_now ; ud in temp1 sichern
eor key_now, Key_old ; vorhergehenden Zustand XOR
mov key_old, temp1 ; jetzign Zustand für den nächsten
; Schleifendurchlauf als alten Zustand merken
breq Start ;
ldi temp1, $FF ; ein bisschen warten
wait1:
ldi temp2, $FF
wait2:
dec temp2
brne wait2
dec temp1
brne wait1
; nachsehen ob die Tast noch steht
in temp1, key_pin
and temp1, key_now
brne Start
in temp1, led_port ; der Zustande der LED umdrehen
com temp1
out led_port,temp1
rjmp Start