Detectar 5 pulsos con ATmega328P

Estoy intentando hacer lo siguiente:
1712846512872.png
Si se oprime el pulsador 1 aparece L, pulsador 2 aparece D, pulsador 3 aparece R, pulsador 4 aparece .
Además de esto se prende un el LED por cada pulsador, parpadeando con intervalos de 200ms (los LED permanecen parpadeando a medida que se oprime el siguiente pulsador, es decir, si se han oprimido tres pulsadores debe haber tres LED parpadeando).
Debe existir un quinto pulsador que, al oprimirlo 5 veces debe comenzar un conteo de uno en uno desde 0 hasta 19 (tiempos de 0.7 segundos), luego reinicia (apaga los LED y pone el display en cero), el punto decimal representa las decenas.
Si se activan 2 o tres pulsadores al tiempo se prenden todos los LED durante 1 segundo y luego se apagan, el display queda en cero.

Sin embargo no sé cómo puedo detectar el pulsador cinco presionado cinco veces y si se activan 2 o 3 pulsadores al tiempo.
¿Alguien sabe cómo se puede conectar con el código?
Este es el código que tengo, gracias.
Código:
INICIO:

    LDI R21, 0x00

    OUT DDRB, R21   ; Configura el puerto B como entrada (pulsadores)

    LDI R20, 0xFF

    OUT DDRC, R20   ; Configura el puerto C como salida (LEDs)

    OUT DDRD, R20   ; Configura el puerto D como salida (display)

    LDI    R25,0X00


CICLO:

    IN        R21,PINB

    BST        R21,0

    BRTS    PULSADOR1

    IN        R21,PINB

    BST        R21,1

    BRTS    PULSADOR2

    IN        R21,PINB

    BST        R21,2

    BRTS    PULSADOR3

    IN        R21,PINB

    BST        R21,3

    BRTS    PULSADOR4

    CALL    PARPADEO

    RJMP CICLO



; Rutinas para cada pulsador

PULSADOR1:

    LDI R20, 0xC7   ; Mostrar "L" en el display

    OUT PORTD, R20

    ORI    R25,0X01

    RJMP    CICLO



PULSADOR2:

    LDI R20, 0x21   ; Mostrar "D" en el display (binario: 00100001)

    OUT PORTD, R20

    ORI    R25,0X02

    RJMP CICLO


PULSADOR3:

    LDI R20, 0x2F   ; Mostrar "R" en el display (binario: 00101111)

    OUT PORTD, R20

    ORI    R25,0X04

    RJMP CICLO


PULSADOR4:

    LDI R20, 0x92   ; Mostrar "S" en el display (binario: 10010010)

    OUT PORTD, R20

    ORI    R25,0X08

    RJMP CICLO

  

PARPADEO:

OUT        PORTC,R25

CALL    RETARDO1

LDI        R28,0X00

OUT        PORTC,R28

CALL    RETARDO1

RJMP    CICLO




PULSADOR5:

    INC R26         ; Incrementar el contador de pulsos

    CPI R26, 5      ; Comparar el contador con 5

    BRNE CICLO  ; Saltar si el contador no es igual a 5


    LDI R20,0XC0

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0XF9

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0XA4

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0XB0

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X99

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X92

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X82

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0XF8

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X80

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X90

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X40

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X79

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X24

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X30

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X19

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X12

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X02

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X78

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X00

    OUT PORTD, R20

    CALL RETARDO2


    LDI R20,0X10

    OUT PORTD, R20

    CALL RETARDO2

    RJMP FIN_PULSADOR


FIN_PULSADOR:

    LDI R20, 0xC0 

    OUT PORTD, R20

    LDI R20, 0x00 

    OUT PORTC, R20

    RJMP CICLO

 

    


; Rutina para detectar múltiples pulsadores presionados

MULTIPULSADOR:

   LDI R21, 0xFF   ; Encender los LEDs

    OUT PORTC, R21

    CALL RETARDO3   ; Retardo de 200ms

    LDI R21, 0x00   ; Apagar los LEDs

    OUT PORTC, R21

    CALL RETARDO3   ; Retardo de 200ms

    RJMP CICLO      ; Vuelve al inicio del ciclo


; Rutinas de retardo

RETARDO1: ; Retardo de 200 ms

    ldi  r18, 9

    ldi  r19, 30

    ldi  r20, 229

L1: dec  r20

    brne L1

    dec  r19

    brne L1

    dec  r18

    brne L1

    nop

        ret


RETARDO2: ; Retardo de 0,7 segundos

    ldi  r18, 29

    ldi  r19, 105

    ldi  r20, 166

L4: dec  r20

    brne L4

    dec  r19

    brne L4

    dec  r18

    brne L4

        ret


RETARDO3: ; Retardo de 1 segundo

    ldi  r18, 41

    ldi  r19, 150

    ldi  r20, 128

L7: dec  r20

    brne L7

    dec  r19

    brne L7

    dec  r18

    brne L7

        ret
 
Última edición por un moderador:
Un poco liosa la explicacion pero dejame ver si entendi,supongo que dejamos de lado los primeros 4 pulsadores porque entiendo que esos ya hacen su funcion, no se mucho de arduino pero a ver si se entiende el concepto, necesitas que la entrada logica del pulsador 5 este verificando su estado, cada que su estado es alto agregara un valor de 1 a un bufer, mantendra la revision y cuando su estado vuelva a subir sumara un valor de 1 al bufer dando una suma de 2, y asi consecutivamente hasta llegar a 5, necesitas tener un bucle que verifique y agregue 1 al valor del bufer, necesitas que el bufer almacene el conteo que se le va agregando y necesitas un comparador que accione cuando el valor del bufer llegue a 5.
Por lo tanto necesitas esto:

Memoria(bufer)para el valor guardado por la suma de cada pulso.
Rutina de lectura de estado logico en entrada de pulsador 5.
Rutina de comparacion de valor de memoria(bufer) de entrada vs valor establecido para salida logica.
Rutina de suma para el valor de memoria(bufer)almacenado.
 
Atrás
Arriba