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 8 visitas.| 3619005 Visitas (desde Dic. 2011), hoy: 359 Visitas 1285 Pag. Vistas , ultimos 36 dias: 13305 Visitas. 41052 Pag. Vistas. Tu IP: 216.73.216.26
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

COMUNICACION SERIE CON PIC (16f84) Estadisticas de www.pesadillo.com

    • Próximas publicaciones...

      No hay art�culos programados.



      1418 Commentarios en 2,186 Articulos. | En moderacion: 282 | Aprovados: 482 | Spam: 654 | Pendientes: 0