Interruptor de entrada con pantalla de siete segmentos con ARM 7

1

Estoy intentando detectar una entrada de interruptor para que, si se presiona el interruptor, se incremente un número en la pantalla de siete segmentos. Por ejemplo, si la pantalla de siete segmentos muestra 0 , y se presiona el interruptor, el SSD ahora mostrará 1 . Si se presiona de nuevo, mostrará 2 y así sucesivamente.

  • Mi pantalla de siete segmentos está conectada en P0.0 a P0.6
  • MI interruptor está en P0.9

¿Cómo puedo detectar cada vez que se presiona el interruptor? Estoy tratando de incrementar una variable k en mi programa para que cada vez que se presione el interruptor, k se incremente, y así podré realizar diferentes funciones cada vez que se presione el interruptor. Sin embargo, esta parte no funciona correctamente.

Estoy pensando en algo similar al siguiente programa. Sin embargo, debo pasar por alto algo, ya que solo el primer clic del botón está funcionando. Cuando se presiona el interruptor, 1 aparece en la pantalla. No pasa nada cuando se presiona de nuevo.

#include <LPC21xx.h>
#define a 0x00000001 
#define b 0x00000002
#define c 0x00000004
#define d 0x00000008
#define e 0x00000010
#define f 0x00000020
#define g 0x00000040


void small_delay (void);

void infinite (void);
int main (void)
{
int k = 0;
unsigned int SW1;

PINSEL0 = 0;                                //Set P0.0 - P0.15 as GPIOS
PINSEL1 = 0;                                //Set P0.16 - P0.31 as GPIOS
IO0DIR  = 0xFFFFFDFF;               //Setting  P0.9 as input for SW1     

while (1)
{

    SW1 = IO0PIN & 0x00000200; //switch connected on P0.9

    if ( SW1 == 0x00000200 )        //when not pressed
    {   

    }

  if ( SW1 != 0x00000200 )  //when pressed      
    {
        k++;

        if (k == 1){
        IO0SET = b;                     
        IO0SET = c;                         //displaying number 1 

        }       

        else if (k == 2){

        IO0CLR = c; 
        IO0SET = a;
        IO0SET = b;
        IO0SET = g;                         //displaying number 2
        IO0SET = d;
        IO0SET = e;
        //small_delay();
            }
        }
    }
}

 void small_delay (void) 
 {
 unsigned int i, j;

 for (i=0; i<1000; i++)
 {  
    for (j=0; j<1000; j++)
     {
     }
 }
 }

Se agradecería cualquier sugerencia o sugerencia sobre lo que podría mejorar.

    
pregunta Rizzo

2 respuestas

3

Dos problemas que puedo ver. En primer lugar, cuando configura la pantalla para mostrar un 2, no borra primero la pantalla, por lo que todos los segmentos que estaban encendidos permanecen encendidos.

En segundo lugar, mi conjetura es que estás viendo problemas de rebote de contactos de conmutador. Cuando un interruptor o botón cierra los contactos toca, rebota, toca de nuevo, salta, etc. Esto puede durar varios milisegundos y parecerá un montón de pulsaciones de botón muy rápidas para el software.

Las técnicas para evitar esto se conocen como rebote, se pueden implementar en hardware (un filtro de paso bajo en el pin de entrada) o en software (esperar que el valor en la entrada permanezca estable durante un período de tiempo fijo) o una mezcla de ambos.

Para obtener detalles sobre cómo implementar este tipo de cosas, consulte google o busque aquí para hacer rebotes.

    
respondido por el Andrew
0
  

¿Cómo puedo detectar cada vez que se presiona el interruptor?

el sondeo frecuente o la interrupción será suficiente.

  

Sin embargo, esta parte no funciona correctamente.

porque el código es incorrecto. puede manejar solo 1 y 2. cualquier otra cosa, la pantalla no cambia. su código se ejecuta tan rápido que es probable que esté fuera del alcance.

la forma correcta de hacerlo es poner la rutina de visualización en una interrupción de temporizador.

    
respondido por el dannyf

Lea otras preguntas en las etiquetas