Matriz de leds para mini publi
Primer codigo de prueba para el 16f88, se puede hacer con un 16f648A y con un registro de dezplazamiento(una matriz de 8×8)
#include <16f88.h> #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,MCLR #use delay(clock=20000000) #use fast_io(a) #use fast_io(b) #include <fonts.h> #include <string.h> #define clock PIN_A1 #define strobe PIN_A2 #define dato PIN_A0 #define size_matriz_col 8 //cantidad de columnas por matriz #define COLUMNAS 40 //Defino cantidad de columnas a usar #define matriz_num COLUMNAS/size_matriz_col //numero de matrices usado #byte portb=6 int matriz[matriz_num+1][size_matriz_col]={"\0"}; //Almacena los datos a mostrar en el cartel. 0 Para que no me muestre basura por la matriz al comienzo del programa. int Fila; //Fila actual a refrescar int VSync; //Indica si es momento correcto de modificar lo que se esta mostrando... int Inhibit; //Impide que se produzcan cambios en el cartel. const int mensaje[1][32]={"Feliz Navidad y Feliz 2009!!..."}; const int num_msj=1; const int msj_length[num_msj]={31}; int carries[6],msj,letra,desplazos; void ShowFila(void); void cargar(int datob); void desplazar_izq(void); void load_letra(int caracter); //Esta interrupcion debe suceder segun la cantidad de filas que tengas, y segun la cantidad de Hz a los que queres que tu cartel refresque... #int_TIMER0 void TIMER0_isr(void){ ShowFila(); //Mostremos la fila actual... Fila++; if(Fila==8){ Fila=0; VSync=1; if(Inhibit!=0) Inhibit--; else desplazar_izq(); } else VSync=0; } void main(void){ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); enable_interrupts(INT_TIMER0); clear_interrupt(INT_TIMER0); enable_interrupts(GLOBAL); setup_adc(adc_off); setup_adc_ports(no_analogs); set_tris_a(0); set_tris_b(0); output_b(0xFF); //Apago cartel output_low(CLOCK); //Aseguro inicialmente clock en bajo output_low(STROBE); Fila=0; //Comienzo por la 1er fila Inhibit=5; VSync=1; //Indico que comienzo con sync. desplazos=0; msj=0; while(true){} } void cargar(int datob){ int contador; output_low(clock); delay_cycles(2); output_low(strobe); for(contador=0;contador<8;contador++){ output_bit(dato,(datob & 0x1)); datob>>=1; output_high(clock); delay_cycles(1); output_low(clock); } output_high(strobe); delay_cycles(1); output_low(strobe); } void ShowFila(void){ int i; output_b(0xFF); for(i=0;i<5;i++){ cargar(matriz[i][Fila]); } bit_clear(portb,fila); } void desplazar_izq(void){ int i,j,a; if(desplazos==8 || desplazos==0){ //uso caracteres de 8x8, por tanto deberé cargar una nueva letra si ya se han hecho 8 desplazos o ninguno. load_letra(mensaje[msj][letra]); //cargo la nueva letra desplazos=0; //restablezco el valos de desplazos } for(i=0;i<8;i++){ //este for desplaza un bit a la izquierda de mi buffer matriz de cada fila, la matriz es de 6x8, en hadware tenía un cartel 8x40, //con un buffer de 5x8 bastaba, pero el 6to apareció por ser uno temporal para ir cargando ahí el nuevo caracter for(j=0;j<6;j++){ a=matriz[j][i]; se carga el primer byte en una variable temporal carries[j]=shift_left(&a,1,0); //desplazo esa variable temporal un bit a la izquierda, y almaceno en valor desplazado en un arreglo. matriz[j][i]=a; //guardo el nuevo valor de la variable temporal que esta desplazada, en la misma posición de antes } for(j=0;j<6;j++){ //coloco los carries donde corresponden16. if(j!=5) matriz[j][i]|=carries[j+1]; else matriz[j][i]|=carries[0]; } } Inhibit=5; //restablezco valor de Inhibit desplazos++; //incremento el valor de desplazos if(desplazos==8){ //si se han hecho 8 desplazos letra++; //hay que pasar a mostrar la siguiente letra del mensaje if(letra>msj_length[msj]) //si se ha llegado a la última letra letra=0; //se comienza desde la primera letra del mensaje } } void load_letra(int caracter){ int i,j; if(isalnum(caracter)){ if(isalpha(caracter)){ if(isupper(caracter)){ switch(caracter){ case 'A': i=0; break; case 'B': i=1; break; case 'C': i=2; break; case 'D': i=3; break; case 'E': i=4; break; case 'F': i=5; break; case 'G': i=6; break; case 'H': i=7; break; case 'I': i=8; break; case 'J': i=9; break; case 'K': i=10; break; case 'L': i=11; break; case 'M': i=12; break; case 'N': i=13; break; case 'O': i=14; break; case 'P': i=15; break; case 'Q': i=16; break; case 'R': i=17; break; case 'S': i=18; break; case 'T': i=19; break; case 'U': i=20; break; case 'V': i=21; break; case 'W': i=22; break; case 'X': i=23; break; case 'Y': i=24; break; case 'Z': i=25; break; } for(j=0;j<8;j++){ matriz[5][j]=letrasM[i][j]; } } else{ switch(caracter){ case 'a': i=0; break; case 'b': i=1; break; case 'c': i=2; break; case 'd': i=3; break; case 'e': i=4; break; case 'f': i=5; break; case 'g': i=6; break; case 'h': i=7; break; case 'i': i=8; break; case 'j': i=9; break; case 'k': i=10; break; case 'l': i=11; break; case 'm': i=12; break; case 'n': i=13; break; case 'o': i=14; break; case 'p': i=15; break; case 'q': i=16; break; case 'r': i=17; break; case 's': i=18; break; case 't': i=19; break; case 'u': i=20; break; case 'v': i=21; break; case 'w': i=22; break; case 'x': i=23; break; case 'y': i=24; break; case 'z': i=25; break; } for(j=0;j<8;j++){ matriz[5][j]=letras_m[i][j]; } } } else{ for(j=0;j<8;j++){ matriz[5][j]=numeros[caracter-'0'][j]; } } } else{ switch(caracter){ case ' ': i=0; break; case '!': i=1; break; case '"': i=2; break; case '#': i=3; break; case '$': i=4; break; case '%': i=5; break; case '&': i=6; break; case '´': i=7; break; //este es el acento case '(': i=8; break; case ')': i=9; break; case '*': i=10; break; case '+': i=11; break; case ',': i=12; break; case '-': i=13; break; case '.': i=14; break; case '/': i=15; break; case ':': i=16; break; case ';': i=17; break; case '>': i=18; break; case '=': i=19; break; case '<': i=20; break; case '?': i=21; break; case '[': i=22; break; case ']': i=23; break; case '^': i=24; break; case '_': i=25; break; case '{': i=26; break; case '|': i=27; break; case '}': i=28; break; case '@': i=29; break; case 'ñ': i=30; break; // esta es la enie case '\f': i=31; break; } for(j=0;j<8;j++){ matriz[5][j]=chars[i][j]; } } }
y el fonts.h:
const int letrasM[26][8]={{48,120,204,204,252,204,204,204}, //A {248,204,204,248,248,204,204,248}, //B {252,192,192,192,192,192,192,252}, //C {240,200,204,204,204,204,200,240}, //D {252,192,192,240,240,192,192,252}, //E {252,192,192,240,240,192,192,192}, //F {60,64,192,192,216,204,204,248}, //G {204,204,204,204,252,204,204,204}, //H {252,48,48,48,48,48,48,252}, //I {252,48,48,48,48,48,176,240}, //J {196,200,208,224,208,204,204,204}, //K {192,192,192,192,192,192,192,252}, //L {238,214,214,198,198,198,198,198}, //M {196,228,244,212,212,204,204,196}, //N {48,204,204,204,204,204,204,48}, //O {248,204,204,204,248,192,192,192}, //P {56,196,196,196,196,212,200,52}, //Q
Para invertir el fondo, se haria de la siguiente manera.
void load_letra(int caracter){ int i,j; if(isalnum(caracter)){ if(isalpha(caracter)){ if(isupper(caracter)) { for(j=0;j<8;j++){ //matriz[5][j]=letrasM[i][j]; matriz[5][j]=letrasM[caracter - 'A'][j]; } } else{ for(j=0;j<8;j++){ //matriz[5][j]=letras_m[i][j]; matriz[5][j]=letras_m[caracter - 'a'][j]; } } } else{ for(j=0;j<8;j++){ matriz[5][j]=numeros[caracter-'0'][j]; } } } else{ switch(caracter){ case ' ': i=0; break; case '!': i=1; break; case '"': i=2; break; case '#': i=3; break; case '$': i=4; break; case '%': i=5; break; case '&': i=6; break; case '´': i=7; break; //este es el acento case '(': i=8; break; case ')': i=9; break; case '*': i=10; break; case '+': i=11; break; case ',': i=12; break; case '-': i=13; break; case '.': i=14; break; case '/': i=15; break; case ':': i=16; break; case ';': i=17; break; case '>': i=18; break; case '=': i=19; break; case '<': i=20; break; case '?': i=21; break; case '[': i=22; break; case ']': i=23; break; case '^': i=24; break; case '_': i=25; break; case '{': i=26; break; case '|': i=27; break; case '}': i=28; break; case '@': i=29; break; case 'ñ': i=30; break; // esta es la enie case '\f': i=31; break; } for(j=0;j<8;j++){ matriz[5][j]=chars[i][j]; } } }
Fuente: http://www.todopic.com.ar/foros/index.php?topic=19091.80
Pagina de referencia: http://www.todopic.com.ar/foros/index.php?topic=30658.0
Tuitear 3.522 Veces leído 1 comentario |
26 agosto 2010 en Electronica | tags: Electronica |
Me parece muy bueno tu proyecto de matriz de leds, yo estoy haciendo mis pininos en la fabricación de un letrero de matriz de led con desplazamiento. Agradeceré si es posible me facilites tu código, para estudiarlo.
gracias