Matriz 8x32 Scroll (Ampliable)

Por la cantidad de comentarios y pedidos que me han llegado para ampliar la matriz de 8x8 del siguiente post: http://electgpl.blogspot.com.ar/2013/11/matriz-8x8-mensaje-con-desplazamiento.html
He decidió darle una actualización y expandir la cantidad de matrices de 8x8 concatenadas para lograr un buen tamaño que se pueda leer bien.
En este caso he optado por 4 matrices de 8x8 multiplexadas, el núcleo del programa es el mismo que el del post de la matriz de 8x8, por lo que sigue con la misma simplicidad de código para su facilidad de compresión, solo que en este caso por un tema de cantidad de pines necesarios estamos obligados a expandir los puertos del microcontroaldor, por lo que he implementado el registro de desplazamiento 74595, es un registro con entrada serie y salida paralelo, funciona igual que el registro 74164 o CD4094 (podemos recordar en este post http://electgpl.blogspot.com.ar/2013/10/registro-de-desplazamiento-74164-con-ccs.html el funcionamiento del registro 74164). La diferencia del 74595 con los otros dos, es que ademas de ser un registro de desplazamiento el cual debemos ingresar un dato y sincronizarlo con un clock, se le suma un latch o memoria, el cual mantiene el dato en la salida independientemente de lo que suceda en los filpflop D del registro.
Esto nos juega a favor, ya que en el 74164 cuando queríamos enviar una serie de bits para convertirlos en un dato paralelo (por ejemplo para controlar displays de 7 segmentos), al no poseer el latch se podía ver en los leds de los segmentos el proceso de transición de bits desde el primero al ultimo ingresado de forma serial, hasta que se completara la conversión a paralelo y quedara estático. 
Con el Latch realizamos la misma acción pero hasta que no se completa la conversión a paralelo no enviamos el valor a las salidas, por lo que los displays quedarían apagados y una vez que tenemos el valor paralelo activamos el latch y el valor pasa hacia la salida encendiendo correspondientemente los segmentos en lugar de que se vea el proceso de conversión mientras este sucede.
El latch también funciona como memoria, es decir una vez que se activa y el dato pasa a las salidas quedaran ahí indefinidamente hasta que cambiemos los datos en los flipflop de conversión y volvamos a activar nuevamente el latch.
Para esto tenemos un control mas que en el 74164 que es el Latch, por ende ahora tendremos Data, Clock y Latch, de todas formas siguen siendo pocos pines de control en el circuito.

El circuito como podremos ver es mas complejo producto de la necesidad de un integrado 74595 por cada matriz, estos 4 registros de desplazamiento se conectaran concatenados, es decís la salida del primero sera la entrada del segundo y así sucesivamente.
Luego el control de Clock y Latch sera común para todos los integrados.
Una característica extra de este registro de desplazamiento es que posee una mayor corriente de salida que los otros todos mencionados, por lo cual nos dará como resultado una matriz de leds mas brillante (este se debería acompañar de un driver de transistores a la salida del microcontrolador si quisiéramos aprovechar esta potencia).



Aquí les dejare un gif animado del firmware funcionando en la simulación (no tengo las matrices y todos los 74HC595). Tengan en cuenta que el gif no es muy fiel como un vídeo y por ende se pueden ver algunos parpadeos que en realidad no existen.


En este programa se han realizado algunas mínimas modificaciones de lo que era el programa de matriz de 8x8 que vimos anteriormente.
Se ha implementado el uso del registro de desplazamiento externo, por lo que he creado dos funciones, una para inicializar el 74595 y otra para incrementar el clock del mismo.
Como podemos ver se utilizan tres macros para asignar pines que en este caso he utilizado las primeras tres del puerto A, pero podríamos usar cualquiera.
Luego veremos la funcion f74595_init() que lo que hace es enviar un 1 al dato, luego un pulso de clock y luego un 0 al dato, esto es necesario porque recordemos que el registro de desplazamiento desplaza los bit que se ingresan de forma serie en un arreglo de flipflop concatenados, entonces con ingresar un solo bit en 1 y luego dejarlo a nivel bajo, con el uso del clock ese 1 se desplazara por todos los flipflop internos y por ende por todas las salidas, lo que creara un contador en anillo (similar al integrado 4017).
Esta función la llamaremos siempre que repitamos la función de refresco de pantalla, por ello se encuentra en el for de refresco. (este for realiza 24 refrescos de pantalla).
La función f74595_clock() lo único que hace es incrementar el clock y a su vez el latch ya que no solo queremos que el dato se desplace de un flipflop al otro sino también que pase a la salida sino no tendría sentido. Esta función se llamara en el lazo for donde barremos las columnas.
En el programa de la matriz de 8x8 realizábamos esta acción pero utilizando una mascara de bits que hacia referencia a un vector de 8 bit. En este caso no podemos usar esa mascara porque necesitaríamos 32bit y el microcontrolador solo maneja 8 en sus puertos.
Por ultimo, algo que habrán notado a primera vista, es que el vector donde se alojan los bits que se mostraran en la matriz para conformar una frace, ya no están en forma binaria "0b00000000" sino que están en forma decimal, que es lo mismo pero ocupa menos espacio en cuanto a la lectura nuestra, para el microcontrolador es lo mismo.
Por ello ahora como nuestra matriz tiene 32 columnas, necesitamos 32 espacios vacíos para que el mensaje comience desde la primera linea, para ello hay 32 ceros como podemos ver.
Luego viene el mensaje que esta también en decimal para que ocupe menos espacio y así le asignamos un renglón por cada letra.
Las letras están realizadas con tres columnas solamente para simplificar al máximo el programa, pero lo ideal seria usar por lo menos 5 columnas para que se pueda formar una letra como lo exija el estándar ascii.
Es un programa muy simple que no pasa el 10% de la memoria del PIC16F628A, por lo que es muy bueno para utilizar en casi cualquier microcontrolador.
Como en todo programa existen mejoras, en este caso podríamos realizar un vector de header y otro de trailer donde se alojen los primeros 32 columnas en cero, para que no moleste con nuestra frase, y luego llamarlos al inicio y al fin de la lectura del vector principal.
También podríamos crear las letras del alfabeto en forma de vectores o estructuras como para escribir la frase en un string y que automáticamente llame a las letras, esto nos ahorraría mucho código. Son algunas mejoras que se podrían implementar rápidamente pero que hacen al programa mas complejos, y lo principal es que uno logre entender la técnica de multiplexado, frames de pantalla, scroll y ahora sumamos registros de desplazamiento. Por ello me parece mejor dejar este programa hasta aqui, y mas adelante hacer uno con un alfabeto pre-grabado y demás.


  1. #include <16F628A.h>
  2. #FUSES NOWDT, HS, NOPUT, MCLR
  3. #use delay(clock=20000000)
  4. #define LARGO  56
  5. #define DATA   PIN_A0
  6. #define CLOCK  PIN_A1
  7. #define LATCH  PIN_A2
  8. void f74595_init(){
  9.    output_bit(DATA,1);
  10.    output_bit(CLOCK,1);
  11.    output_bit(DATA,0);
  12. }
  13. void f74595_clock(){
  14.    output_bit(CLOCK,1);
  15.    output_bit(CLOCK,0);
  16.    output_bit(LATCH,1);
  17.    output_bit(LATCH,0);
  18. }
  19. int const tabla[LARGO+64]={
  20. 0,0,0,0,0,0,0,0,  //8 espacios
  21. 0,0,0,0,0,0,0,0,  //8 espacios
  22. 0,0,0,0,0,0,0,0,  //8 espacios
  23. 0,0,0,0,0,0,0,0,  //8 espacios
  24. 255,137,129,0,    //Letra E
  25. 255,128,128,0,    //Letra L
  26. 255,137,129,0,    //Letra E
  27. 126,129,129,0,    //Letra C
  28. 1,255,1,0,        //Letra T
  29. 126,129,241,0,    //Letra G
  30. 254,17,14,0,      //Letra P
  31. 255,128,128,0,    //Letra L
  32. 0,0,              //2 espacios
  33. 255,6,255,0,      //Letra M
  34. 254,17,254,0      //Letra A
  35. 1,255,1,0,        //Letra T
  36. 255,25,230,0,     //Letra R
  37. 255,0,            //Letra I
  38. 231,24,231,0,     //Letra X
  39. 0,0,0,0,0,0,0,0,  //8 espacios
  40. 0,0,0,0,0,0,0,0,  //8 espacios
  41. 0,0,0,0,0,0,0,0,  //8 espacios
  42. 0,0,0,0,0,0,0,0   //8 espacios
  43. };
  44. void main(){
  45.    int i,j,k;                          //Variables contadores
  46.    while(TRUE){                        //Ciclo infinito
  47.       for(i=0;i<LARGO+32;i++){         //Recorrido de tabla
  48.          for(k=0;k<24;k++){            //Refresco de matriz
  49.             f74595_init();             //Inicializa 74595
  50.             for(j=0;j<32;j++){         //Barrido de Columnas
  51.                f74595_clock();         //desplaza las columnas
  52.                output_b(~tabla[j+i]);  //Desplazamiento de tabla
  53.                delay_us(20);           //Demora de multiplexado
  54.             }
  55.          }
  56.       }
  57.    }
  58. }

La matriz a emplear es del tipo 8x8 con matriz de leds, es decir, estarán internamente conectados los ánodos por un lado y los cátodos por el otro formando filas y columnas. 
Dependiendo del tipo de matriz, marca, color, tamaño, etc... es posible que el pinout difiera entre una y otra, por ende hay que tener en cuenta el datasheet de la matriz que tenemos disponible.
A continuación mostrare la interconexión interna de los leds en la matriz y el pinout correspondiente para una matriz de 2cm de lado.


Como podemos ver, hay dos diagramas, esto es otro punto a tener en cuenta, ya que se podría decir que en uno esta en Cátodo común y en otro en Ánodo común, aunque esto no es así ya que esa terminología aplica para los display de 7seg por ejemplo. En este caso vemos que los leds van para un lado o para el otro, esto nos juega a favor o en contra dependiendo del hardware que la controla, es decir. El 74HC595 soporta tanto un 0 como un 1 a su salida, ya que es a demanda por software, pero si queremos usar un driver ULN2803 por ejemplo, este es openColector, por ende debemos elegir bien la matriz a utilizar.
En mi caso me ha pasado que tras probar firmware con matrices de leds, algunas las tengo en "ánodo común" y otras en "cátodo común" y esto cambia todo, ya que la frase en lugar de ir de derecha a izquierda termina yendo de arriba hacia abajo y en negativo tal vez... para corregir esto, he re codificado el firmware para que solamente se cambie el programa y no exista la necesidad de modificar el hardware, es decir tengan la matriz que tengan les tiene que funcionar, al menos a mi me ha dado resultados.

  1. #include <16F628A.h>
  2. #FUSES NOWDT, HS, NOPUT, MCLR
  3. #use delay(clock=20000000)
  4. #define LARGO  56
  5. #define DATA   PIN_A0
  6. #define CLOCK  PIN_A1
  7. #define LATCH  PIN_A2
  8. void f74595(int x){
  9.    output_bit(DATA,x);
  10.    output_bit(CLOCK,1);
  11.    output_bit(CLOCK,0);
  12.    output_bit(LATCH,1);
  13.    output_bit(LATCH,0);
  14. }
  15. int const tabla[LARGO+64]={
  16. 0,0,0,0,0,0,0,0,  //8 espacios
  17. 0,0,0,0,0,0,0,0,  //8 espacios
  18. 0,0,0,0,0,0,0,0,  //8 espacios
  19. 0,0,0,0,0,0,0,0,  //8 espacios
  20. 255,137,129,0,    //Letra E
  21. 255,128,128,0,    //Letra L
  22. 255,137,129,0,    //Letra E
  23. 126,129,129,0,    //Letra C
  24. 1,255,1,0,        //Letra T
  25. 126,129,241,0,    //Letra G
  26. 254,17,14,0,      //Letra P
  27. 255,128,128,0,    //Letra L
  28. 0,0,              //2 espacios
  29. 255,6,255,0,      //Letra M
  30. 254,17,254,0      //Letra A
  31. 1,255,1,0,        //Letra T
  32. 255,25,230,0,     //Letra R
  33. 255,0,            //Letra I
  34. 231,24,231,0,     //Letra X
  35. 0,0,0,0,0,0,0,0,  //8 espacios
  36. 0,0,0,0,0,0,0,0,  //8 espacios
  37. 0,0,0,0,0,0,0,0,  //8 espacios
  38. 0,0,0,0,0,0,0,0   //8 espacios
  39. };
  40. void main(){
  41.    int i,j,k;                          //Variables contadores
  42.    while(TRUE){                        //Ciclo infinito
  43.       for(i=0;i<LARGO;i++){            //Recorrido de tabla
  44.          for(k=0;k<24;k++){            //Refresco de matriz
  45.             f74595(0);                 //Posiciona la primer columna
  46.             for(j=0;j<32;j++){         //Barrido de Columnas
  47.                f74595(j);              //desplaza las columnas
  48.                output_b(tabla[j+i]);   //Desplazamiento de tabla
  49.                delay_us(50);           //Demora de multiplexado
  50.             }
  51.          }
  52.       }
  53.    }
  54. }

Por ultimo les dejo un mapa de caracteres ASCII que les puede ser de utilidad a la hora de crear nuevos caracteres para formar palabras. Este mapa pertenece a los displays LCD de caracteres, y maneja el estándar de 5x7 puntos para crear el carácter.




69 comentarios:

  1. Hola es muy bueno tu proyecto ahora yo lo que quiero hacer son efectos ? se te ocurre de alguna manera me gustaria asi le agregamos una expansion mas !

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola, fíjate en este proyecto que hago algunos efectos, http://electgpl.blogspot.com.ar/2015/12/matriz-8x8-con-motivo-de-navidad.html
      Saludos!

      Eliminar
    2. Hola que tal, lo que sucede es que al modificar el programa para usar solo dos matrices 8x8 no logro que se pueda visualizar en el montaje en físico, no sé que pueda estar fallando, soy principiante en esto, agradezco si me puedes ayudar amigo.

      Eliminar
    3. Lo probaste con las 8 matrices y te anda, pero con dos no?
      El tema es que habría que ver si tus matrices son ánodo o cátodo común, y como están conectadas respecto a las filas y columnas, porque lamentablemente las matrices que se encuentran a la venta suelen diferir mucho de la conexión interna y eso hace que se vea mal el mensaje o que no se vea nada.
      Saludos.

      Eliminar
  2. ohhh esta buenisimo la verdad me encanto, consulta si quisiera que el mensaje se mueva de arriba hacia abajo? que cambiaria ?

    ResponderEliminar
    Respuestas
    1. Hola básicamente, hay que modificar el orden del desplazamiento del vector en donde están alojados los datos a mostrar, el barrido queda igual ya que es necesario por la configuración del hardware.
      Saludos!

      Eliminar
  3. Hola! está buenisimo el aporte.
    Necesito un poco de ayuda en la prog. en el aumento de filas con el 74595 , en la programación de usted es de columna, que modificación puedo realizar para el aumento de filas.
    Gracias.!
    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola, fíjate que hay dos programas, la diferencia entre ellos es en base al común de las matrices que se pueden usar, pero en realidad esa diferencia es cambiando las filas por columnas, de esa forma se logra utilizar las matrices con un común diferente.
      Pudiste probar ambos programas?
      Saludos!

      Eliminar
    2. No me funciona ya probe todas las formas de conexión de la matriz, probé los dos programas y no sale ninguna letra, sales cualquier cosa menos letras. alguna solución por favor

      Eliminar
    3. Entonces no es un tema de orientación de que sale a 90°, si te sale cualquier cosa, tenes que revisar el pinout de tu matriz ya que no son todas iguales, varían de acuerdo al fabricante, tamaño, color, etc... Tenes que buscar el datasheet de tu matriz y en función a el, conectar cada fila y columna, o bien, podes probar cada punto, poniendo un cable a masa de la matriz y el otro mediante una resistencia ir probando los pines restantes como para saber que pines le corresponden a ese punto de la matriz, luego de ello probando el resto podes saber que pin es fila y cual columna y su orden.
      Saludos.

      Eliminar
    4. pues solo he probado simulando en Proteus, todavía no he probado en fisico, y simulando no hay nada como en el gif que publicaste., porque será?

      Eliminar
    5. Debe ser una matriz diferente, proba rotar 180° la matriz una vez que la seleccionas en el proteus y luego pegala encima de la que tenes para que la reemplace con los pines invertidos.
      Saludos.

      Eliminar
    6. nada Doc. no sale ninguna letra..

      Eliminar
    7. Si tenes un correo electrónico te envió el archivo del proteus así lo ejecutas en tu PC.

      Saludos!

      Eliminar
    8. lpzelectronic@gmail.com
      que raro noc por que no ejecuta bien, vamos a ver si ejecuta bien con el tuyo, ahi te dejo mi correo.
      Salduos.

      Eliminar
    9. Ahí te mande el archivo y también lo subí al repositorio: https://sites.google.com/site/electgpl/storage/Matrix%208x32%2074595.7z?attredirects=0&d=1
      Saludos.

      Eliminar
    10. Si funciona el tuyo, estoy armando nuevamente desde el comienzo a ver si funciona nuevamente, gracia por el archivo.
      Saludos.

      Eliminar
    11. Por nada, entonces debe ser algún tema del proteus de las librerías de componentes.
      Saludos!

      Eliminar
    12. lo armé nuevamente y nada... que raro y tuyo funciona normal.. como dices, seguro debe ser alguna falla de proteus.
      Seguiré intentando.

      Eliminar
    13. Claro, debe ser un tema de configuración del proteus o de sus librerías.

      Saludos!

      Eliminar
    14. Amigo, probé lo que el archivo que me daste, y funciona bien en mi PC...
      Te cuento encontré una curiosidad, la ves pasada lo probé pero con "proteus portable" y esta ves con el "proteus instalado en mi PC" y funciona correctamente.
      Gracias por toda la información que nos ofreces.
      Saludos!

      Eliminar
    15. AA puede ser eso, a mi a veces las versiones portables no me andan bien del todo, tal vez alguna ruta o algo que queda mal.
      Buenísimo que ya te anda bien. cualquier cosa avisa.
      Saludos!

      Eliminar
  4. Amigo antes que nada te felicito por tu excelente trabajo ayudando a estudiantes como muchos de nosotros, muchas gracias. Me gustaría preguntarte una duda que no logro resolver. ¿Como podría aumentar el numero de "filas" para poder armar una matriz con el mismo concepto de arriba pero de 16x32?

    ResponderEliminar
    Respuestas
    1. Buen día! Gracias!! me gusta compartir los proyectos!, te comento, la mayoría de los carteles scroll funcionan en 8bit porque aprovechan la longitud de palabra del puerto que suele ser de 8bit para un micro de 8bit, hay otras técnicas como usar dos puertos de 8bit y partir el dato en dos, es decir, los 8bit MSB en un puerto y los 8bit LSB en otro puerto, asi es mas sencillo realizar lo que vos necesitas, pero tendrías que usar el doble de memoria ya que es el doble de grande. Hay otras opciones con conversores serial paralelo tipo el 74595, 74164, etc... o algún multiplexor que desees. Pero estos procesos demoran mas el programa, si tenes un programa muy justo en cuanto al tiempo te va a ir en contra.
      Saludos!

      Eliminar
  5. disculpa mi ignorancia intente armar la matrix led en proteus pero al conectar los terminales de la matriz ledd no me funciona no encienden los led en el ejemplo que subiste que disposición tiene la matriz Led ademas de eso, podria poner transistores a las salida del pic para lograr mas corrientes la idea es hacer una matriz de 8 x 48 disculpa las molestias y gracias

    ResponderEliminar
    Respuestas
    1. Hola como estas, podes usar drivers a la salida del micro para que te mas corriente, peor en el proteus no te va a cambiar nada, si no te esta funcionando en la simulación, es posible que tengas la matriz invertida y tengas que rotarla, o que la librería de componentes no sea la misma que en mi caso, si queres podes descargarte el proyecto de el siguiente link.

      https://sites.google.com/site/electgpl/storage/Matrix%208x32%2074595.7z?attredirects=0&d=1

      Saludos!

      Eliminar
    2. muchas gracias,he estado viendo el codigo la verdad esta barbaro he creado un nuevo alfabeto pero mi consulta es como hago apra que corran mas rapido osea que pasen mas rapido las palabras

      Eliminar
    3. Hola como estas?, podes reducir la demora de multiplexado que esta en 20us, proba bajándole a la mitad, o bien podes probar también reduciendo el refresco de matriz que esta en 24, bajando ese tamaño.
      Saludos!

      Eliminar
  6. Respuestas
    1. Buen dia, compilador CCS sobre IDE PICC (PCWH). Saludos!

      Eliminar
  7. Hola muy bueno tu blog aprendo mucho gracias
    Una pregunta acabo de conseguir una matriz 8x8 rgb y quiero aprovechar todo su potencial
    viendo este articulo se me ocurrió usar un registro de desplazamiento para cada color de la
    matriz y así combinar los colores podrías explicarme un poco como realizar esto o recomendarme otra forma de hacerlo muchas gracias.

    ResponderEliminar
    Respuestas
    1. Hola, Gracias!,
      Tengo una matriz aca de 8x8 RGB pero aun no tuve el tiempo para realizar el firmware, de todas formas es algo como lo que mencionas vos, lo ideal seria usar un registro de desplazamiento por cada color (tal vez un 74595) y luego realizar el proceso de control de cada registro, (tengo algunos post aqui sobre el 74595 y a matriz, solo hay que multiplicarlo por 3 y controlar cada una por separado, lo voy a tener en cuenta asi lo pruebo y lo publico!)
      Pero la solucion esta por ahi, los registros seriales y luego el control de cada registro en funcion del color.
      Claramente el array de datos a mostrar sera mas complejo ya que tenes que hacer tres array uno para cada color con los datos y luego recorrerlos rapidamente para que no se vea un parpadeo.
      Saludos

      Eliminar
    2. Ok entonces lo desarrollare de con un registro por cada color, estaría estupendo una
      publicación de matriz rgb muchas gracias por tu respuesta
      saludos

      Eliminar
    3. Si, es la mejor opción, de echo es el método que mas vas a ver en la red.
      Espero tener pronto la publicación RGB.
      Saludos!

      Eliminar
  8. Ola esta muy bueno, una pregunta me puedes dar el nombre del programa en el que realizaste el codigo para descargarlo gracias

    ResponderEliminar
    Respuestas
    1. Hola como estas, el compilador que use es el CCS y el IDE es PCWHD, te dejo el link a la version DEMO,
      http://www.ccsinfo.com/ccsfreedemo.php
      saludos!

      Eliminar
  9. buenas tardes muy buen post pero me queda una duda con las siguientes declaraciones que hiciste en el codigo espero me puedas resolver las dudas gracias un saludo desde Guatemala

    #define LARGO 56
    int const tabla[LARGO+64]
    for(i=0;i<LARGO+32;i++){ //Recorrido de tabla
    y por que haces dos programas diferentes

    ResponderEliminar
    Respuestas
    1. Hola como estas?, el valor constante 64, es porque hay 64 columnas en 0 (cero), fíjate que en l vector donde pones la palabra a mostrar hay 32 ceros al principio y 32 ceros al final, eso es para que cuando enciendas la matriz empiece apagada sin mostrar nada (son esos ceros) y luego el scroll comienza desde la columna de la derecha hacia la izquierda. Luego el valor 56 es porque el texto a mostrar ocupa 56 columnas, fíjate de contar las columnas usadas en el texto que puse de ejemplo.
      Hay dos programas porque uno esta echo para una matriz cátodo común y el otro para una matriz ánodo común, para que uses la que conseguis.
      Saludos!

      Eliminar
    2. a MUCHAS GRACIAS ya lo comprndi igual vi tu video tutorial en youtube y ai lo explicas todo exelente gracias por tu respuesta saludos

      Eliminar
    3. Buenisismo entonces! Por nada, Saludos!!

      Eliminar
  10. Saludos!!

    Gracias por la aportación, andaba buscando información al respecto puesto que quisiera implementar esta aplicación pero con una matriz cuadrada, formada de 4 matrices de led de 8x8, el corrimiento sería de arriba para abajo pero mi duda es, ¿al tener que manejar 16 líneas tendría que implementar dos micros?. La proyección de las letras sería igual que una matriz de 8x8.

    ResponderEliminar
    Respuestas
    1. Hola como estas?, lo que tenes que hacer es usar registro de desplazamiento (como en este caso el 74595) tanto para las filas como para las columnas, de esa manera podes expandir a 16x16, porque el micro al ser de 8 bit maneja esa palabra y manejar dos puertos tambien te podria servir pero tendria que ser rapido el micro para que no notes ningun sobresalto. Podes probar eso, usar un micro mas grande tipo un 16F883 que tenes mas puertos, y por ejemplo dedicar PORTB y PORTC a manejar las 16 filas, y despues con dos 74595 manejar las 16 columnas, a la vez manejar el 74595 desde algunos pines del PORTA. vas a tener que mover dos vectores simultaneos el del PORTB y PORTC.
      int const tabla1[LARGO+32]={...};
      int const tabla2[LARGO+32]={...};
      Te van a quedar dos vectores uno para cada puerto (el B y el C),
      Despues en el codigo
      while(TRUE){ //Ciclo infinito
      for(i=0;i<LARGO+16;i++){ //Recorrido de tabla
      for(k=0;k<24;k++){ //Refresco de matriz
      f74595_init(); //Inicializa 74595
      for(j=0;j<16;j++){ //Barrido de Columnas
      f74595_clock(); //desplaza las columnas
      output_b(~tabla1[j+i]); //Desplazamiento de tabla 1
      output_c(~tabla2[j+i]); //Desplazamiento de tabla 2
      delay_us(20); //Demora de multiplexado
      }
      }
      }
      }
      Fijate que donde decia 32 ahora dice 16 ya que es la mitad de las columnas, pero tenes dos tablas a mover, una en el port b y otra en el port c.
      Esto es a modo ejemplo, no lo he probado, pero es mas o menos asi lo que tenes que probar a ver si funciona, usando un micro mas grande como el pic16f883 y tal vez tengas que achicar los delay, como el de 20us, a un poco menos ya que tenes que mover datos en dos lugares.
      Saludos.

      Eliminar
    2. https://sites.google.com/site/electgpl/storage/Matriz%2016x16%202x74595.7z?attredirects=0&d=1

      Eliminar
    3. Saludos!!

      Bien, gracias por preguntar y por tu amable respuesta. La implementación la estoy haciendo sobre el msp430g2553, tengo dos puertos. En la solución que me comentas tendría que ocupar un micro con tres puertos, pero me interesa el registro de desplazamiento tanto para filas como para columnas.

      Entonces supongo que tendría que mandar en un vector la parte baja (8) y en otro la parte alta (8), con lo que podría hacer el movimiento de filas y columnas, añadiendo otros 595, aunque aquí me queda otra duda, serían dos 595 para el desplazamiento horizontal, columnas y otros dos para el vertical, filas, ¿no?. Las matrices se colocarían M1 junto M2, debajo de M1 quedaría M3 y de M2 la M4, las columnas de M1 y M3 se conectan así como las de M2 y M4. ¿Donde coloco los 595, en las filas?.

      Eliminar
    4. Hola, exactamente, tenes que mandar la parte alta en un 74595 y la parte baja en otro 74595. Podrias usar 4 74595 para controlar toda la matriz, los cuatro en cascada o de a dos para que sea mas sencillo el codigo, las 4 matrices tenes que interconectarlas como para que quede una unica matriz de 16x16, despues poner dos 74595 en "x" y otros dos en "y".
      Saludos.

      Eliminar
  11. Muchas gracias por tu blog.
    Yo estoy empezando en este mundo,y con estos blogs se aprende.
    yo me estoy montando una matriz de 7x32
    El código sería igual ,bastaría con acortar un poco las letras o tendría más trabajo del que yo pienso?.
    Muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola como estas?, básicamente si queres, podes dejar el mismo código y electricamente tendrías una fila menos, tendría que andar igual aunque no tengas conectada la octava fila.
      En el programa lo único que cambia es lo que mencionas vos, el tamaño de las letras que ahora se va a limitar a 7 filas en lugar de 8.
      Saludos.

      Eliminar
    2. Pero el valor máximo de una letra sería 164 ,no?
      En vez de 256

      Eliminar
    3. Con 7 bits el valor máximo es b1111111 = d127 ya que vas a usar solo 7 filas.

      Eliminar
    4. Ok,a eso me refería,muchas gracias por la aclaración y sigue compartiendo tus conocimientos

      Eliminar
    5. Por nada! cualquier consulta avisame!, Saludos

      Eliminar
  12. una consulta respecto a tu proyecto cuando he aumentado la cantidad de letras no se ve todo solo hasta cierta parte y vuelve hasta el comienzo el programa compila bien pero no da en proteus
    muchas gracias

    ResponderEliminar
    Respuestas
    1. Si claro, tenes que modificar tanto el vector (el largo) como también la lectura del vector en los lazos for que lo recorren, si no modificas el lazo for que lo recorre va a seguir cortando hasta el largo que tiene acá. Fíjate que hay una "constante" que se llama LARGO que ahora vale 56, tenes que cambiarle ese valor a tu nuevo valor para que se recorran todas las columnas extra que pusiste.
      https://www.youtube.com/watch?v=kCiVgYnKKcY
      Saludos!

      Eliminar
  13. amigo podrias darme un consejo yo hice un proyecto igual pero use el dspicp33ep256mu806 para el muestreo use un puerto de este micro lo conecte a un bufer 74hc245 y para el barrido use un 74hc154 y use 6 matrices de leds pero cuando quiero dejar el msj fijo se atenua notablemente el brillo de la matriz.

    ResponderEliminar
    Respuestas
    1. Hola, el problema debe ser en el muestreo o en el ciclo de trabajo del muestreo, ya que a veces segun como se programa ese muestreo se puede alterar el ciclo de trabajo y cuando dejas el mensaje fijo suele quedar un ciclo de trabajo bajo que atenua el brillo de los leds.
      Saludos.

      Eliminar
    2. bueno si eso pense pero si le doy un ciclo de muestreo inferior se ve un parpadeo y cuando le coloco un periodo de muestreo donde no se ve el parpadeo se atenua notablemente el brillo de las matrices

      Eliminar
  14. Hola Sebastian, como estás, pregunto desde Colombia, como hago para saber el código de las letras, he visto códigos que utilizan mas números, pero tu solo utilizas tres números y al final el cero,que operación realizas para saber el código, no es en binario. Gracias por tan buenos blogs, te agradezco por ayudarme con la pregunta. Osvaldo.

    ResponderEliminar
    Respuestas
    1. Hola porque los caracteres que estoy usando yo son solo de 3 columnas, por ello es que hay solo tres valores en decimal 0 a 255 correspondientes a los bits 00000000 de las columnas. Luego hay un 4 numero que es el 0 porque es un espacio, al final de cada letra.
      Podes hacer el caracter estándar que es de 5x7 o 5x8, usando 5 columnas por cada caracter, va a quedar mejor que con solo 3 columnas, lo he realizado así para simplificarlo al maximo. Si usas 5x8 vas a tener 5 numeros correspondientes al caracter + 1 numero mas que podria ser el 0 para dejar una columna de espacio. Podes poner mas de 1 columna de espacio entre caracter.
      Tengo que hacer un programa mejor donde se guarde el abecedario completo en 5x8 y el espacio sea del ancho de un caracter (5 columnas), pero aun no lo he realizado. También ese código va a necesitar mas memoria para alojar todas las letras.
      Saludos.

      Eliminar
    2. ah bueno, Gracias Sebastian, utilizaré el estándar entonces.Muchas Gracias.

      Eliminar
  15. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  16. Hola, agradezco de antemano, por tu excelente proyecto. Quisiera saber que tan difícil sería implementar este mismo prototipo, pero que la frase sea enviada desde un dispositivo externo, quizás por ejemplo como:

    1-Teclado PC [PS2 O USB]
    2-Teclado Matriz
    3-Dispositivo Móvil [Apoyado con Android(AppInventor)]

    Nuevamente muchas gracias por los aportes realizados.

    ResponderEliminar
    Respuestas
    1. Hola, yo no partiría de este proyecto para lo que pedís, porque este proyecto esta super simplificado utilizando un vector constante, si queres hacer mensajes dinámicos tenes que crearte todo el abecedario para poder utilizar a demanda cada letra y para recoger datos (por ejemplo desde UART) tenes que armar un buffer de memoria con los datos, no le va a dar la memoria a este microcontrolador para todo ello, hay que saltar a uno mas grande. Si usas PS2 o USB hay que saltar a un micro mucho mas grande, alguno de 32Bit ARM Cortex-M, o algo así.
      Saludos.

      Eliminar
  17. hola, gracias por el aporte, ya implemente en físico una matriz de 7x16 pero me sale la letra con sombra en cada letra y eso quisiera saber como lo puedo hacer para resolver ese detalle, gracias.

    ResponderEliminar
    Respuestas
    1. Hola, ese scream se debe a la frecuencia de barrido/multiplexado, tenes que probar diferentes refrescos de pantalla para que desaparesca ese efecto.
      Saludos.

      Eliminar
    2. for(k=0;k<24;k++){ //Refresco de matriz

      hola entonces tengo que juagar con el 24 ...aumentar o disminuir hasta desaparacer la sombras?

      Eliminar
    3. Tenes que probar, sinceramente no lo he probado yo, pero viene por ahi. Si bajas mucho el refresco de pantalla vas a ver parpadeos, proba bajando y subiendo los valores de refresco.
      Saludos.

      Eliminar