matriz de led 8x8

Saludos mundo vengo con mi segundo post espero que sea de su agrado y utilidad.
COMO HACER UNA MATRIZ DE LED 8x8

En principio el lenguaje utilizado es BASIC y el programa picsimulator ide, el pic16f628a con cristal interno, las bases para entender la programación se encuentran en mi primer post:
http://www.taringa.net/posts/ciencia-educacion/5817733/programacion-de-microcontroladores-pic-en-basic-y-simulacion.html
Empezamos primero con el circuito de la matriz de led 8x8, primero la matriz:
(con todo el respeto a los de neoteo, utilizo sus imágenes)

matriz de led 8x8

Observando la imagen los ánodos (positivos) se conectan horizontalmente formando las filas y los cátodos (negativos) se conectan verticalmente formando las columnas teniendo 8 filas y 8 columnas. Para encender un led hay que alimentar con positivo en la fila y negativo en la columna (explicado abajo).

La matriz en el proteus, como la utilizaremos y como encender un led es la siguiente:

Electrónica

Como mencionamos arriba se alimenta con positivo a las filas y negativo a las columnas.
El circuito de toda la matriz es el siguiente:

led

Este es el circuito de simulación que lo usaremos para todas las explicaciones (se puede observar una resistencia de 10k conectada a ra4 ya que esta NO es una salida cmos necesita la resistencia, sin esta ra4 no funciona como salida, las resistencias conectadas a los colectores de los transistores son solo por simulación ya que el bc548 a mi no me trabaja sin ellas y todo el tiempo bota negativo pero en el pcb no se utilizan) y ahora el pcb, realizado en pcbwizard.

programación

Microcontroladores

Al final dejo una carpeta con todos los archivos.
FUNCIONAMIENTO.

Primero el 74ls164 es un registro de desplazamiento de 8 canales, de los cuales solo utilizaremos 3 pines además de los canales (8=clok, 1y2= data (estos cortocircuitados).
Utilizaremos este integrado como un secuencial para que encienda columna por columna empezando de la octava y llegando a la primera (de derecha a izquierda), esta funciona colocando un 1 logico (5V) al data, un 1 logico al clock y luego un 0 logico (0V) (lo que sería un pulso) entonces este enciende el primer pin en este caso el 3 y como es un registro de desplazamiento colocamos un 0 logico al data un 1 y luego 0 al clock (otro pulso) entonces desplaza el valor del pin 3 al pin 4 y de esta manera a los 8 canales.(el valor que muestra en sus pines es el de data si data es 1 el registro será un, si el data es 0 el registro será 0 y el clock es para validar el data). El clock solo se encarga de dar pulsos.

Como se puede ver en el circuito de proteus toda la portb está conectada a las filas, entonces, el microcontrolador muestra o enciende la primera columna alimentando con 5v a las resistencias y estas a los leds, manda una señal al registro de desplazamiento para que coloque negativo a los cátodos de los leds mediante los transistores, de esta manera muestra la octava fila. La portb muestra otro dato, manda señal al registro y queda encendida la séptima fila, de esta manera hasta llegar a la primera fila, este trabajo es realizado a alta velocidad dando la apariencia que la imagen estuviera encendida todo el tiempo. Para un mejor entendimiento dejo el siguiente video que muestra cómo se enciende una “A”. En el video empieza de la 7 fila con un led encendido en la primera columna este solo es para mostrar en que columna se encuentra el registro de desplazamiento, la velocidad es aumentada gradualmente para apreciar como trabaja la matriz y al final queda encendida la letra pero esta se sigue mostrando columna tras columna.


link: http://www.youtube.com/watch?v=1iZC8HEv2gw&feature=player_detailpage

Pasamos a la programación de la matriz. Es programa mostrara una carita feliz.

Tenemos que obtener los datos para cada columna lo que yo hago es una tabla en el exel de 8x8 para realizar todo tipo de dibujos llenando con 1 a los led encendidos y blanco a los apagados sin los márgenes queda de esta manera:

1 1 1 1
1 1
1 1 1 1
1 1
1 1 1 1
1 1 1 1
1 1
1 1 1 1

Levando a números binarios;

0 0 1 1 1 1 0 0
0 1 0 0 0 0 1 0
1 0 1 0 0 1 0 1
1 0 0 0 0 0 0 1
1 0 1 0 0 1 0 1
1 0 0 1 1 0 0 1
0 1 0 0 0 0 1 0
0 0 1 1 1 1 0 0
c1 c3 c5……………

en la columna 3 el valor empezando de abajo es “10010101”
De esta manera obtenemos los datos de todas las columnas y a programar.

TRISA = 0 'todos los pines de porta como salidas
TRISB = 0 'todos los pines de portb como salidas
Symbol clock = PORTA.4 'nombramos a ra4 como clock
Symbol data = PORTA.3 'nombramos a ra4 como data
inicio: 'comienza el programa
PORTB = %00111100 'dato de la 8 columna
data = 1 '1 lógico a data del registro
clock = 1 'damos el pulso del clock
clock = 0 'damos el pulso del clock
data = 0 '0 lógico a data del registro
'solo utilizaremos un pulso en el data
'este recorrera hasta la 1 columna
WaitMs 2 'esperamos medio segundo
'aqui muestra la 8 columna
PORTB = 0 'ponemos en blanco portb
PORTB = %01000010 'dato de la 7 columna
'ya no utilizamos data este es desplazado
'como data se encuentra en 0 remplaza la salida 1 con 0 del registro
clock = 1 'damos el pulso del clock
clock = 0 'damos el pulso del clock
WaitMs 2 'esperamos medio segundo
'aqui muestra la 7 columna
'el proceso se repite con los otros datos
PORTB = 0 'ponemos en blanco portb
PORTB = %10010101 'dato de la 6 columna
clock = 1 'damos el pulso del clock
clock = 0 'damos el pulso del clock
WaitMs 2 'esperamos medio segundo
'aqui muestra la 6 columna
PORTB = 0 'ponemos en blanco portb
PORTB = %10100001 'dato de la 5 columna
clock = 1 'damos el pulso del clock
clock = 0 'damos el pulso del clock
WaitMs 2 'esperamos medio segundo
'aqui muestra la 5 columna
PORTB = 0 'ponemos en blanco portb
PORTB = %10100001 'dato de la 4 columna
clock = 1 'damos el pulso del clock
clock = 0 'damos el pulso del clock
WaitMs 2 'esperamos medio segundo
'aqui muestra la 5 columna
PORTB = 0 'ponemos en blanco portb
PORTB = %10010101 'dato de la 3 columna
clock = 1 'damos el pulso del clock
clock = 0 'damos el pulso del clock
WaitMs 2 'esperamos medio segundo
'aqui muestra la 4 columna
PORTB = 0 'ponemos en blanco portb
PORTB = %01000010 'dato de la 2 columna
clock = 1 'damos el pulso del clock
clock = 0 'damos el pulso del clock
WaitMs 2 'esperamos medio segundo
'aqui muestra la 3 columna
PORTB = 0 'ponemos en blanco portb
PORTB = %00111100 'dato de la 1 columna
clock = 1 'damos el pulso del clock
clock = 0 'damos el pulso del clock
WaitMs 2 'esperamos medio segundo
'aqui muestra la 2 columna
clock = 1 'dejamos en blanco las 8columnas
clock = 0 'dejamos en blanco las 8columnas
Goto inicio 'empezamos todo

matriz de led 8x8

Está vivo.
Si colocamos los waitms a 500 o 250 podremos apreciar el encendido columna por columna.
En este caso el programa es demasiado largo pero lo podemos hacer mas corto utilizando variables y transformar los números binarios a decimales.

Nuestra imagen de la carita feliz la dividimos por filas empezando de la parte inferior y enumerándolas de la siguiente manera

0 0 1 1 1 1 0 0 ; 128
0 1 0 0 0 0 1 0 ; 64
1 0 1 0 0 1 0 1 ; 32
1 0 0 0 0 0 0 1 ; 16
1 0 1 0 0 1 0 1 ; 8
1 0 0 1 1 0 0 1 ; 4
0 1 0 0 0 0 1 0 ; 2
0 0 1 1 1 1 0 0 ; 1

Ahora sumamos los números de nuestros leds encendidos este ejemplo es de la primera columna.

0 ; 128
0 ; 64
1 ; 32
1 ; 16
1 ; 8
1 ; 4
0 ; 2
0 ; 1

0
0
32
16
8
4
0
0
=60

De todas las columnas es el siguiente.

0 0 1 1 1 1 0 0 ; 128
0 1 0 0 0 0 1 0 ; 64
1 0 1 0 0 1 0 1 ; 32
1 0 0 0 0 0 0 1 ; 16
1 0 1 0 0 1 0 1 ; 8
1 0 0 1 1 0 0 1 ; 4
0 1 0 0 0 0 1 0 ; 2
0 0 1 1 1 1 0 0 ; 1
60,66,169,133,133,169,66,60

Pero para esto realizamos un pequeño cambio en el circuito del proteus ya que al escribir los números binarios “%10101010” bien a ser “%ra7,ra6,…..ra0”y nuestro ra0 esta conectado a la 8 fila (arriba) y al realizar la transformación de binario a decimal ra0 tiene que ir conectado a la 1 fila (abajo) si no realizamos esto la imagen nos sale de cabeza.

El programa utilizando variables:

Electrónica

TRISA = 0
TRISB = 0
Symbol clock = PORTA.4 'nombramos a ra4 como clock
Symbol data = PORTA.3 'nombramos a ra4 como data
Dim c1 As Byte 'valor de la 1 columna
Dim c2 As Byte 'de la 2 columna
Dim c3 As Byte '....
Dim c4 As Byte '....
Dim c5 As Byte '....
Dim c6 As Byte '....
Dim c7 As Byte '....
Dim c8 As Byte 'y la 8 columna
inicio:
c1 = 60
c2 = 66
c3 = 169
c4 = 133
c5 = 133
c6 = 169
c7 = 66
c8 = 60
Gosub mostrar
Goto inicio
End
mostrar:
PORTB = c8
data = 1
clock = 1
clock = 0
data = 0
WaitMs 2
PORTB = 0
PORTB = c7
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c6
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c5
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c4
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c3
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c2
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c1
clock = 1
clock = 0
WaitMs 2
PORTB = 0
clock = 1
clock = 0
Return

Por último el desplazamiento de texto.
Utilizaremos una nueva instrucción.

LOOCKUP

Esta instrucción la utilizaremos para agarra una variable de una lista de variables y guardarla en una variable, jejejejejej (se entendió) para ello el siguiente ejemplo.

Dim lista As Byte
Dim var As Byte
Lista = 4
var = LookUp(10, 21, 255, 13, 78, 129, 75, 17, 40), lista
PORTB = var

Donde lookup es la instrucción delante de la lista, la lista de variables es la que se encuentra en paréntesis (10, 11, 12, 13, 14, 15, 16, 17, 18) con 9 variables pero puede acumular hasta 255 variables, la lista o (,lista) en la instrucción es el numero de la variable a agarra de la lista en este caso 4 y por ultimo var es donde se guardara el valor obtenido de la lista que será 78 ya que la instrucción empieza a contar desde 0 entonces igualamos la portb al numero obtenido para mostrarla. Todas la variables para esta instrucción deben ser tipo byte.(hasta donde yo sé nunca probé con Word o long)

Esta instrucción hace toda la magia para desplazar los textos.

Tenemos que tener en cuenta que al mostrar la imagen estática de la cartita, el microcontrolador realiza las instrucciones rápidamente por eso no se puede observar el parpadeo de las columnas y ahora para mostrar la imagen desplazándose debemos repetirla en cada muestra de columnas para apreciar bien el desplazamiento (lo experimentaran ustedes para que lo entiendan)
Nuestro programa.

TRISA = 0
TRISB = 0
Symbol clock = PORTA.4 'nombramos a ra4 como clock
Symbol data = PORTA.3 'nombramos a ra4 como data
Dim c1 As Byte 'valor de la 1 columna
Dim c2 As Byte 'de la 2 columna
Dim c3 As Byte '....
Dim c4 As Byte '....
Dim c5 As Byte '....
Dim c6 As Byte '....
Dim c7 As Byte '....
Dim c8 As Byte 'y la 8 columna
Dim var As Byte 'variable para guardar los valores obtenidos de lookup
Dim lista As Byte 'variable para el numero del valor a tomar
Dim a As Byte 'variable a auxiliar para conteos
Dim b As Byte 'variable b auxiliar para conteos
inicio: 'empieza el programa
Gosub limpiar 'limpiamos todas la columnas, variables y las ports
For a = 1 To 16 Step 1 'repetimos el proceso siguiente
var = LookUp(60, 66, 169, 133, 133, 169, 66, 60, 0, 0, 0, 0, 0, 0, 0, 0), lista
'nuestra lista sol los valores de las columnas de la carita
'aumentando 8 ceros para que vuelva a repetirse con un espacio
'como lista esta en 0 por nuestra subrutina de limpiar toma el primer valor
c8 = var
Gosub mostrar 'mostramos el valor
lista = lista + 1 'sumamos 1 al valor de la lista para el siguiente dato en la segunda repeticion
Gosub desplazar
Next a
Goto inicio
End
limpiar:
c1 = 0
c2 = 0
c3 = 0
c4 = 0
c5 = 0
c6 = 0
c7 = 0
c8 = 0
a = 0
b = 0
var = 0
lista = 0
clock = 0
data = 0
PORTA = 0
PORTB = 0
Return
desplazar: 'con esta subrutina desplazamos los valores obtenidos
'para leer los mensajes se debe desplazar de derecha a izquierda por este motivo empezamos de la c8 en los ejemplos
'entoses los valores son desplazados a la izquierda
c1 = c2
c2 = c3
c3 = c4
c4 = c5
c5 = c6
c6 = c7
c7 = c8
Return 'volvemso a continuar nuesto programa
mostrar:
For b = 1 To 12 Step 1 'repetimos lo que muestra para apreciar el desplazamiento
PORTB = c8
data = 1
clock = 1
clock = 0
data = 0
WaitMs 2
PORTB = 0
PORTB = c7
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c6
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c5
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c4
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c3
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c2
clock = 1
clock = 0
WaitMs 2
PORTB = 0
PORTB = c1
clock = 1
clock = 0
WaitMs 2
PORTB = 0
clock = 1
clock = 0
Next b 'volver a repetir
Return

Si les parece muy lento solo disminuyan la cantidad de repeticiones en la subrutina mostrar.

Una musetra


link: http://www.youtube.com/watch?v=xfuPKgp2nDE&feature=player_detailpage

Bueno esto es todo para aumentar las letras viene a ser lo mismo, cambian los datos y el número de variables en la lista. Si quieren todo el alfabeto pueden descargarlo de neoteo matriz 8x8 parte 2.
Este post lo hice un poco rápido si desean que profundice, aumente, si existe algún error o explique mejor alguna parte solo comenten y lo realizo.

En tanto al pcb recién lo probare cuando termine de comprar algunos materiales que me faltan, una vez probados lo subo con los datos adjuntos que mencione arriba.

Espero que les guste y les sirva dejen todos sus puntos y comentarios hasta la próxima.

Si me va bien subo los siguientes post.


link: http://www.youtube.com/watch?v=MrcewctK4Jk&feature=player_detailpage


link: http://www.youtube.com/watch?v=oa96S30tzKs


Un saludo ISRAEL.

Anuncios

77 comentarios - matriz de led 8x8

@soytuenergia +2
Brother te pasaste, esto si que es explicación completa, en cualquier caso, lo que yo estoy buscando es una especie de display LED giratoria...

Igualmente excelente post, además me declaro amante de la tecnología LED, es el futuro de la iluminación!!!
@arjuna87
excelente aporte men te pasaste
@chine906
muy buen post!! te pasate!!! pero me gustaria si alguien me pasa el archivo del pcb para hacer la plaqueta!! gracias!!!!
@chine906
mi mail es bruno_t.t arroba hot mail gracias"!!
@chine906
Hola israel necesito que me ayudes un poco con la conexion del circuito que lo estoy fabricando...mil gracias espero tus respuestaS!!!!!
@jcgonzales
Hola Israel soy novato y no puedo darte puntos aun, excelente aporte hermano te pasastes. Una consulta en una parte del texto dices "Al final dejo una carpeta con todos los archivos." En donde puedo encontrar la opcion para descarga hermano basicamente el proteus para comprar con lo que he hecho por se me prenden todas las luces al quere hacer la carita. Gracias de antemano.
@link_08
interesante!!!!!!!!!!!!!!!!!!!
pero alguien alguna vez probo este circuito???????
de antemano gracias
@JhonnyBmxxx
Hola Israel , me encanto tu proyecto y quiero ponerlo en practica yo mismo , pero mi problema es que no tengo una compilacion ASEMBLER y otro programa ya escrito para que funcione , de donde lo podria obtener?... , el tuyo esta posteado? .. Saludos y suerte Jony
@jocao24
Esta super este post es lo que estaba buscando por que estaba un poco enredado con esto de las matrices.
@jocao24
Hola Israel, tengo un problema, ya he probador varios tutoriales de matrices con pic simulator ide, pero cuando simulo mi programa con su respectivo circuito en proteus, no me funciona, la matriz aparece toda encendida y no hace más nada, pensé que era el programa que estaba probando, luego hice el circuito que tienes en este post idéntico al tuyo para probar en que estaba equivocado yo, copie el programa de la carita y todo pero al momento de simularlo la matriz aparece toda apagada y las salidas del puerto del pic no muestran variaciones, con esto no estoy diciendo que tu programa este malo o tu circuito, al contrario recurro a ti para que por favor me ayudes o si es posible me puedas indicar en que estoy fallando o si es un problema de mi proteus por que ya he hecho varios intentos con otros programa que he conseguido en la red referentes a matrices y nada.

Espero me puedas ayudar en este tema por favor te lo agradecería mucho.

De ante mano muchas gracias.

No puedo dejar puntos por que soy novato, si no te lo agradecería con puntos.
@jocao24
Hola Israel, aqui muestro la imagen, no pienses que es plagio lo que hice solo que como dije anteriormente copie todo identico para probar en que estoy mal y a ver si lo descubria. Mi version de proteus es la 7.7 y ya cambie los transistores por compuertas not y nada.led

Uploaded with ImageShack.us
@jocao24
programación

Uploaded with ImageShack.us
@Doddler
Gracias amigo, es lo que buscaba. en la mayoria de los post que checo nunca mostraron un ejemplo del programa
@alexis_s
Muy bueno che! A favoritos
@thediegox
ke coño va en los pines que estan al lado izquierdo del pic??, son 22 pines...
@BruneloA
Hola, he probado el codigo y todo y todo me sale OK. Si para este metodo deseo colocar otra matriz de 8x8 teniendo en total una de 16x8. Me sale bien pero no he encontrado un retardo o delay que me muestre como si estuviera en una matriz de 8x8 con un retardo de 2ms. Apoyenmeee
@titii_iio
Hola Israel, mira tengo un problema al simularlo en el proteus porque no logro ver bien clara la imagen de la "carita"? si podes ayudarme a mejoralo te lo voy a agradecer. =)
@Porkit
joya gracias! lo tengo probar mañana con el circuito real! =) muy bueno tu trabajo!!
@titii_iio
oks dale ya tengo el circ listo y el pic para programar y probarlo! gracias! muy bueno tu trabajo loco.. =)
@chine906
man! nos comunicamos por mail bruno_t.t@hotmail.com necesito que me pases elprogramador para baasic
gracias

Bruno
@Maik_89
Que tal.. Eh seguido el tutorial al pie de la letra y no me da resultados. Espero puedas ayudarme. Saludos.. miguelayala.1989@gmail.com
@konig17
tengo un problema al llevarlo a fisico, el mensaje solo aparece una vez y no vuelve a repetirse asi qe no alcanza a apreciarse. alguna sugerencia? muy buen aporte (y)
@juank041186
Hola amigo queria hacerte una pregunta en que programa de pics realisaste la programación
@Maik_89
Que tal Israel, fijate que todo me ha salido bien hasta ahora, el detalle lo tengo al momento de conectar mas matrices. Espero me puedas ayudar
@js3380978
hola Israel quisiera saber como cargar mas datos a la instruccion look up ya que solo pueden ser 255 datos
gracias de antemano
@nelson1923 +1
gracias amigo buen post exelente q alguien comparta loq sabe con los demas muchos no lo hacen felicidades en su vida y siga con es carisma q este bn intentare hacer la matriz
@Echiman
Muy buen post, te queria preguntar donde esta la carpeta donde dice todo
@DROGOTOMON
muy groso hijo de puta!! muy buen post!
@monga22 +1
concuerdo con Echiman , donde esta la carpeta?
@furiadecoachass
Hola MAN EN EL PCB TE FALTO CONECTAR TODOS LOS POSITIVOS DE LOS LEDS, SOLO CONECTASTE LA PRIMER COLUMNA Y LO DEMAS?
@emolobito
buenisimo el aporte solo me queda una preguntita alguien no tiene por ahi el programa en C porque no manejo el basic puede ser en c o en asm por fa ...
@carloscorrea68
hola amigo, muy buen post, donde esta la carpeta con los archivos que dejaste,
estoy por realizar en proyecto y seria buena alguna ayuda.
carloscorrea68@hotmail.com
@kHOJAh_h
Te agradezco muchisimo!
@Julienk
Amigo. Muy buen post.
@ezku
en que programa hiciste tu programa? jaja bueno esque yo lo estoy intentando probar en microcode y me marca muchos errores, Muy buen post (:
@tuxpanver
exelente!!!!! plcisrael!!!!!! ok una preguntota si de casualidad ya tienes lista la carpeta para la descarga mandamela por favor

betodj_7303@hotmail.com

se agradese loco..............aja oye y que programa usastes para el esquematico.....GRACIAS.........
@YrvinCN
Muy bueno tu aporte amigo... pero... no tendras ya lista tu carpeta para la descarga, y funciona en proteus tu simulacion, solo ello, gracias!!
@ruicente
Para evitar un poco el laburo de soldar tantos leds recomiendo este tipo de matriz de punto, la compre en Intek electronica "A-5570SR-A G/W " son anodo comun.
@LGNK3
men!! donde estan las carpetas de simulacion que dijistes que ibas a colocar al finaaallll..!!! o es que no lo has simuladoo..no creo ha..
@mares250
Excelente post, pero sería mejor si colocaras la simulación en Proteus para las personas que apenas estamos aprendiendo, muchas gracias y éxitos.
@jotamendo
por favor israel la simvlacion para probarlo