Cartel de leds 8×8
En 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.
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.
1 microcontrolador PIC16F628A, con su zócalo. 1 memoria EEPROM 24C256, con su zócalo. 1 circuito integrado 74HC164N, con su zócalo. 1 regulador de voltaje LM7805 4 condensadores cerámicos de 0.1 uF. 2 condensadores cerámicos de 22 pF. 1 xtal de 4 MHz. 1 condensador electrolitico de 220uF/16V. 1 diodo 1N4007. 8 transistores 2N3906. 8 resistores de 100 ohms. 1 resistor de 10K. 8 resistores de 1.5K. 1 bornera de dos tornillos. 64 diodos LED de 5mm, color rojo.
El 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:
Una vez hecho esto, debemos realizar una serie de puentes para unir los ánodos de cada fila de LEDs al colector del transistor correspondiente.
Ejemplo1
//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: Este 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); }
Fuente: http://www.ucontrol.com.ar/wiki/index.php?title=Matriz_de_LEDS_de_8x8
Tuitear 7.061 Veces leído 0 comentarios |
12 agosto 2010 en Electronica | tags: Electronica |