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.