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);
}