# ¿Como escribir letras y desplazarlas en matriz de 8x8 leds?



## djsaw1994 (Jun 17, 2012)

Hola, he seguido este tutorial http://www.ucontrol.com.ar/wiki/index.php?title=Matriz_de_LEDS_de_8x8
para crear la matrix de leds, lo he hecho identico, solo que envez de controlarlo con el pic PIC16F628A lo he controlado con un pic 16F877A
utilizando los mismos puertos y todo.
La matriz me funciona perfectamente con los programas que viene en el tutorial.

ahora estoy intentando crear mi programa para escribir letras y que se desplazen para un lado, y no se hacerlo.
Quisiera que alguien me emplicara o me pusiese un ejemplo de como plasmas en la matriz un letra (una letra cualquiera) y desplazarla hacia la izquierda para que se vea pasando. 

aqui dejo el codigo que lo unico que hace es encender todos los leds de la primera fila de arriba he ir bajando cuando llega abajo empieza de nuevo.


```
//Device/Fuses/Etc.---------------------------------
#INCLUDE <16F877A.H> 
#INCLUDE <MATH.H>
#FUSES NOWDT * * * * * * * * * *//No Watch Dog Timer
#FUSES XT * * * * * * * * * * * 
#FUSES NOPUT * * * * * * * * * *//No Power Up Timer
#FUSES NOPROTECT * * * * * * * *//Code not protected from reading
#FUSES NOBROWNOUT * * * * * * * //No brownout reset
#FUSES NOLVP * * * * * * * * * *//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD * * * * * * * * * *//No EE protection
#use delay(clock=4000000)
//Defines------------------------------------------
#BYTE PORTA = 0x05
#BYTE PORTB = 0x06
#BYTE PORTA_TRIS = 0x85
#BYTE PORTB_TRIS = 0x86
#DEFINE RDD_DATA *PIN_A1
#DEFINE RDD_CLOCK PIN_A0
#DEFINE EEPROM_SCL PIN_A2
#DEFINE EEPROM_SDA PIN_A3
//
void fConfigurar_puertos(void);
void fRDD_send_data0(void);
void fRDD_send_data1(void);
//--------------------------------------------------
//Main----------------------------------------------
//--------------------------------------------------
void main(){
 *int8 i,j;
 *fConfigurar_puertos();
 *output_low(RDD_CLOCK); //RELOJ = Bajo
 *output_low(RDD_DATA);
// 
//------Dibujo las filas una a una ----- *
//
 *while (TRUE){
 * * PORTB = 0b11111110; //Filas 1 encendida, las demas apagadas.
 * * for (i=0;i<8;i++) {
 * * * *for (j=0;j<8;j++) {
 * * * * * *fRDD_send_data0();
 * * * * * }
 * * * *delay_ms(200);
 * * * *PORTB = (PORTB <<1) +1;
 * * } 
// * 
 *}//Fin while
}//Fin main
//--------------------------------------------------
//- FUNCIONES-
//--------------------------------------------------
void fConfigurar_puertos(void){
 *PORTA_TRIS = 0b11000000; //1=ENTRADA, 0=SALIDA
 *PORTB_TRIS = 0b00000000; //1=ENTRADA, 0=SALIDA
 *setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 *setup_timer_1(T1_DISABLED);
 *setup_timer_2(T2_DISABLED,0,1);
 *setup_comparator(NC_NC_NC_NC);
 *setup_vref(FALSE);
}
//--------------------------------------------------
//---Envia un 0 al registro de desplazamiento:
//--------------------------------------------------
void fRDD_send_data0(void){
 *output_low(RDD_DATA); 
 *delay_us(2);
 *output_low(RDD_CLOCK);
 *delay_us(2);
 *output_high(RDD_CLOCK);
}
//--------------------------------------------------
//---Envia un 1 al registro de desplazamiento:
//--------------------------------------------------
void fRDD_send_data1(void){
 *output_high(RDD_DATA); 
 *delay_us(2);
 *output_low(RDD_CLOCK);
 *delay_us(2);
 *output_high(RDD_CLOCK);
}
```

pues eso en general me gustaria saber como modificar este codigo (creo que solo hay que modificar main() para mostrar una letra, de momento da igual el movimiento, solo la manera de imprimir una letra.
muchas gracias por adelantado


----------



## pablofer (Jul 3, 2012)

hola compañero del foro.
yo tambien ando en eso y estoy haciendo mi propio programita pero no lo termino todavi por que me falta aprender un poco mas a usar memorias i2c pero puedo ayudarte con esta pagina donde explica muy bien y facil como hacerlo y como usas lenguaje c no puedo ayudarte mucho ya que yo uso asm pero el concepto es lo principal .

http://www.taringa.net/posts/ciencia-educacion/8653811/matriz-de-led-8x8.html

ahi esta todo lo que nesesitas saber basicamente


----------



## andreshell (Oct 1, 2012)

Hola.
Soy nuevo en esto de matrices de leds y aun no  domino muy bien el tema. 
Estoy intentando aprender a usar el registro de desplazamiento.
Para empezar inicie con una matriz de 8x8 programando en asm con el PIC16F877A a 4MHz.
En fin, más o menos entendí como funciona el registro de desplazamiento.
El problema es que cuando voy a escribir algo en la fila 4 se me vuelve loco,
y me muestra algo totalmente diferente. En este caso deseo hacer una carita. 
Pero me quede en la cuarta fila. Aquí es donde deseo pedir su ayuda.

También quisiera saber si hay una forma más corta de hacer este código (en asm) 

Gracias de antemano.


----------



## Vergil (Feb 1, 2013)

Hola a todos los foreros como van espero que bien, pues les comento que que realice una matriz que usaba el barrido por columnas, pero al ampliarla el parpadeo era evidente y al bajar los tiempos de barrido la luminosidad  del led disminuye bastante.
Cambie para realizar el barrido por filas, pero surge lo siguiente algo que realmente no le he encontrado solucion, para desplazar el texto lo que realizo es:
1- Colocar el dato en los registros de desplazamiento.
2- Agregar los ceros que desplazan el texto fuera de la matriz.
3- Voy disminuyendo la cantidad de ceros para que el texto empiece a aparecer por la derecha hacia la izquierda.
Pero surge un problema, cuando ya no hay ceros que agregar, el texto queda en el centro de la pantalla, como si fuera estatico, Y ahora como termino de desplazar el resto de texto para sacarlo por la izquierda???, no se pueden agregar ceros antes del mensaje, ya que al hacerlo asi los datos sacan los ceros antes puestos.
La verdad no se si se puede realizar el desplazamiento completo, ya estoy por creer que no!
ademas debe haber una forma para aplicale ese algoritmo a cualquier  cantidad de letras, ya que si se personaliza para solo un mensaje pues es ineficiente..
Bueno esos es todo si leyeron hasta este lugar jejejeje gracias, quisiera saber si me pueden colaborar, si alguien ya desplazo diferentes cantidades de texto realizando el barrido por filas.... GRCIAS


----------



## proteus7 (Abr 28, 2013)

Vergil dijo:


> Hola a todos los foreros como van espero que bien, pues les comento que que realice una matriz que usaba el barrido por columnas, pero al ampliarla el parpadeo era evidente y al bajar los tiempos de barrido la luminosidad  del led disminuye bastante.
> Cambie para realizar el barrido por filas, pero surge lo siguiente algo que realmente no le he encontrado solucion, para desplazar el texto lo que realizo es:
> 1- Colocar el dato en los registros de desplazamiento.
> 2- Agregar los ceros que desplazan el texto fuera de la matriz.
> ...



mmm pues lo veo dificil por filas

el de este video es por columnas  y jala bien


----------



## Vergil (Abr 29, 2013)

Hola proteus7, hace ratico había escrito este foro, te comento que si pude realizar el barrido por filas, programando el mensaje por visual basic 2008, me llama la atención la programación por el teclado directamente te felicito, realizaste un muy buen trabajo.


----------



## rodri2222 (May 10, 2013)

Hola amigo Vergil:
Si se puede realizar el scroll del texto utilizando el barrido por filas. Yo hice hace mu*ch*o tiempo atrás un proyectito de estos, utilizando el pin STROBE del C.I. 4094


----------



## ATOCCSA (Ago 26, 2013)

ola disculpen soy estudiante y me fascina los microcontroladores quisiera poder hacer mi nombre en matriz de leds y hacerlas correr por favor necesito un tutorial en esto graciass


----------



## EME_JuanAndrade (Ago 26, 2013)

Hace tiempo realice un scroll y la forma que use para hacer el desplazamiento consistia en realizar la matriz del texto primero en una variable alojada enl a RAM (al que llame VRAM) y despues hacer una simple lectura secuencial.

Para efectos de presentación el barrido de exhibición lo hice vertical, es decir en filas de arriba a abajo. asi el tiempo de encendido era de 1/7 por exhibición.

Adjunto el programa, aunque solo sirva para estudio, puesto que es para un Atmega32 y no para un PIC.

Es muy lagro puesto que tambien integra el juego de caracteres, las instrucciones de edicion de cada mensaje y la exhibicion de la hora (usa un RTC).

Aclaro que el programa es mio excepto la rutina Xtract Bit que encontre en una pagina de internet que desafortunadamente no puedo citar y las rutinas de lectura del I2C que son parte de las rutinas integradas en CodevisionAVR. Sirvanse usarla libremente.


----------



## FrancoPachado (Mar 7, 2014)

hola, queria saber si no me podrian pasar algun programa para una matriz de leds en lenguaje assembler ya que quiero realizar uno de estos proyectos y necesito darme una idea, muchas gracias


----------



## dosekk (Abr 23, 2014)

Bueno, les comento, quiero hacer una matriz de leds como proyecto de una clase, he estado checando varios programas que han publicado en esta página y he estado investigando en varias páginas de como funciona una matriz de leds para darme una idea.
Para empezar con la programación decidí primero mostrar una letra en una pequeña matriz de 8x8 para darme una idea de como sería el programa, ya que pretendo hacer una matriz lo suficientemente grande para mostrar este texto [taller de investigación 1] pero ya empezaron los problemas, porque en la matriz de leds no se forma la palabra que yo quiero, en vez de eso encienden todos los leds.
Espero me puedan ayudar a encontrar el error de mi programa y darme algunas sugerencias de que y como podría hacer mi programa para que forme el texto y se desplace.
De antemano muchas gracias!

Aquí les dejo mi programa en ensamblador y la simulación!


----------



## Daniel Meza (Abr 23, 2014)

Ando revisando tu programa y lo que veo es que tu rutina de retardo es muuuy pequeña, intenta con un tiempo mayor. Otra cosa, no se si ese PIC tenga ADC pero en caso de que lo tenga es necesario configurar algunos registros para poder usar los puertos I/ como salidas digitales.

Te dejo un link para que calcules tu rutina de retardo.
http://www.golovchenko.org/cgi-bin/delay

Saludos


----------



## dosekk (Abr 24, 2014)

Ya investigue y creo que no tiene adc[conversor analógico-digital] y aumente el retardo y sigue en las mismas el programa, espero y me puedan seguir ayudando.

saludos


----------



## Saint_ (Abr 24, 2014)

dosekk, te comento que para una aplicación como la tuya es recomendable utilizar una interrupción temporizada de modo que esta se ocupe de manejar la matriz y se tenga disponible la rutina principal para otras tareas.
Este un ejemplo, fue hecho en MPLAX.

```
#include <p16f628a.inc>
    list      p=16f628a
;**************************************************************************
;Declaracion de constantes y variables
;**************************************************************************
#define ck          PORTA,0
#define dato        PORTA,1
carga_timer0        equ     .100 ;para que el timer0 se desborde en 2.5ms
n_columnas          equ     .8  ;columas de la matriz de leds igual a ocho
udata   0x20
w_temp              res 1           ;registro w temporal
status_temp         res 1           ;registro status temporal
n                   res 1           ;contador de propocito general
contador_columnas   res 1           ;contador para las columnas de la matriz
buffer              res n_columnas  ;reserva en la ram la cantidad de columas
                                    ;de la matriz
;**************************************************************************
    org     0x00
	goto    inicio
    org     0x04
;**************************************************************************
;Rutina de interrucion
;**************************************************************************
push
    movwf   w_temp
    swapf   STATUS,W
    bcf     STATUS,RP0
    movwf   status_temp

    btfss   INTCON,T0IF
    nop
    movlw   carga_timer0
    movwf   TMR0

    movlw   0xff
    movwf   PORTB               ;apaga la matriz de leds
    bsf     dato
    movfw   contador_columnas
    xorlw   0
    btfss   STATUS,Z
    bcf     dato
    bsf     ck
    nop
    bcf     ck
    movlw   buffer
    addwf   contador_columnas,W
    movwf   FSR
    movfw   INDF
    movwf   PORTB
    incf    contador_columnas
    movfw   contador_columnas
    xorlw   n_columnas
    btfsc   STATUS,Z
    clrf    contador_columnas
    bcf     INTCON,T0IF
pop
    swapf   status_temp,W
    movwf   STATUS
    swapf   w_temp,F
    swapf   w_temp,W
    retfie
;**************************************************************************
tabla
    addwf    PCL,F
    retlw    b'11111100'      ; letra t
    retlw    b'11111100'
    retlw    b'11111100'
    retlw    b'00000000'
    retlw    b'00000000'
    retlw    b'11111100'
    retlw    b'11111100'
    retlw    b'11111100'
inicio
;**************************************************************************
;Configuracion de puertos deentrada y salida
;**************************************************************************
    clrf    PORTA       ;borra el PORTA
    clrf    PORTB       ;borra el PORTB
    movlw   0x07        ;
    movwf   CMCON       ;desconecta los comparadores analogicos
    banksel TRISB       ;bank1
    clrf    TRISB       ;config. el puerto b como salidas
    clrf    TRISA       ;config. el puerto a como salidas
;**************************************************************************
;Configuracion del timer0
;**************************************************************************
    movlw   b'11110011'
    movwf   OPTION_REG  ;prescalador asignado al timer0, prescalador x16
;**************************************************************************
;Configuracion de las interrupciones
;**************************************************************************
    banksel INTCON      ;bank0
    movlw   b'10100000'
    movwf   INTCON      ;interrupcion timer0 activado
;**************************************************************************
;Borrando el registro de desplazamientos
;**************************************************************************
    bcf     dato
    bcf     ck
    movlw   n_columnas+1        
    movwf   contador_columnas
siguiente_col
    decfsz  contador_columnas
    goto    borrar_registro_desp
    goto    iniciar_timer0
borrar_registro_desp
    bsf     ck
    nop
    bcf     ck
    goto    siguiente_col
iniciar_timer0
    banksel OPTION_REG      ;bank1
    bcf     OPTION_REG,T0CS
    banksel PORTA           ;bank0
    clrf    contador_columnas
;**************************************************************************
;Carga en buffer (RAM) los simbolos a mostrar en la matriz
;**************************************************************************
    clrf    n           ;borra el contador
siguiente_dato_tabla
    movlw   buffer
    addwf   n,W         ;
    movwf   FSR         ;carga la direccion del buffer en el puntero
    movfw   n
    call    tabla
    movwf   INDF        ;carga el la RAM el valor rescatado de la tabla en la
                        ;direccion definida por el puntero
    incf    n
    movfw   n
    xorlw   n_columnas
    btfss   STATUS,Z
    goto    siguiente_dato_tabla
;*************************************************************************
    goto    $
;**************************************************************************
    end
```

La simulación adjunta fue hecha en PROTEUS 7.10, asi que si tienes una versión más antigua quizá no lo puedas abrir.


----------



## Daniel Meza (Abr 24, 2014)

Ando revisando y si tiene convertidor y un comparador. Hay que iniciar el registro CMCON para poder usar algunos pines como I/O.
El dato para desactivar los canales de entrada del comparador es 0x07, así

movlw   0x07
movwf   CMCON


----------



## Meta (Dic 2, 2015)

Hola:

Aquí un buen enlace sobre matriz. Menudo proyectazo.

https://mundoarcoiris.wordpress.com/2011/07/28/hello-world/

Saludos.


----------

