Autor Tema: Matriz de leds 5x7  (Leído 14713 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Matriz de leds 5x7
« Respuesta #15 en: 13 de Noviembre de 2006, 03:57:27 »
Hola. Antes que nada, recomiendo que actives las weak pull ups del puerto b.
La logica es esta:
Poner fila 1 en bajo(RB3) y las otras 3(RB0,RB1 y RB2) en alto y revisas las columnas <RB4:RB7>
Si el valor de <RB4:RB7> es distinto a 1111, significa que hay algo presionado. Sabiendo la fila actual y buscando el 0 presente, obtienes la tecla pulsada. Si <RB4:RB7> es 1111, pones en bajo la fila 2(RB2) y el resto(RB0,RB1 y RB3) en alto...y asi haces con las 4 filas. Una por una.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Matriz de leds 5x7
« Respuesta #16 en: 15 de Noviembre de 2006, 14:21:52 »
Como es eso de activar las weak pull ups del puerto b???

Como puedo hacer para manejar los pines con un vector, para poder recorrerlo mas facil con alguna estructura repetitiva??

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Matriz de leds 5x7
« Respuesta #17 en: 15 de Noviembre de 2006, 16:26:06 »
Hola.
Bueno, no programo micros en C, pero aca hice una rutina que te deberia servir.
Para justificarme un poco lo que hice, he hecho que la rutina admita multiple presion de teclas.

El codigo(hecho en CCS):

Código: C
  1. #include <16f84a.h>           //Modelo de PIC usado para este ejemplo
  2. #fuses XT,NOWDT,NOPROTECT,PUT //Fusibles: Oscilador <= 4Mhz, Perro Guardian Desactivado, Sin proteccion contra lectura, Demora al inicio activada
  3. #use delay (clock=4000000)    //Defino cristal 4Mhz
  4. #use standard_io(a)
  5. #use fast_io(b)
  6. #byte port_a=0x05             //Defino puertoA
  7. #byte port_b=0x06             //Defino puertoB
  8.  
  9. byte Tecla[15];               //Array de 16 bytes. Cada uno contiene la posible tecla pulsada.
  10. byte Cantidad;                //Variable que indicara la cantidad de teclas presionadas.
  11.  
  12.  
  13. void main(void)
  14. {
  15.  
  16. byte i,j,Temp;                      //Defino variables a usar...
  17.  
  18. set_tris_a (0b00000);               //puertoA todo como salida
  19. set_tris_b (0b11110000);            //<RB4:RB7> como entradas, <RB3:RB0> como salidas
  20. port_b_pullups(TRUE);               //Habilito Weak Pull Ups puerto b
  21.  
  22. port_a=0;                           //Inicializo puertoA cero
  23. do{                                 //loop
  24. port_b=0b00001110;                  //Fila 1 en bajo
  25. Cantidad=0;                         //Inicializo Cantidad teclas encontradas=0
  26. for(i=0;i<4;i++){                   //Recorro fila x fila
  27.   Temp=port_b;                      //Almaceno valor del puertoB en Temp
  28.   if (Temp < 240){                  //¿Hay algo presionado?
  29.     for(j=4;j>0;j--){               //Si. Busco columna por columna
  30.       if(!bit_test(Temp,7)){        //¿Columna con tecla presionada?
  31.         Tecla[Cantidad]= i*4+j;     //Si.Guardo el numero de tecla presionada en el array.
  32.         Cantidad++;                 //Incremento cantidad de teclas encontradas...
  33.       }                             //Cierro IF
  34.       rotate_left(&Temp,1);         //Rotacion para seguir con la proxima columna
  35.     }                               //Cierro FOR
  36.   }                                 //Cierro IF
  37.   rotate_left(&port_b,1);           //Rotacion para seguir con la proxima fila
  38. }
  39. if(Cantidad>0) port_a=Tecla[0]; else port_a=0;  //Si hay al menos una tecla presionada, mostrarla en puertoA(binario)
  40. }while(TRUE);                                   //Infinitamente reviso el teclado
  41. }                                   //Cierro main

Y te adjunto el programa y el esquema para simular en ISIS.
Saludos.
« Última modificación: 15 de Noviembre de 2006, 17:00:50 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Matriz de leds 5x7
« Respuesta #18 en: 15 de Noviembre de 2006, 21:38:08 »
Bien, entendi el procedimiento..lo hice funcionar...ahora simplemente tengo el problema para usar un vector....estoy haciendo esto:

int columna[4];
bit columna[0]@PORTB.0;
..................................
bit columna[3]@PORTB.3;

Pero me tira un error.....asi ke tenog ke hacer columna1, columna2 y keda medio largo..y feo el codigo.....alguna idea???

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Matriz de leds 5x7
« Respuesta #19 en: 18 de Noviembre de 2006, 04:30:55 »
Hola andros.
Disculpame, pero no entiendo realmente qué es lo que queres hacer.

Tal vez este link te ayude:

http://www.todopic.com.ar/foros/index.php?topic=14612.0

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Matriz de leds 5x7
« Respuesta #20 en: 19 de Noviembre de 2006, 17:50:19 »
Es mas o menos eso lo ke kiero hacer...salvo ke....
En el compilador que uso, para asignarle nombre a cada pin se hace:

bit nombre@para (PORTB.1 por ejemplo).

Ya que son 4 filas y 4 columnas, lo ideal seria tener un vector por filas y otro por columnas, entonces:

int fila[4]; (seria int o unsigned?)
bit fila[0]@PORTB.0;
bit fila[1]@PORTB.1;
bit fila[2]@PORTB.2;
bit fila[3]@PORTB.3;

y lo mismo con las columnas, pero me da este error al momento de compilar:

int fila[4];
bit fila[0]@PORTB.0;
        ^------
Error[1] C:\Proyectos\Teclado\Codigo.c 15 : Syntax error
 (The expression must be corrected. The marker ^------ shows
 the approximate position where CC5X gives up. The documentation
 should be checked if the cause is not obvious)

Ke en realidad no me dice nada.....

En el CCS se puede hacer esto??? Se podria decir ke la unica razon por la ke no me paso al CCS es por el tema de asignarle nombres a cada pin ke seguro se puede......