Desde 1994 en la Red. La pagina de los aficionados a la electronica, informatica y otras curiosidades de la vida. No dudes en visitarnos.
Ahora 0 visitas.| 3484493 Visitas (desde Dic. 2011), hoy: 327 Visitas 1000 Pag. Vistas , ultimos 36 dias: 11188 Visitas. 38212 Pag. Vistas. Tu IP: 3.145.177.173
Que ando curioseando:
AutosuficienciaCosas de casaElectronicaEn InternetInformáticaMundo MisticoSin categoríaSociedadTe lo recomiendo

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

Comentarios (1)

Jose Torres Rendon26 agosto 2014 at 23:24

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

Escribe un comentario

Tu comentario