Cómo cablear / conectar un teclado de membrana 4x3

0

Seguí este ejemplo para conectar mi teclado a mi placa de descubrimiento STM32F4. Sin embargo, de cualquier manera que leo datos en los pines, sigo obteniendo los mismos datos, lo que me lleva a creer que conecté algo mal.

Aquí está la imagen de cómo lo conecté:

Lalínearoja(+)eneltableroestáconectadaaunpinde+5VenmiSTM32F4ylaazul(-)estáconectadaaGNDenmitableroSTM32F4.

Losprimeros4cablessonparalasfilasalasqueseconectandirectamentelalíneayo+yjustodespuésdeellosseconectanconcablesalospinesde4-7comosemuestraenlasiguienteimagen:

También lo probé ahora cableando el teclado a +5. De todos modos, sigo obteniendo la siguiente salida de mis pines: 1 1 0 1 1 1 1 Lo que significa que todos, excepto el Pin 3, están devolviendo 1 (Alto).

En cuanto al código, inicializo todos los pines para ENTRADA, así que estoy leyendo el valor del PIN. Tengo resistencia ARRIBA / ABAJO configurada en NOPULL. Sin embargo siempre es esta salida.

¿Cuál es la forma correcta de conectar / conectar estos teclados?

Pregunta ampliada:

Conecté los 7 pines a mis pines GPIO.
- Puse las 4 filas en ALTO 1
- Configuré las 3 columnas en LOW + PULL DOWN + Input

Ahora, cuando leo el estado de todos los pines, obtengo: 1111 para los pines de salida y para los pines de entrada, obtengo 000 y cuando presiono un botón en el teclado, la columna correspondiente forma uno de los 000 a 1.

El problema es que esto solo me dice qué columna está seleccionada, cómo puedo saber qué fila está seleccionada si todas están configuradas en 1.

Mi código:

void start_clocks();
void init_outputs();
void init_inputs();

volatile int a, b, c;
volatile int e, f, g, h;

void main(void)
{
  // Start clocks
  start_clocks();

  // Configure outputs
  init_outputs();

  // Configure inputs
  init_inputs();

  // Configure abc
  a = -1; b = -1; c = -1; 

  e = -1; f = -1; g = -1; h = -1; 

  while(1)
  {
    a = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_11);
    b = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9);
    c = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_7);

    e = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
    f = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11);
    g = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_15);
    h = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_13);
  }  


}


void init_inputs()
{
  GPIO_InitTypeDef Keypad;

  Keypad.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_9|GPIO_Pin_7;
  Keypad.GPIO_Mode = GPIO_Mode_IN;
  Keypad.GPIO_OType = GPIO_OType_PP;
  Keypad.GPIO_PuPd = GPIO_PuPd_DOWN;
  Keypad.GPIO_Speed = GPIO_Speed_100MHz;

  GPIO_Init(GPIOE, &Keypad); 


}


void init_outputs()
{
  GPIO_InitTypeDef Keypad;

  Keypad.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_11;
  Keypad.GPIO_Mode = GPIO_Mode_OUT;
  Keypad.GPIO_OType = GPIO_OType_PP;
  Keypad.GPIO_PuPd = GPIO_PuPd_UP;
  Keypad.GPIO_Speed = GPIO_Speed_100MHz;

  GPIO_Init(GPIOB, &Keypad);

  Keypad.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_13;

  GPIO_Init(GPIOE, &Keypad);


  GPIO_SetBits(GPIOB, GPIO_Pin_13);
  GPIO_SetBits(GPIOB, GPIO_Pin_11);

  GPIO_SetBits(GPIOE, GPIO_Pin_15);
  GPIO_SetBits(GPIOE, GPIO_Pin_13);
}

void start_clocks()
{
  // Start clocks for GPIO B and GPIO E
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOB, ENABLE);
}
    
pregunta Sterling Duchess

1 respuesta

1

Tienes que sondear las filas una a la vez. Ajuste el voltaje alto en solo una fila a la vez. Después de intentar cada fila, habrá visto un máximo en una sola columna. La combinación de la fila activa y la columna de respuesta le indica qué botón se presiona.

    
respondido por el RedGrittyBrick

Lea otras preguntas en las etiquetas