Pulsar varios botones en un teclado matricial?

#1
Hola a todos especialmente a quien pueda ayudarme , podria alguno mostrarme la manera de escribir un codigo en ccs para poder escanear la pulsacion simultanea de varios botones en un teclado matricial, estoy tratando de construir un teclado midi y solo me falta eso, espero puedan ayudarme... Muchas gracia ...
 
#2
Depende de como esté hecha la matriz hay pulsaciones simultáneas que no se pueden discriminar.
 
#3
Exacto. Puesto que vas a utilizar bastantes entradas, mira si te convence utilizar un expansor de puertos por SPI (añade dos puertos más al micro, 16 pines IO más, e indicador de cambio de estado por interrupcion, el mcp23s17), o puedes utilizar varios hex inverter con pin de enable en cascada, es decir, 8 pines desde el micro hacia la salida del hex inverter, y un pin mas desde el micro hasta el pin de enable del hex inverter.

Por ejemplo, con 13 pines del micro (8 lectura + 5 de control de enable, uno por hex inverter) puedes leer 8x5= 40 entradas... y por cada hex inverter mas, te consume un pin y lees 8 entradas mas.

Los codigos serían, habilitas el pin de enable de un hex inverter, lees todos los canales. Lo apagas. Habilitas el siguiente.... y así con todos.

---

Edito, al decir teclado midi pensaba en uno tipo organo con sus entradas independientes, considera si te interesa separar los pulsadores.

Un saludo.

Con esto no tendrías problemas de simultaneidad ninguna
 
Última edición:
#5
Hola Amigo, bueno puedes implementar una interrupcion con TMR, que ni bien una tecla es pulsada este se dispare, cuando es presionada otra tecla, chequear el valor de TMR, si tiene un valor acumulado < X entonces, se considera simultaneidad de teclas.
Cabe aclarar que, cuando comento de presionar una tecla y luego otra, me refiero al brevisimo tiempo que hay de accion entre una tecla y otra, cuando se presionan dos teclas simultaneamente, que nosotros no percibimos.:D
 
Última edición:
#6
Otra es por software para un teclado 4x4, ahunque se debe de hacer el escaneo de teclas manualmente sin uso de librerias.

- Se crea un array 4x4 o unidimencional de 16. Este array solo indica si una tecla está activa o no.
- Se hace el escaneo del teclado, activa una columna, lee la fila y determina si la tecla (pin) o teclas (pines) de la fila están activas; de ese modo rellena el array en la posición indicada con "1" (tecla on) o "0" (tecla off).
- La secuencia se hace con las cuatro columnas y 4 filas hasta rellenar el array.
- Con eso, ya se tiene cual o cuales teclas están pulsadas y determina que hacer leyendo el array.

Esto lo usé cuando hice un piano con pic y necesitaba saber más de una tecla pulsada, el método es más para un chip que se dedique a leer el teclado... no funciona con interrupciones (creo).

Saludos.
 
#7
Depende de como esté hecha la matriz hay pulsaciones simultáneas que no se pueden discriminar.
La intención es hacer andar esa matriz 8x8 de la foto polifonicamente por así decirlo, estoy trabajando con la libreria kbd.c pero solo deja presionar un botón a la vez habra manera de modificarla??



Explico..yo hasta el momento he podido conectar el pic al pc en simulacion co proteus, ya tengo los descriptores midi, pero en el teclado radica mi problema ya que uso la libreria kbd.c que no permite presionar mas de uno como podría modificar o crear una libreria nueva para darle ese uso??
 

Adjuntos

Última edición:
#9
puedes utilizar varios A/D y así puedes determinar cual se pulso según la caída de tensión y con una tabla indexada con valores de referencia para cada fila o columna claro seria laborioso ya que necesitarias todos los posibles valores A/D según las teclas que se estén pulsando, si pulsas una de la primera fila tiene una valor y si pulsas dos tiene otro y si pulsas todas etc...tendrías que calcular bien las resistencias según la cantidad de teclas por rama...saludos
 
#10
La intención es hacer andar esa matriz 8x8 de la foto polifonicamente por así decirlo, estoy trabajando con la libreria kbd.c pero solo deja presionar un botón a la vez habra manera de modificarla??
Básicamente use esto con el teclado en el puerto b:
Código:
unsigned char keys[4][4];
unsigned char cnt;
unsigned char i;
#ZERO_RAM

void main()
{
   set_tris_b(0xF0);
   port_B_pullups(0xFF);

   while(TRUE)
   {
      // Activa una fila
      output_b(~(1 << cnt));      
      
      // Lee la columna en busca de cambios
      for(i=0 ; i<4 ; i++){
         switch(i){
            case 0:
               keys[cnt][i] = input_state(PIN_B4);
               break;
            case 1:
               keys[cnt][i] = input_state(PIN_B5);
               break;
            case 2:
               keys[cnt][i] = input_state(PIN_B6);
               break;
            case 3:
               keys[cnt][i] = input_state(PIN_B7);
               break;
         }
      }
      
      // Siguiente fila
      cnt += 1;
      if(cnt > 3)
         cnt = 0;
         
      // Analiza array 4x4
      // ...
   }
}
El funcionamiento es simple... ya lo extiendes a 8x8 pero ten en cuenta que no está usando anti rebotes y otros trucos para evitar los falsos disparos en los pulsadores... eso ya lo adecuas en tu programa...

Saludos
 
Arriba