Matriz de LEDS de 8x8
<keywords content="TTL 74Ls164N, electronica, circuito, pic, NE555, PIC BASIC, PIC SIMULATOR IDE, esquema, circuito impreso, proyecto, gratis, download, programa, CMOS, pin, e/s, i/o, ucontrol, PIC, 16F628a, 16f84a" /> <center>
| Inicio | Foro | Revista uControl | Circuiteca | Microcontroladores | Electrónica Básica | Herramientas y Software | Tutoriales | Colaboradores | Enlaces |
|
¿Ya descargaste los ejemplares GRATUITOS de la Revista uControl? ¡No te los pierdas!. | |||||||||
|
wikipage=Dado electrónico con PIC
tooltip=Dado electrónico con PIC
img_src=Image:dado100.jpg
img_width=150px
img_alt=Dado electrónico con PIC
</linkedimage> |
wikipage=Como trucar un servo
tooltip=Como trucar un servo
img_src=Image:trucaservo150.jpg
img_width=150px
img_alt=Como trucar un servo
</linkedimage> |
wikipage=Comunicación inalámbrica entre PICs
tooltip=Comunicación inalámbrica entre PICs
img_src=Image:TXRX150.jpg
img_width=150px
img_alt=Comunicación inalámbrica entre PICs
</linkedimage> |
wikipage=CCS - Libreria de gráficos para GLCD K0108
tooltip=CCS - Libreria de gráficos para GLCD K0108
img_src=Image:GLCD-100.gif
img_width=150px
img_alt=CCS - Libreria de gráficos para GLCD K0108
</linkedimage> |
wikipage=Funcionamiento de una matriz de LEDs
tooltip=Funcionamiento de una matriz de LEDs
img_src=Image:GNUxx.jpg
img_width=150px
img_alt=Funcionamiento de una matriz de LEDs
</linkedimage> |
![]() |
Todos los articulos y proyectos de uControl tienen su lugar en el foro. Si tienes dudas o comentarios, busca o crea el hilo correspondiente, y tendrás una rapida respuesta.
|
![]() |
|
Matriz de LEDS de 8 filas y 8 columnas.
| ||||||||||||||
IntroducciónEn este proyecto veremos como diseñar y construir un display de diodos leds en forma de matriz de 8 filas por 8 columnas. El circuito incluye una memoria EEPROM externa del tipo 24C256 en la que podremos almacenar bloques de pixeles que luego seran representados por la pantalla.
UNIQ2b71ddae3ac4afe1-addhtml-00000001-QINU Descripción del proyectoEl proyecto que desarrollaremos es una buena herramienta para el aprendizaje. El microcontrolador empleado es de los más pequeños, un PIC16F628A con 2 KBytes de memoria FLASH. Sin embargo, se puede utilizar un PIC16F627A (que tiene la mitad de memoria) o bien un PIC16F648A (que tiene el doble). Este microcontrolador puede parecer pequeño, pero es más que suficiente para poder manejar los componentes y funciones del proyecto. Una memoria EEPROM 24C256 de 32 KBytes , a la que se accede vía I2C puede utilizarse para almacenar el contenido de 4096 pantallas, que el microcontrolador podria representar una a cotinuación de otra, a modo de video de baja resolución. Las columnas de la matriz se seleccionan mediante un registro de desplazamiento de 8 bits de longitud, implementado a partir de un 74HC164N.
El circuitoEl circuito eléctrico de este proyecto es muy sencillo. El corazón del mismo es el microcontrolador PIC16F628A. El oscilador del PIC esta basado en un cristal de 4 MHz y dos condensadores de 22 picofaradios. La pantalla esta construida mediante una matriz basada en 8 filas por 8 columnas de diodos LEDs, con sus ánodos controlados desde los pines del PORTB del microcontrolador, mediante un transistor 2N3906 que se encarga de proporcionar la corriente suficiente para encender los 8 LEDs de la fila. La fila inferior corresponde al pin B0, la siguiente al B1 y asi, hasta la fila superior, que esta conectada al pin B7. Cuando querramos programar el microcontrolador, deberemos configurar todo el puerto B como salidas. El puerto A tiene a su cargo el control del 74HC164N, que a su vez se encarga de seleccionar las columnas activas en cada momento. Entre cada salida del 74HC164N y los LEDs hemos colocado un resistor para limitar la corriente que circula por ellos. Si el brillo de los LEDs es muy bajo, puede probarse con valores mas pequeños para estos resistores. El pin DATA del 74HC164N es controlado desde A1 y los pulsos de CLOCK los proporciona el pin A0. La memoria EEPROM tambien depende del puerto A, con la línea SCL conectada al pin A2 y la línea SDA conectada al pin A3. Ambas lineas estan puestas a +V mediante resistores de 10K. La alimentacion se ha resuelto mediante un regulador de voltaje tipo LM7805 y sus componentes asociados. Un diodo se encarga de proteger el circuito por si involuntariamente conectamos la alimentación con la polaridad invertida. La bornera es la encargada de vincular la fuente de corriente continua de entre 9V y 12V encargada de alimentar la placa. Un pulsador, junto a una resistencia de 10K forman un circuito de reset, que tiene la capacidad de volver el circuito a su estado inicial en cualquier momento.
Ház clic en la imáge para ampliarla. NOTA IMPORTANTE: En el esquema no figura la conexión del PIN 9 (RESET) del 74HC164N a +V, aunque si está contemplado en el diseño del PCB. Ese pin DEBE estar a +V para que el circuito funcione.
Lista de componentesLa lista de componentes es más bien pequeña:
wikipage=Publicidad tooltip=Publicidad img_src=Image:banner1.jpg img_width=801px </linkedimage>PCBEl circuito impreso necesario es de 80x95 milimetros, de una sola cara. Esto ha obligado a realizar una buena cantidad de puentes en el lado trasero de la placa, pero es mucho mas sencillo construir una PCB de simple cara en casa. Si no sabes como hacerlo, puedes aprender con con este tutorial.
Este es el aspecto del PCB.
MontajeEl montaje no requiere de ninguna técnica en especial. Una vez que tengamos el PCB listo y agujereado, procedemos a soldar los componentes. Podemos comenzar por los resistores y los LEDs. Al hacerlo, hay que tener en cuenta que los LEDs deben tener la muesca que indica el cátodo hacia el lado de los circuitos integrados. Si no lo hacemos asi, el proyecto no funcionará. Más tarde soldaremos los zócalos, el pulsador de reset, los condensadores , el diodo 1N4007 (cuidando su orientación) y el LM7805. Por ultimo, soldaremos el cristal y pasaremos al otro lado del PCB. Aqui es donde este montaje puede diferir un poco de otros que hayas realizado. Sin embargo, tampoco es tan complicado lo que resta por hacer. Lo primero es soldar las los dos resistores pull-up que requiere el bus I2C para funcionar. La imagen siguiente muestra donde van soldados:
![]() En rojo, los resistores mencionados.
Estos son los puentes a realizar. Programación en CCSAprovecharemos este montaje para aprender más sobre el compilador CCS. A continuación, algunos ejemplos de lo que puede hacerse con esta matriz de LEDs.
Ejemplo 1: TEST LEDEl primer ejemplo simplemente se encarga de mostrar encendidas las filas desde la 0 a la 7, y luego enciende rectangulos de LEDs cada vez mas grandes, comenzando desde la esquina superior derecha. El primer video de la sección correspondiente muestra el efecto. Como el dato se ingresa dentro del registro de desplazamiento cuando el pulso de clock pasa de estao bajo a alto, hemos escrito dis funciones que se encargan de enviar un cero o un uno al registro. La siguiente envia el "0": //--------------------------------------------------
//---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);
}
y esta otra envia un "1": //--------------------------------------------------
//---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);
}
//Device/Fuses/Etc.---------------------------------
#INCLUDE <16F628A.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;
}
//
//------Dibujo rectangulos... -----
//
PORTB = 0b11111111; //Filas apagadas.
for (i=0;i<8;i++) {fRDD_send_data1();}
for (i=0;i<8;i++) {
fRDD_send_data0();
PORTB = PORTB /2 ;
delay_ms(200);
}
}//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);
}
Ejemplo 2: Recorriendo la matrizEste ejemplo es un poco mas elaborado, pero no por ello más complicado que el anterior. Simplemente, se van encendiendo uno a uno los LEDs desde el que esta en la fila y columna cero hasta llegar al de la fila y columna 7. Luego, se repite una y otra vez. Se emplean las mismas funciones que en el ejemplo anterior.
//Device/Fuses/Etc.---------------------------------
#INCLUDE <16F628A.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);
//
while (TRUE){
PORTB = 0b11111110; //Filas apagadas.
for (i=0;i<8;i++) {
//Limpio columnas
for (j=0;j<8;j++) {fRDD_send_data1();}
//
fRDD_send_data0(); //Enciendo la columna 0
for (j=0;j<8;j++) {
delay_ms(1);
fRDD_send_data1();
}
//
PORTB = (PORTB << 1 )+1 ; //Enciendo las columnas
delay_ms(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);
}
VideosVideo correspondiente al Ejemplo1:
Revista uControl
Autor
| ||||||||||||||
|
Este contenido se rige por la licencia de Creative Commons "Licencia Creative Commons Atribución-No Comercial-Sin Obras Derivadas 3.0". Para más información, véase la licencia en su forma reducida y completa. |


