Autor Tema: De matriz de leds, a letrero electronico  (Leído 294998 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado 16f

  • PIC12
  • **
  • Mensajes: 73
Re: De matriz de leds, a letrero electronico
« Respuesta #360 en: 26 de Diciembre de 2011, 03:04:42 »
Hola amigos estoy haciendo una matriz 7 x 72, puedo escribir , pero quiero hacerlo atravez de el puerto serial.
he utilizado la base de programa y circuito de ucontrol, pero me falta hacer la comunicacion.
colocare programa para comunicarme con la pantalla.

Desconectado TDV

  • PIC10
  • *
  • Mensajes: 1
Re: De matriz de leds, a letrero electronico
« Respuesta #361 en: 29 de Enero de 2012, 11:39:59 »
Hola amigos estoy haciendo una matriz 7 x 72, puedo escribir , pero quiero hacerlo atravez de el puerto serial.
he utilizado la base de programa y circuito de ucontrol, pero me falta hacer la comunicacion.
colocare programa para comunicarme con la pantalla.

Hola amigo un saludo, te recomiendo que uses puerto USB ya que que el serial esta prácticamente desapareciendo y son pocas las maquinas que ya traen esta conexión, aunque no tengo un programa a la mano para colocarlo te puedo dar una ayuda. Existen varios tipos de comunicación USB entre las cuales esta: CDC que simula un puerto serial, ya que quieres trabajar con este puerto este te puede servir y con ciertas modificaciones puedes hacer lo que quieres. Saludos

Desconectado edgarantoniobazan

  • PIC10
  • *
  • Mensajes: 5
Re: De matriz de leds, a letrero electronico
« Respuesta #362 en: 02 de Febrero de 2012, 14:04:04 »
tio me parece exelente tu rabajo soy nuevo en el foro, tu codigo en que  programa esta  hecho? io estoy hciendo una matriz parecida pero no me sale, me podrias pasar tu codigo y esquema para realizar tu proyecto mi correo es eabl8230@hotmail. te lo agradeseria mucho tio  y felicitaciones

Desconectado edgarantoniobazan

  • PIC10
  • *
  • Mensajes: 5
Re: De matriz de leds, a letrero electronico
« Respuesta #363 en: 02 de Febrero de 2012, 14:04:44 »



bueno aqui les dejo el video del mismo cartel nadamas que con una eeprom externa
como veran lo unico que cambia es que el mensaje es un poco mas largo.

la fila de hasta abajo se ve encendida no por error si porque ese pin lo utilizo para el clock

ahora estoy investigando los de los registros.

entiendo como enviar ceros y unos de acuerdo a los programas de aitopes, pero no se como implementarlo a mi programa,
por cierto yo no lo hago como cryn que ya tiene fuentes,  :(, solo lo hago leyendo direccion por direccion de la memoria.

ya saben la idea es poder enviar un texto desde la pc via rs232, creo que seria lo de menos. pero bueno paso a paso.

y gracias por las felicitaciones eso me da animos para seguir  :-/

SALUDOS

Desconectado gallo961

  • PIC10
  • *
  • Mensajes: 14
Re: De matriz de leds, a letrero electronico
« Respuesta #364 en: 03 de Junio de 2012, 16:46:55 »
Buenas tardes
necesito de su asesoria
temgo un cartel de 5 filas y 55colomnas multiplexadas com  7 registrso de corrimiento ls 164  y un micro de freescale jm6o ya cargo una letra escrita en toda lamattriz que es visible perfecta en el primero. que rutina utilizo para dividir cada letra de 5x8 puntos en cada registo ls164 y correrlos .
aca adjunto parte del programa donde cargo el dato.
const char Transistores[5]={0b11110,0b11101,0b11011,0b10111,0b01111};


const  char Letras[10]=  { 0b10000001, 0b11101111, 0b11101111,0b11101111,0b11101111, 
                         
                         
                          0b10000001,0b10111111, 0b10000001, 0b10111111,0b10000001};
                       
                                                           
                         
                         
                         
                           
                 

                         
                         
                         
                         
                                   
                         
                     
char PunteroLetras=0;
char PunteroTransistores=0;

void Tarea2(char dato)
{
   
   
  int i,j=1;
  for (i=1;i<8;i++)
   {
   
   
     
 
 
   PTDD_PTDD1 =(j&dato)?1:0;
   
    j=j<<1;
   
   
     
 
   
   
 
   
   
   
 
   PTDD_PTDD0 = 1;
    asm nop
    asm nop
    asm nop
   PTDD_PTDD0 = 0;
   
   
   
  }

}

void Tarea1(void)
{
 PTBD = Transistores[PunteroTransistores];
 Tarea2(Letras[PunteroLetras]);
 PunteroLetras++;
 if (Letras[PunteroLetras]==0) PunteroLetras=0;
  PunteroTransistores++;

 
if (PunteroTransistores==5)PunteroTransistores=0;
 
 
 
}

interrupt 29 void RTCISR(void)
{
 RTCSC_RTIF = 1;


Desconectado gallo961

  • PIC10
  • *
  • Mensajes: 14
Re: De matriz de leds, a letrero electronico
« Respuesta #365 en: 09 de Junio de 2012, 14:38:04 »
hOLA Q TAL .... PRUEBA CON ESTE CODIGO, CON LA MISMA SIMULACION, ESTA AUMENTADO (EN CODIGO) PARA 8 MATRIZ LEDS..LO AUMENTAS EN LA SIMULACION LAS MATRICES Q FALTAN.... ME AVISAS CUALQUIER COSA............SUERT.........

Código: C++
  1. #include <16F628A.h>//cambio de libreria
  2. #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT
  3. #use delay(clock=20M)
  4. #use fast_io(a)
  5. #use fast_io(b)
  6. #include <fonts.h>//fonts
  7. #include <string.h>
  8. #define clock PIN_A1
  9. #define strobe PIN_A2
  10. #define dato PIN_A0
  11. #define size_matriz_col 8  //cantidad de columnas por matriz
  12. #define COLUMNAS 56       //Defino cantidad de columnas a usar
  13. #define matriz_num COLUMNAS/size_matriz_col  //numero de matrices usado
  14.  
  15. #byte portb=6
  16.  
  17. int matriz[matriz_num+1][size_matriz_col]={"\0"};  //Almacena los datos a mostrar en el cartel
  18. int Fila;           //Fila actual a refrescar
  19. int VSync;          //Indica si es momento correcto de modificar lo que se esta mostrando...
  20. int Inhibit;        //Impide que se produzcan cambios en el cartel.
  21.                        
  22. int mensaje[1][20/*42*/]={"*** BIENVENIDOS ***"};  //{};
  23.                          
  24. const int num_msj=1;          
  25. const int msj_length[num_msj]={19};//31--33
  26. int carries[8]/*6*/,msj,letra,desplazos;
  27.  
  28.    int i_desplazar_izq=0;
  29.    int j_desplazar_izq=0;
  30.    int a_desplazar_izq=0;
  31.    
  32.    int contador_cargar=0;
  33.    
  34.    int i,j;
  35.  
  36. void ShowFila(void);
  37. void cargar(int datob);
  38. void desplazar_izq(void);
  39. void load_letra(int caracter);
  40.  
  41. //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...
  42. #int_TIMER0
  43. void  TIMER0_isr(void){
  44. ShowFila();                  //Mostremos la fila actual...
  45. Fila++;
  46. if(Fila==8){
  47.       Fila=0;
  48.       VSync=1;
  49.       if(Inhibit!=0)
  50.       Inhibit--;
  51.       else
  52.       desplazar_izq();
  53.       }  
  54.       else     VSync=0;
  55.       }
  56.      
  57. void main(void){
  58.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
  59.      enable_interrupts(INT_TIMER0);
  60.    clear_interrupt(INT_TIMER0);
  61.    enable_interrupts(GLOBAL);
  62.    //setup_adc(adc_off);
  63.    //setup_adc_ports(no_analogs);
  64.    set_tris_a(0);
  65.    set_tris_b(0);
  66.    output_b(0x01);      //Apago cartel
  67.    output_low(CLOCK);   //Aseguro inicialmente clock en bajo
  68.    output_low(STROBE);
  69.    Fila=0;              //Comienzo por la 1er fila
  70.    Inhibit=5;
  71.    VSync=1;             //Indico que comienzo con sync.
  72.    desplazos=0;
  73.    msj=0;
  74.    while(true){}}
  75.    
  76.    void cargar(int datob){
  77.    //int contador;
  78.    output_low(clock);
  79.    delay_cycles(2);
  80.    output_low(strobe);
  81.    for(contador_cargar=0;contador_cargar<8;contador_cargar++){
  82.    output_bit(dato,(datob & 0x1));
  83.    datob>>=1;
  84.    output_high(clock);
  85.    delay_cycles(1);
  86.    output_low(clock);   }
  87.    output_high(strobe);
  88.    delay_cycles(1);
  89.    output_low(strobe);
  90.    }
  91.    int i_showfila=0;
  92.    void ShowFila(void){
  93.    //int i;
  94.    output_b(0xFF);//*****0xFF
  95.    for(i_showfila=0;i_showfila<7;i_showfila++){//5  6
  96.    cargar(matriz[i_showfila][Fila]);
  97.    }
  98.    bit_clear(portb,fila);//*****clear
  99.    }
  100.    
  101.    void desplazar_izq(void){
  102.    //int i,j,a;
  103.    if(desplazos==8 || desplazos==0){
  104.    load_letra(mensaje[msj][letra]);
  105.    desplazos=0;   }
  106.    for(i_desplazar_izq=0;i_desplazar_izq<8;i_desplazar_izq++){
  107.    for(j_desplazar_izq=0;j_desplazar_izq<=7;j_desplazar_izq++){
  108.    a_desplazar_izq=matriz[j_desplazar_izq][i_desplazar_izq];
  109.    carries[j_desplazar_izq]=shift_left(&a_desplazar_izq,1,0);
  110.    matriz[j_desplazar_izq][i_desplazar_izq]=a_desplazar_izq;      }
  111.    for(j_desplazar_izq=0;j_desplazar_izq<=7;j_desplazar_izq++){
  112.    if(j_desplazar_izq!=7)//5
  113.    matriz[j_desplazar_izq][i_desplazar_izq]|=carries[j_desplazar_izq+1];
  114.    else  
  115.    matriz[j_desplazar_izq][i_desplazar_izq]|=carries[0];
  116.    }  
  117.    }  
  118.    Inhibit=5;
  119.    desplazos++;
  120.    if(desplazos==8){
  121.    letra++;
  122.    if(letra>msj_length[msj])
  123.    letra=0;
  124.    }
  125.    }
  126.    
  127.  void load_letra(int caracter){
  128.  //int i,j;
  129.  if(isalnum(caracter)){
  130.  if(isalpha(caracter)){
  131.  if(isupper(caracter)){
  132.  switch(caracter){
  133.  case 'A': i=0; break;
  134.  case 'B': i=1; break;
  135.  case 'C': i=2; break;
  136.  case 'D': i=3; break;
  137.  case 'E': i=4; break;
  138.  case 'F': i=5; break;
  139.  case 'G': i=6; break;
  140.  case 'H': i=7; break;
  141.  case 'I': i=8; break;
  142.  case 'J': i=9; break;
  143.  case 'K': i=10; break;
  144.  case 'L': i=11; break;
  145.  case 'M': i=12; break;
  146.  case 'N': i=13; break;
  147.  case 'O': i=14; break;
  148.  case 'P': i=15; break;
  149.  case 'Q': i=16; break;
  150.  case 'R': i=17; break;
  151.  case 'S': i=18; break;
  152.  case 'T': i=19; break;
  153.  case 'U': i=20; break;
  154.  case 'V': i=21; break;
  155.  case 'W': i=22; break;
  156.  case 'X': i=23; break;
  157.  case 'Y': i=24; break;
  158.  case 'Z': i=25; break;
  159.  }
  160.  for(j=0;j<8;j++){
  161.  matriz[7][j]=letrasM[i][j];
  162.  }
  163.  }
  164.  else{
  165.  switch(caracter){
  166.  case 'a': i=0; break;
  167.  case 'b': i=1; break;
  168.  case 'c': i=2; break;
  169.  case 'd': i=3; break;
  170.  case 'e': i=4; break;
  171.  case 'f': i=5; break;
  172.  case 'g': i=6; break;
  173.  case 'h': i=7; break;
  174.  case 'i': i=8; break;
  175.  case 'j': i=9; break;
  176.  case 'k': i=10; break;
  177.  case 'l': i=11; break;
  178.  case 'm': i=12; break;
  179.  case 'n': i=13; break;
  180.  case 'o': i=14; break;
  181.  case 'p': i=15; break;
  182.  case 'q': i=16; break;
  183.  case 'r': i=17; break;
  184.  case 's': i=18; break;
  185.  case 't': i=19; break;
  186.  case 'u': i=20; break;
  187.  case 'v': i=21; break;
  188.  case 'w': i=22; break;
  189.  case 'x': i=23; break;
  190.  case 'y': i=24; break;
  191.  case 'z': i=25; break;
  192.  }
  193.  for(j=0;j<8;j++){
  194.  matriz[7/*5*/][j]=letras_m[i][j];
  195.  }
  196.  }
  197.  }
  198.  else{
  199.  for(j=0;j<8;j++){
  200.  matriz[7][j]=numeros[caracter-'0'][j];
  201.  }
  202.  }
  203.  }
  204.  else{
  205.  switch(caracter){
  206.  case ' ': i=0; break;
  207.  case '!': i=1; break;
  208.  case '"': i=2; break;
  209.  case '#': i=3; break;
  210.  case '$': i=4; break;
  211.  case '%': i=5; break;
  212.  case '&': i=6; break;
  213.  case '´': i=7; break;//este es el acento
  214.  case '(': i=8; break;
  215.  case ')': i=9; break;
  216.  case '*': i=10; break;
  217.  case '+': i=11; break;
  218.  case ',': i=12; break;
  219.  case '-': i=13; break;
  220.  case '.': i=14; break;
  221.  case '/': i=15; break;
  222.  case ':': i=16; break;
  223.  case ';': i=17; break;
  224.  case '>': i=18; break;
  225.  case '=': i=19; break;
  226.  case '<': i=20; break;
  227.  case '?': i=21; break;
  228.  case '[': i=22; break;
  229.  case ']': i=23; break;
  230.  case '^': i=24; break;
  231.  case '_': i=25; break;
  232.  case '{': i=26; break;
  233.  case '|': i=27; break;
  234.  case '}': i=28; break;
  235.  case '@': i=29; break;
  236.  case 'ñ': i=30; break;  // esta es la enie
  237.  case '\f': i=31; break;
  238.  }
  239.  for(j=0;j<8;j++){
  240.  matriz[7][j]=chars[i][j];
  241.  }
  242.  }
  243.  }







amigo  la verdad no entendy algunas cosas de su codigo yo lo estoy haciendo en codewarrior pero necesito de su asesoria para cargar cada letra en un registro
aca envion el codigo
const char Transistores[5]={0b11110,0b11101,0b11011,0b10111,0b01111};


const  char Letras[5]=  { 0b10000001,
                           0b10111111,
                           0b10000001,
                           0b10111111,
                           0b10000001,};
                         
                         
                         
                         
                                                           
                         
                         
                         
                           
                 

                         
                         
                         
                         
                                   
                         
                     
char PunteroLetras=1;
char PunteroTransistores=0;

void Tarea2(char dato)
{
   
   
  int i,j=1;
  for (i=0;i<8;i++)                                           
  {
 
   PTDD_PTDD1 = (j&dato)?1:0;
   
    j=j<<1;
 
   
 
   
   
   
 
   PTDD_PTDD0 = 1;
    asm nop
    asm nop
    asm nop
   PTDD_PTDD0 = 0;
   
   
   
  }

}
void Tarea1(void)
{
 PTBD = Transistores[PunteroTransistores];
 Tarea2(Letras[PunteroLetras]);
 PunteroLetras++;
 if (Letras[PunteroLetras]==0) PunteroLetras=0;
  PunteroTransistores++;

 
if (PunteroTransistores==5)PunteroTransistores=0;
 
 
 
}

interrupt 29 void RTCISR(void)
{
 RTCSC_RTIF = 1;

 Tarea1();
 
 
}



extern void _Startup(void);

/* User code */                       
void main(void)

 SOPT1  = 0X20;
 
 PTBDD=0B00011111;                                 
 PTDDD=0B00000111;
 PTBD =0B00001111;
 PTDD= 0B00000100;
 
 PTDD_PTDD2 = 0;
    asm nop                                       
    asm nop
    asm nop
  PTDD_PTDD2 = 1;
 
 RTCMOD       = 32 ;
 RTCSC_RTCLKS = 2 ;
 RTCSC_RTCPS  = 8;       
 RTCSC_RTIF   = 1;
 RTCSC_RTIE   = 1;
 
 
 EnableInterrupts;
 
 
 
 for(;;)
 {
  asm WAIT;
 
 }
}
                         
                         
/*Dummy ISR */
interrupt void Dummy_ISR(void)
{
}



void (* volatile const _UserEntry[])()@0xFABC={
  0x9DCC,             // asm NOP(9D), asm JMP(CC)
  _Startup
};
 
// redirect vector 0xFFC0-0xFFFD to 0xFBC0-0xFBFD
void (* volatile const _Usr_Vector[])()@0xFBC4= {
    RTCISR,           // Int.no.29 RTC               (at FBC4) (at FFC4)
    Dummy_ISR,        // Int.no.28 IIC               (at FBC6) (at FFC6)
    Dummy_ISR,        // Int.no.27 ACMP              (at FBC8) (at FFC8)
    Dummy_ISR,        // Int.no.26 ADC               (at FBCA) (at FFCA)
    Dummy_ISR,        // Int.no.25 KBI               (at FBCC) (at FFCC)
    Dummy_ISR,        // Int.no.24 SCI2 Transmit     (at FBCE) (at FFCE)
    Dummy_ISR,        // Int.no.23 SCI2 Receive      (at FBD0) (at FFD0)
    Dummy_ISR,        // Int.no.22 SCI2 Error        (at FBD2) (at FFD2)
    Dummy_ISR,        // Int.no.21 SCI1 Transmit     (at FBD4) (at FFD4)
    Dummy_ISR,        // Int.no.20 SCI1 Receive      (at FBD6) (at FFD6)
    Dummy_ISR,        // Int.no.19 SCI1 error        (at FBD8) (at FFD8)
    Dummy_ISR,        // Int.no.18 TPM2 Overflow     (at FBDA) (at FFDA)
    Dummy_ISR,        // Int.no.17 TPM2 CH1          (at FBDC) (at FFDC)
    Dummy_ISR,        // Int.no.16 TPM2 CH0          (at FBDE) (at FFDE)
    Dummy_ISR,        // Int.no.15 TPM1 Overflow     (at FBE0) (at FFE0)
    Dummy_ISR,        // Int.no.14 TPM1 CH5          (at FBE2) (at FFE2)
    Dummy_ISR,        // Int.no.13 TPM1 CH4          (at FBE4) (at FFE4)
    Dummy_ISR,        // Int.no.12 TPM1 CH3          (at FBE6) (at FFE6)
    Dummy_ISR,        // Int.no.11 TPM1 CH2          (at FBE8) (at FFE8)
    Dummy_ISR,        // Int.no.10 TPM1 CH1          (at FBEA) (at FFEA)
    Dummy_ISR,        // Int.no.9  TPM1 CH0          (at FBEC) (at FFEC)
    Dummy_ISR,        // Int.no.8  Reserved          (at FBEE) (at FFEE)
    Dummy_ISR,        // Int.no.7  USB Statue        (at FBF0) (at FFF0)
    Dummy_ISR,        // Int.no.6  SPI2              (at FBF2) (at FFF2)
    Dummy_ISR,        // Int.no.5  SPI1              (at FBF4) (at FFF4)
    Dummy_ISR,        // Int.no.4  Loss of lock      (at FBF6) (at FFF6)
    Dummy_ISR,        // Int.no.3  LVI               (at FBF8) (at FFF8)
    Dummy_ISR,           // Int.no.2  IRQ               (at FBFA) (at FFFA)
    Dummy_ISR,        // Int.no.1  SWI               (at FBFC) (at FFFC)
};



#pragma CODE_SEG Bootloader_ROM

void Bootloader_Main(void);

void _Entry(void) {
  PTGD = 0x00;         
  PTGDD = 0xF0;                   //PTG0-3 used for KBI input
   PTGPE = 0x0F;                      //Pull-up enable
 
  // MCG clock initialization, fBus=24MHz
  MCGC2 = 0x36;
  //MCGC2_EREFS=0;
  while(!(MCGSC & 0x02));            //wait for the OSC stable
  MCGC1 = 0x1B;
   MCGC3 = 0x48;
   while ((MCGSC & 0x48) != 0x48);   //wait for the PLL is locked

  // Flash clock
  FCDIV=0x4E;                     // PRDIV8=1; DIV[5:0]=14, flash clock should be 150-200kHz
                                  // bus clock=24M, flash clock=fbus/8/(DIV[5:0]+1)
                                  // bus clock=24M, flash clock=fbus/8/(DIV[5:0]+1)
  if(!PTGD_PTGD0)
  {
    SOPT1 = 0x20;                   // disable COP only if bootloader mod is requested
    // PTG0 is pressed
    USBCTL0=0x44;
    USBCTL0_USBVREN=1;
    Bootloader_Main();            // Bootloader mode
  }
  else
    asm JMP _UserEntry;           // Enter User mode
}

#pragma CODE_SEG default

de momento les presento el 1er código que hice para el 16f88, para que talvez pueda servir a alguien, porque de momento, aunque me duele un poco decirlo, tengo que dejarlo pendiente esto del publik, porque se me presento un proyecto urgente para un amigo, aunque en ratos que pueda le dedicaré al publik :mrgreen:

acá les dejo el 1er código:

Código: C
  1. #include <16f88.h>
  2. #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,MCLR
  3. #use delay(clock=20000000)
  4. #use fast_io(a)
  5. #use fast_io(b)
  6. #include <fonts.h>
  7. #include <string.h>
  8.  
  9. #define clock PIN_A1
  10. #define strobe PIN_A2
  11. #define dato PIN_A0
  12. #define size_matriz_col 8  //cantidad de columnas por matriz
  13. #define COLUMNAS 40       //Defino cantidad de columnas a usar
  14. #define matriz_num COLUMNAS/size_matriz_col  //numero de matrices usado
  15.  
  16. #byte portb=6
  17.  
  18. int matriz[matriz_num+1][size_matriz_col]={"\0"};  //Almacena los datos a mostrar en el cartel
  19. int Fila;           //Fila actual a refrescar
  20. int VSync;          //Indica si es momento correcto de modificar lo que se esta mostrando...
  21. int Inhibit;        //Impide que se produzcan cambios en el cartel.
  22. const int mensaje[1][32]={"Feliz Navidad y Feliz 2009!!..."};
  23. const int num_msj=1;
  24. const int msj_length[num_msj]={31};
  25. int carries[6],msj,letra,desplazos;
  26.  
  27. void ShowFila(void);
  28. void cargar(int datob);
  29. void desplazar_izq(void);
  30. void load_letra(int caracter);
  31.  
  32. //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...
  33. #int_TIMER0
  34. void  TIMER0_isr(void){
  35.  
  36.    ShowFila();                  //Mostremos la fila actual...
  37.    Fila++;
  38.    if(Fila==8){
  39.       Fila=0;
  40.       VSync=1;
  41.       if(Inhibit!=0)
  42.          Inhibit--;
  43.       else
  44.          desplazar_izq();
  45.   }
  46.   else
  47.      VSync=0;
  48. }
  49.  
  50. void main(void){
  51.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
  52.    enable_interrupts(INT_TIMER0);
  53.    clear_interrupt(INT_TIMER0);
  54.    enable_interrupts(GLOBAL);
  55.    setup_adc(adc_off);
  56.    setup_adc_ports(no_analogs);
  57.    set_tris_a(0);
  58.    set_tris_b(0);
  59.    output_b(0xFF);      //Apago cartel
  60.    output_low(CLOCK);   //Aseguro inicialmente clock en bajo
  61.    output_low(STROBE);
  62.    Fila=0;              //Comienzo por la 1er fila
  63.    Inhibit=5;
  64.    VSync=1;             //Indico que comienzo con sync.
  65.    desplazos=0;
  66.    msj=0;
  67.    while(true){}
  68. }
  69.  
  70. void cargar(int datob){
  71.    int contador;
  72.  
  73.    output_low(clock);
  74.    delay_cycles(2);
  75.    output_low(strobe);
  76.    for(contador=0;contador<8;contador++){
  77.       output_bit(dato,(datob & 0x1));
  78.       datob>>=1;
  79.       output_high(clock);
  80.       delay_cycles(1);
  81.       output_low(clock);
  82.    }
  83.    output_high(strobe);
  84.    delay_cycles(1);
  85.    output_low(strobe);
  86. }
  87.  
  88. void ShowFila(void){
  89.    int i;
  90.  
  91.    output_b(0xFF);
  92.    for(i=0;i<5;i++){
  93.       cargar(matriz[i][Fila]);
  94.    }
  95.    bit_clear(portb,fila);
  96. }
  97.  
  98. void desplazar_izq(void){
  99.    int i,j,a;
  100.  
  101.    if(desplazos==8 || desplazos==0){
  102.       load_letra(mensaje[msj][letra]);
  103.       desplazos=0;
  104.    }
  105.    for(i=0;i<8;i++){
  106.       for(j=0;j<6;j++){
  107.          a=matriz[j][i];
  108.          carries[j]=shift_left(&a,1,0);
  109.          matriz[j][i]=a;
  110.       }
  111.       for(j=0;j<6;j++){
  112.          if(j!=5)
  113.             matriz[j][i]|=carries[j+1];
  114.          else
  115.             matriz[j][i]|=carries[0];
  116.       }
  117.    }
  118.    Inhibit=5;
  119.    desplazos++;
  120.    if(desplazos==8){
  121.       letra++;
  122.       if(letra>msj_length[msj])
  123.          letra=0;
  124.    }
  125. }
  126.  
  127. void load_letra(int caracter){
  128.    int i,j;
  129.  
  130.    if(isalnum(caracter)){
  131.       if(isalpha(caracter)){
  132.          if(isupper(caracter)){
  133.             switch(caracter){
  134.                case 'A': i=0; break;
  135.                case 'B': i=1; break;
  136.                case 'C': i=2; break;
  137.                case 'D': i=3; break;
  138.                case 'E': i=4; break;
  139.                case 'F': i=5; break;
  140.                case 'G': i=6; break;
  141.                case 'H': i=7; break;
  142.                case 'I': i=8; break;
  143.                case 'J': i=9; break;
  144.                case 'K': i=10; break;
  145.                case 'L': i=11; break;
  146.                case 'M': i=12; break;
  147.                case 'N': i=13; break;
  148.                case 'O': i=14; break;
  149.                case 'P': i=15; break;
  150.                case 'Q': i=16; break;
  151.                case 'R': i=17; break;
  152.                case 'S': i=18; break;
  153.                case 'T': i=19; break;
  154.                case 'U': i=20; break;
  155.                case 'V': i=21; break;
  156.                case 'W': i=22; break;
  157.                case 'X': i=23; break;
  158.                case 'Y': i=24; break;
  159.                case 'Z': i=25; break;
  160.             }
  161.             for(j=0;j<8;j++){
  162.                matriz[5][j]=letrasM[i][j];
  163.             }
  164.          }
  165.          else{
  166.             switch(caracter){
  167.                case 'a': i=0; break;
  168.                case 'b': i=1; break;
  169.                case 'c': i=2; break;
  170.                case 'd': i=3; break;
  171.                case 'e': i=4; break;
  172.                case 'f': i=5; break;
  173.                case 'g': i=6; break;
  174.                case 'h': i=7; break;
  175.                case 'i': i=8; break;
  176.                case 'j': i=9; break;
  177.                case 'k': i=10; break;
  178.                case 'l': i=11; break;
  179.                case 'm': i=12; break;
  180.                case 'n': i=13; break;
  181.                case 'o': i=14; break;
  182.                case 'p': i=15; break;
  183.                case 'q': i=16; break;
  184.                case 'r': i=17; break;
  185.                case 's': i=18; break;
  186.                case 't': i=19; break;
  187.                case 'u': i=20; break;
  188.                case 'v': i=21; break;
  189.                case 'w': i=22; break;
  190.                case 'x': i=23; break;
  191.                case 'y': i=24; break;
  192.                case 'z': i=25; break;
  193.             }
  194.             for(j=0;j<8;j++){
  195.                matriz[5][j]=letras_m[i][j];
  196.             }
  197.          }
  198.       }
  199.       else{
  200.          for(j=0;j<8;j++){
  201.             matriz[5][j]=numeros[caracter-'0'][j];
  202.          }
  203.       }
  204.    }
  205.    else{
  206.       switch(caracter){
  207.          case ' ': i=0; break;
  208.          case '!': i=1; break;
  209.          case '"': i=2; break;
  210.          case '#': i=3; break;
  211.          case '$': i=4; break;
  212.          case '%': i=5; break;
  213.          case '&': i=6; break;
  214.          case '´': i=7; break; //este es el acento
  215.          case '(': i=8; break;
  216.          case ')': i=9; break;
  217.          case '*': i=10; break;
  218.          case '+': i=11; break;
  219.          case ',': i=12; break;
  220.          case '-': i=13; break;
  221.          case '.': i=14; break;
  222.          case '/': i=15; break;
  223.          case ':': i=16; break;
  224.          case ';': i=17; break;
  225.          case '>': i=18; break;
  226.          case '=': i=19; break;
  227.          case '<': i=20; break;
  228.          case '?': i=21; break;
  229.          case '[': i=22; break;
  230.          case ']': i=23; break;
  231.          case '^': i=24; break;
  232.          case '_': i=25; break;
  233.          case '{': i=26; break;
  234.          case '|': i=27; break;
  235.          case '}': i=28; break;
  236.          case '@': i=29; break;
  237.          case 'ñ': i=30; break;  // esta es la enie
  238.          case '\f': i=31; break;
  239.       }
  240.       for(j=0;j<8;j++){
  241.          matriz[5][j]=chars[i][j];
  242.       }
  243.    }
  244. }

y el fonts.h:
Código: C
  1. const int letrasM[26][8]={{48,120,204,204,252,204,204,204},    //A
  2.                           {248,204,204,248,248,204,204,248},   //B
  3.                           {252,192,192,192,192,192,192,252},   //C
  4.                           {240,200,204,204,204,204,200,240},   //D
  5.                           {252,192,192,240,240,192,192,252},   //E
  6.                           {252,192,192,240,240,192,192,192},   //F
  7.                           {60,64,192,192,216,204,204,248},     //G
  8.                           {204,204,204,204,252,204,204,204},   //H
  9.                           {252,48,48,48,48,48,48,252},         //I
  10.                           {252,48,48,48,48,48,176,240},        //J
  11.                           {196,200,208,224,208,204,204,204},   //K
  12.                           {192,192,192,192,192,192,192,252},   //L
  13.                           {238,214,214,198,198,198,198,198},   //M
  14.                           {196,228,244,212,212,204,204,196},   //N
  15.                           {48,204,204,204,204,204,204,48},     //O
  16.                           {248,204,204,204,248,192,192,192},   //P
  17.                           {56,196,196,196,196,212,200,52},     //Q
  18.                           {248,204,204,204,248,208,200,196},   //R
  19.                           {120,204,192,192,120,12,12,248},     //S
  20.                           {252,48,48,48,48,48,48,48},          //T
  21.                           {204,204,204,204,204,204,204,120},   //U
  22.                           {204,204,204,204,204,204,72,48},     //V
  23.                           {198,198,198,198,198,214,214,238},   //W
  24.                           {132,132,72,48,48,72,132,132},       //X
  25.                           {204,204,204,120,48,48,48,48},       //Y
  26.                           {252,252,8,16,32,64,252,252}};       //Z
  27.  
  28. const int letras_m[26][8]={{0,0,112,136,8,120,136,116},        //a
  29.                            {0,128,128,128,240,136,136,240},    //b
  30.                            {0,0,0,120,128,128,128,120},        //c
  31.                            {0,8,8,8,120,136,136,120},          //d
  32.                            {0,0,0,120,136,240,128,120},        //e
  33.                            {0,96,144,128,128,224,128,128},     //f
  34.                            {0,0,112,136,136,112,8,112},        //g
  35.                            {0,128,128,128,240,136,136,136},    //h
  36.                            {0,0,32,0,32,32,32,32},             //i
  37.                            {0,0,16,0,16,16,144,96},            //j
  38.                            {0,128,144,160,192,160,144,144},    //k
  39.                            {0,32,32,32,32,32,32,32},           //l
  40.                            {0,0,0,136,212,164,164,164},        //m
  41.                            {0,0,0,176,200,136,136,136},        //n
  42.                            {0,0,0,112,136,136,136,112},        //o
  43.                            {0,0,240,136,136,240,128,128},      //p
  44.                            {0,0,120,136,136,120,8,28},         //q
  45.                            {0,0,0,176,192,128,128,128},        //r
  46.                            {0,0,112,136,128,112,8,240},        //s
  47.                            {0,32,32,112,32,32,32,24},          //t
  48.                            {0,0,0,136,136,136,152,104},        //u
  49.                            {0,0,0,136,136,136,80,32},          //v
  50.                            {0,0,0,136,136,136,168,80},         //w
  51.                            {0,0,0,136,80,32,80,136},           //x
  52.                            {0,0,0,136,136,112,16,96},          //y
  53.                            {0,0,0,248,16,32,64,248}};          //z
  54.                            
  55. const int numeros[10][8]={{0,120,132,140,148,164,196,120},     //0
  56.                           {0,16,48,80,16,16,16,124},           //1
  57.                           {0,112,136,8,16,32,64,248},          //2
  58.                           {0,112,136,8,48,8,136,112},          //3
  59.                           {0,8,24,40,72,252,8,8},              //4
  60.                           {0,124,128,128,120,4,4,248},         //5
  61.                           {0,120,128,128,248,132,132,120},     //6
  62.                           {0,252,132,8,16,32,64,64},           //7
  63.                           {0,120,132,132,120,132,132,120},     //8
  64.                           {0,120,132,132,124,4,4,120}};        //9
  65.  
  66. const int chars[31][8]={{0,0,0,0,0,0,0,0},                 //space
  67.                         {0,32,32,32,32,32,0,32},           //!
  68.                         {0,40,40,40,0,0,0,0},              //"
  69.                         {0,36,36,254,40,252,80,80},        //#
  70.                         {0,120,148,144,120,20,148,120},    //$
  71.                         {0,196,204,24,48,96,204,140},      //%
  72.                         {0,96,144,144,96,148,136,116},     //&
  73.                         {0,16,16,16,0,0,0,0},              //'
  74.                         {0,24,32,64,64,64,32,24},          //(
  75.                         {0,96,16,8,8,8,16,96},             //)
  76.                         {0,0,146,84,56,56,84,146},         //*
  77.                         {0,16,16,16,254,16,16,16},         //+
  78.                         {0,0,0,0,0,96,32,64},              //,
  79.                         {0,0,0,0,252,0,0,0},               //-
  80.                         {0,0,0,0,0,0,96,96},               //.
  81.                         {0,4,12,24,48,96,192,128},         //  /
  82.                         {0,0,96,96,0,0,96,96},             //:
  83.                         {0,0,96,96,0,96,32,64},            //;
  84.                         {0,0,192,48,12,48,192,0},          //>
  85.                         {0,0,0,252,0,252,0,0},             //=
  86.                         {0,0,12,48,192,48,12,0},           //<
  87.                         {0,120,132,4,24,16,0,16},          //?
  88.                         {0,56,32,32,32,32,32,56},          //[
  89.                         {0,56,8,8,8,8,8,56},               //]
  90.                         {16,40,68,0,0,0,0,0},              //^
  91.                         {0,0,0,0,0,0,0,254},               //_
  92.                         {0,24,32,32,64,32,32,24},          //{
  93.                         {0,32,32,32,32,32,32,32},          //|
  94.                         {0,96,16,16,8,16,16,96},           //}
  95.                         {56,68,146,170,170,148,64,60},     //@
  96.                         {0,112,0,176,200,136,136,136}};    //ñ

un saludo, espero sirva por ahora

Desconectado gallo961

  • PIC10
  • *
  • Mensajes: 14
Re: De matriz de leds, a letrero electronico
« Respuesta #366 en: 09 de Junio de 2012, 14:51:10 »
hOLA Q TAL .... PRUEBA CON ESTE CODIGO, CON LA MISMA SIMULACION, ESTA AUMENTADO (EN CODIGO) PARA 8 MATRIZ LEDS..LO AUMENTAS EN LA SIMULACION LAS MATRICES Q FALTAN.... ME AVISAS CUALQUIER COSA............SUERT.........

Código: C++
  1. #include <16F628A.h>//cambio de libreria
  2. #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT
  3. #use delay(clock=20M)
  4. #use fast_io(a)
  5. #use fast_io(b)
  6. #include <fonts.h>//fonts
  7. #include <string.h>
  8. #define clock PIN_A1
  9. #define strobe PIN_A2
  10. #define dato PIN_A0
  11. #define size_matriz_col 8  //cantidad de columnas por matriz
  12. #define COLUMNAS 56       //Defino cantidad de columnas a usar
  13. #define matriz_num COLUMNAS/size_matriz_col  //numero de matrices usado
  14.  
  15. #byte portb=6
  16.  
  17. int matriz[matriz_num+1][size_matriz_col]={"\0"};  //Almacena los datos a mostrar en el cartel
  18. int Fila;           //Fila actual a refrescar
  19. int VSync;          //Indica si es momento correcto de modificar lo que se esta mostrando...
  20. int Inhibit;        //Impide que se produzcan cambios en el cartel.
  21.                        
  22. int mensaje[1][20/*42*/]={"*** BIENVENIDOS ***"};  //{};
  23.                          
  24. const int num_msj=1;          
  25. const int msj_length[num_msj]={19};//31--33
  26. int carries[8]/*6*/,msj,letra,desplazos;
  27.  
  28.    int i_desplazar_izq=0;
  29.    int j_desplazar_izq=0;
  30.    int a_desplazar_izq=0;
  31.    
  32.    int contador_cargar=0;
  33.    
  34.    int i,j;
  35.  
  36. void ShowFila(void);
  37. void cargar(int datob);
  38. void desplazar_izq(void);
  39. void load_letra(int caracter);
  40.  
  41. //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...
  42. #int_TIMER0
  43. void  TIMER0_isr(void){
  44. ShowFila();                  //Mostremos la fila actual...
  45. Fila++;
  46. if(Fila==8){
  47.       Fila=0;
  48.       VSync=1;
  49.       if(Inhibit!=0)
  50.       Inhibit--;
  51.       else
  52.       desplazar_izq();
  53.       }  
  54.       else     VSync=0;
  55.       }
  56.      
  57. void main(void){
  58.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
  59.      enable_interrupts(INT_TIMER0);
  60.    clear_interrupt(INT_TIMER0);
  61.    enable_interrupts(GLOBAL);
  62.    //setup_adc(adc_off);
  63.    //setup_adc_ports(no_analogs);
  64.    set_tris_a(0);
  65.    set_tris_b(0);
  66.    output_b(0x01);      //Apago cartel
  67.    output_low(CLOCK);   //Aseguro inicialmente clock en bajo
  68.    output_low(STROBE);
  69.    Fila=0;              //Comienzo por la 1er fila
  70.    Inhibit=5;
  71.    VSync=1;             //Indico que comienzo con sync.
  72.    desplazos=0;
  73.    msj=0;
  74.    while(true){}}
  75.    
  76.    void cargar(int datob){
  77.    //int contador;
  78.    output_low(clock);
  79.    delay_cycles(2);
  80.    output_low(strobe);
  81.    for(contador_cargar=0;contador_cargar<8;contador_cargar++){
  82.    output_bit(dato,(datob & 0x1));
  83.    datob>>=1;
  84.    output_high(clock);
  85.    delay_cycles(1);
  86.    output_low(clock);   }
  87.    output_high(strobe);
  88.    delay_cycles(1);
  89.    output_low(strobe);
  90.    }
  91.    int i_showfila=0;
  92.    void ShowFila(void){
  93.    //int i;
  94.    output_b(0xFF);//*****0xFF
  95.    for(i_showfila=0;i_showfila<7;i_showfila++){//5  6
  96.    cargar(matriz[i_showfila][Fila]);
  97.    }
  98.    bit_clear(portb,fila);//*****clear
  99.    }
  100.    
  101.    void desplazar_izq(void){
  102.    //int i,j,a;
  103.    if(desplazos==8 || desplazos==0){
  104.    load_letra(mensaje[msj][letra]);
  105.    desplazos=0;   }
  106.    for(i_desplazar_izq=0;i_desplazar_izq<8;i_desplazar_izq++){
  107.    for(j_desplazar_izq=0;j_desplazar_izq<=7;j_desplazar_izq++){
  108.    a_desplazar_izq=matriz[j_desplazar_izq][i_desplazar_izq];
  109.    carries[j_desplazar_izq]=shift_left(&a_desplazar_izq,1,0);
  110.    matriz[j_desplazar_izq][i_desplazar_izq]=a_desplazar_izq;      }
  111.    for(j_desplazar_izq=0;j_desplazar_izq<=7;j_desplazar_izq++){
  112.    if(j_desplazar_izq!=7)//5
  113.    matriz[j_desplazar_izq][i_desplazar_izq]|=carries[j_desplazar_izq+1];
  114.    else  
  115.    matriz[j_desplazar_izq][i_desplazar_izq]|=carries[0];
  116.    }  
  117.    }  
  118.    Inhibit=5;
  119.    desplazos++;
  120.    if(desplazos==8){
  121.    letra++;
  122.    if(letra>msj_length[msj])
  123.    letra=0;
  124.    }
  125.    }
  126.    
  127.  void load_letra(int caracter){
  128.  //int i,j;
  129.  if(isalnum(caracter)){
  130.  if(isalpha(caracter)){
  131.  if(isupper(caracter)){
  132.  switch(caracter){
  133.  case 'A': i=0; break;
  134.  case 'B': i=1; break;
  135.  case 'C': i=2; break;
  136.  case 'D': i=3; break;
  137.  case 'E': i=4; break;
  138.  case 'F': i=5; break;
  139.  case 'G': i=6; break;
  140.  case 'H': i=7; break;
  141.  case 'I': i=8; break;
  142.  case 'J': i=9; break;
  143.  case 'K': i=10; break;
  144.  case 'L': i=11; break;
  145.  case 'M': i=12; break;
  146.  case 'N': i=13; break;
  147.  case 'O': i=14; break;
  148.  case 'P': i=15; break;
  149.  case 'Q': i=16; break;
  150.  case 'R': i=17; break;
  151.  case 'S': i=18; break;
  152.  case 'T': i=19; break;
  153.  case 'U': i=20; break;
  154.  case 'V': i=21; break;
  155.  case 'W': i=22; break;
  156.  case 'X': i=23; break;
  157.  case 'Y': i=24; break;
  158.  case 'Z': i=25; break;
  159.  }
  160.  for(j=0;j<8;j++){
  161.  matriz[7][j]=letrasM[i][j];
  162.  }
  163.  }
  164.  else{
  165.  switch(caracter){
  166.  case 'a': i=0; break;
  167.  case 'b': i=1; break;
  168.  case 'c': i=2; break;
  169.  case 'd': i=3; break;
  170.  case 'e': i=4; break;
  171.  case 'f': i=5; break;
  172.  case 'g': i=6; break;
  173.  case 'h': i=7; break;
  174.  case 'i': i=8; break;
  175.  case 'j': i=9; break;
  176.  case 'k': i=10; break;
  177.  case 'l': i=11; break;
  178.  case 'm': i=12; break;
  179.  case 'n': i=13; break;
  180.  case 'o': i=14; break;
  181.  case 'p': i=15; break;
  182.  case 'q': i=16; break;
  183.  case 'r': i=17; break;
  184.  case 's': i=18; break;
  185.  case 't': i=19; break;
  186.  case 'u': i=20; break;
  187.  case 'v': i=21; break;
  188.  case 'w': i=22; break;
  189.  case 'x': i=23; break;
  190.  case 'y': i=24; break;
  191.  case 'z': i=25; break;
  192.  }
  193.  for(j=0;j<8;j++){
  194.  matriz[7/*5*/][j]=letras_m[i][j];
  195.  }
  196.  }
  197.  }
  198.  else{
  199.  for(j=0;j<8;j++){
  200.  matriz[7][j]=numeros[caracter-'0'][j];
  201.  }
  202.  }
  203.  }
  204.  else{
  205.  switch(caracter){
  206.  case ' ': i=0; break;
  207.  case '!': i=1; break;
  208.  case '"': i=2; break;
  209.  case '#': i=3; break;
  210.  case '$': i=4; break;
  211.  case '%': i=5; break;
  212.  case '&': i=6; break;
  213.  case '´': i=7; break;//este es el acento
  214.  case '(': i=8; break;
  215.  case ')': i=9; break;
  216.  case '*': i=10; break;
  217.  case '+': i=11; break;
  218.  case ',': i=12; break;
  219.  case '-': i=13; break;
  220.  case '.': i=14; break;
  221.  case '/': i=15; break;
  222.  case ':': i=16; break;
  223.  case ';': i=17; break;
  224.  case '>': i=18; break;
  225.  case '=': i=19; break;
  226.  case '<': i=20; break;
  227.  case '?': i=21; break;
  228.  case '[': i=22; break;
  229.  case ']': i=23; break;
  230.  case '^': i=24; break;
  231.  case '_': i=25; break;
  232.  case '{': i=26; break;
  233.  case '|': i=27; break;
  234.  case '}': i=28; break;
  235.  case '@': i=29; break;
  236.  case 'ñ': i=30; break;  // esta es la enie
  237.  case '\f': i=31; break;
  238.  }
  239.  for(j=0;j<8;j++){
  240.  matriz[7][j]=chars[i][j];
  241.  }
  242.  }
  243.  }
[quote author=fgaretto link=topic=19091.msg262510#msg262510 date=1280341306
Este es el soft:
#include <16f876a.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#define  DATA    pin_a0
#define  CLOCK   pin_a1
#define  STROBE  pin_a2   

#DEFINE COLUMNAS 40       //Defino cantidad de columnas a usar
int8  Mensaje[COLUMNAS]={126   32   16   32   126   0   62   72   72   72   62
0   64   64   126   64   64   0   126   88   84   114   0   66   126   66   0 
70   74   82   98   66   0
};
 //Almacena los datos a mostrar en el cartel
int8 Mascara[8]={0b10000000,0b01000000,0b00100000,0b00010000,0b00001000,0b00000100,0b00000010,0b00000001};
int8 FILAX[8]={0b11111110,0b11111101,0b11111011,0b11110111,0b11101111,0b11011111,0b10111111,0b01111111};
int8 i,Inicio;
int1 Vsync;
int8 Fila;
int8 Inhibit;
void ShowFila();
void rotar_izq();
#int_TIMER0
void TIMER0_isr(void){
   ShowFila();
   Fila++;
   if(Fila==8){
      Fila=0;
      Vsync=1;
      if(Inhibit!=0) Inhibit-- ; else rotar_izq();
   }
   else
      Vsync=0;
}     
void main(){
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
   enable_interrupts(INT_TIMER0);
   clear_interrupt(INT_TIMER0);
   enable_interrupts(GLOBAL);
   set_tris_a(0);
   set_tris_b(0);
//Apago cartel
   output_b(0xFF);
//Aseguro inicialmente clock en bajo
   output_low(CLOCK);
   output_low(STROBE);
   Fila=0;
   Inhibit=10;
   Vsync=1;
   Inicio=0;
   while(true){}
}
void ShowFila(){
         for(i=Inicio-1;i!=255;i--){
            if((Mensaje & Mascara[Fila])==0) output_low(DATA); else output_high(DATA);
               output_high(CLOCK);
               delay_cycles(1);
               output_low(CLOCK);
         }
         for(i=COLUMNAS-1;i!=Inicio-1;i--){
            if((Mensaje[i-1] & Mascara[Fila])==0) output_low(DATA); else output_high(DATA);
               output_high(CLOCK);
               delay_cycles(1);
               output_low(CLOCK);
         }
         output_b(0xff);
         //output_b(FILAX[Fila]);
         output_high(STROBE);
         delay_cycles(1);   
         output_low(STROBE);
         output_b(FILAX[Fila]);
         
r
   
}
void rotar_izq(){
   Inicio++;
   if(Inicio==COLUMNAS){
      Inicio=0;
   }
}
[/quote]

me haces el favor y me explica la linea de use fast i_(a)y (b ) que aparece en todo el codigo
y como lo hago en codewarrios

Desconectado joemix010

  • PIC10
  • *
  • Mensajes: 4
Re: De matriz de leds, a letrero electronico
« Respuesta #367 en: 07 de Julio de 2012, 16:58:10 »
HOLA
DISCULPEN ALGUIEN ME PUEDE AYUDAR CON ESTE CODIGO LO QUE QUIERO ES DEPLAZAR LA LETRA EN UNA MATRIZ 8X8 
HAY ESTA EL CODIGO QUE ESTOY UTILIZANDO
//Device/Fuses/Etc.---------------------------------
#INCLUDE <16F628A.H>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                       
#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

int letra,contador;
int E_INV   [8]={0xFF,0xFF,0x80,0xB6,0xB6,0xB6,0xFF,0xFF};   //LETRA E INVERSA   (LO QUE ENTIENDO SI QUIERO HACER UN DEPLZAZAMIENTO DERECHA A IZQ TENGO QUE HACER
POR EJEMPLO QUE ↑↑  TENDRIA QUE DEPLAZARSE           ↑↑↑ ACA EN UNA NUEVA LINEA!!! 
                              )   
//
void fConfigurar_puertos(void);
void fRDD_send_data0(void);
void fRDD_send_data1(void);
//--------------------------------------------------
//Main----------------------------------------------
//--------------------------------------------------
void main(){
 
  fConfigurar_puertos();
  output_low(RDD_CLOCK); //RELOJ = Bajo
  output_high(RDD_DATA);
  //
  while (TRUE){
              for(contador=0;contador<=100;contador++)
             {            
             for(letra=0;letra<=7;letra++)
             {
             portb=(E_INV[letra]);                  
             delay_ms(1);                  
            fRDD_send_data0();
             }
             fRDD_send_data1();
             }
         
  }//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);
}
SI ALGUIEN ME AYUDARIA LE AGRADECERIA UN MONTON!!!!!!




GRACIAS

Desconectado ruse85

  • PIC10
  • *
  • Mensajes: 6
Re: De matriz de leds, a letrero electronico
« Respuesta #368 en: 04 de Enero de 2013, 23:31:53 »
hola  buenas noches  salchig  no se si  hay  posibilidad  de  qu eme puedas pasar  el  esquematico  en PDF de tu carte ya  que  no cuento con proteus  para  simular. Gracias  y espero  tu respuesta

Desconectado cmontoya

  • PIC10
  • *
  • Mensajes: 29
Re: De matriz de leds, a letrero electronico
« Respuesta #369 en: 06 de Febrero de 2013, 02:51:30 »


Código: C
  1. #include <16f88.h>
  2. #fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,MCLR
  3. #use delay(clock=20000000)
  4. #use fast_io(a)
  5. #use fast_io(b)
  6. #include <fonts.h>
  7. #include <string.h>
  8.  
  9. #define clock PIN_A1
  10. #define strobe PIN_A2
  11. #define dato PIN_A0
  12. #define size_matriz_col 8  //cantidad de columnas por matriz
  13. #define COLUMNAS 40       //Defino cantidad de columnas a usar
  14. #define matriz_num COLUMNAS/size_matriz_col  //numero de matrices usado
  15.  
  16. #byte portb=6
  17.  
  18. int matriz[matriz_num+1][size_matriz_col]={"\0"};  //Almacena los datos a mostrar en el cartel
  19. int Fila;           //Fila actual a refrescar
  20. int VSync;          //Indica si es momento correcto de modificar lo que se esta mostrando...
  21. int Inhibit;        //Impide que se produzcan cambios en el cartel.
  22. const int mensaje[1][32]={"Feliz Navidad y Feliz 2009!!..."};
  23. const int num_msj=1;
  24. const int msj_length[num_msj]={31};
  25. int carries[6],msj,letra,desplazos;
  26.  
  27. void ShowFila(void);
  28. void cargar(int datob);
  29. void desplazar_izq(void);
  30. void load_letra(int caracter);
  31.  
  32. //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...
  33. #int_TIMER0
  34. void  TIMER0_isr(void){
  35.  
  36.    ShowFila();                  //Mostremos la fila actual...
  37.    Fila++;
  38.    if(Fila==8){
  39.       Fila=0;
  40.       VSync=1;
  41.       if(Inhibit!=0)
  42.          Inhibit--;
  43.       else
  44.          desplazar_izq();
  45.   }
  46.   else
  47.      VSync=0;
  48. }
  49.  
  50. void main(void){
  51.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
  52.    enable_interrupts(INT_TIMER0);
  53.    clear_interrupt(INT_TIMER0);
  54.    enable_interrupts(GLOBAL);
  55.    setup_adc(adc_off);
  56.    setup_adc_ports(no_analogs);
  57.    set_tris_a(0);
  58.    set_tris_b(0);
  59.    output_b(0xFF);      //Apago cartel
  60.    output_low(CLOCK);   //Aseguro inicialmente clock en bajo
  61.    output_low(STROBE);
  62.    Fila=0;              //Comienzo por la 1er fila
  63.    Inhibit=5;
  64.    VSync=1;             //Indico que comienzo con sync.
  65.    desplazos=0;
  66.    msj=0;
  67.    while(true){}
  68. }
  69.  
  70. void cargar(int datob){
  71.    int contador;
  72.  
  73.    output_low(clock);
  74.    delay_cycles(2);
  75.    output_low(strobe);
  76.    for(contador=0;contador<8;contador++){
  77.       output_bit(dato,(datob & 0x1));
  78.       datob>>=1;
  79.       output_high(clock);
  80.       delay_cycles(1);
  81.       output_low(clock);
  82.    }
  83.    output_high(strobe);
  84.    delay_cycles(1);
  85.    output_low(strobe);
  86. }
  87.  
  88. void ShowFila(void){
  89.    int i;
  90.  
  91.    output_b(0xFF);
  92.    for(i=0;i<5;i++){
  93.       cargar(matriz[i][Fila]);
  94.    }
  95.    bit_clear(portb,fila);
  96. }
  97.  
  98. void desplazar_izq(void){
  99.    int i,j,a;
  100.  
  101.    if(desplazos==8 || desplazos==0){
  102.       load_letra(mensaje[msj][letra]);
  103.       desplazos=0;
  104.    }
  105.    for(i=0;i<8;i++){
  106.       for(j=0;j<6;j++){
  107.          a=matriz[j][i];
  108.          carries[j]=shift_left(&a,1,0);
  109.          matriz[j][i]=a;
  110.       }
  111.       for(j=0;j<6;j++){
  112.          if(j!=5)
  113.             matriz[j][i]|=carries[j+1];
  114.          else
  115.             matriz[j][i]|=carries[0];
  116.       }
  117.    }
  118.    Inhibit=5;
  119.    desplazos++;
  120.    if(desplazos==8){
  121.       letra++;
  122.       if(letra>msj_length[msj])
  123.          letra=0;
  124.    }
  125. }
  126.  
  127. void load_letra(int caracter){
  128.    int i,j;
  129.  
  130.    if(isalnum(caracter)){
  131.       if(isalpha(caracter)){
  132.          if(isupper(caracter)){
  133.             switch(caracter){
  134.                case 'A': i=0; break;
  135.                case 'B': i=1; break;
  136.                case 'C': i=2; break;
  137.                case 'D': i=3; break;
  138.                case 'E': i=4; break;
  139.                case 'F': i=5; break;
  140.                case 'G': i=6; break;
  141.                case 'H': i=7; break;
  142.                case 'I': i=8; break;
  143.                case 'J': i=9; break;
  144.                case 'K': i=10; break;
  145.                case 'L': i=11; break;
  146.                case 'M': i=12; break;
  147.                case 'N': i=13; break;
  148.                case 'O': i=14; break;
  149.                case 'P': i=15; break;
  150.                case 'Q': i=16; break;
  151.                case 'R': i=17; break;
  152.                case 'S': i=18; break;
  153.                case 'T': i=19; break;
  154.                case 'U': i=20; break;
  155.                case 'V': i=21; break;
  156.                case 'W': i=22; break;
  157.                case 'X': i=23; break;
  158.                case 'Y': i=24; break;
  159.                case 'Z': i=25; break;
  160.             }
  161.             for(j=0;j<8;j++){
  162.                matriz[5][j]=letrasM[i][j];
  163.             }
  164.          }
  165.          else{
  166.             switch(caracter){
  167.                case 'a': i=0; break;
  168.                case 'b': i=1; break;
  169.                case 'c': i=2; break;
  170.                case 'd': i=3; break;
  171.                case 'e': i=4; break;
  172.                case 'f': i=5; break;
  173.                case 'g': i=6; break;
  174.                case 'h': i=7; break;
  175.                case 'i': i=8; break;
  176.                case 'j': i=9; break;
  177.                case 'k': i=10; break;
  178.                case 'l': i=11; break;
  179.                case 'm': i=12; break;
  180.                case 'n': i=13; break;
  181.                case 'o': i=14; break;
  182.                case 'p': i=15; break;
  183.                case 'q': i=16; break;
  184.                case 'r': i=17; break;
  185.                case 's': i=18; break;
  186.                case 't': i=19; break;
  187.                case 'u': i=20; break;
  188.                case 'v': i=21; break;
  189.                case 'w': i=22; break;
  190.                case 'x': i=23; break;
  191.                case 'y': i=24; break;
  192.                case 'z': i=25; break;
  193.             }
  194.             for(j=0;j<8;j++){
  195.                matriz[5][j]=letras_m[i][j];
  196.             }
  197.          }
  198.       }
  199.       else{
  200.          for(j=0;j<8;j++){
  201.             matriz[5][j]=numeros[caracter-'0'][j];
  202.          }
  203.       }
  204.    }
  205.    else{
  206.       switch(caracter){
  207.          case ' ': i=0; break;
  208.          case '!': i=1; break;
  209.          case '"': i=2; break;
  210.          case '#': i=3; break;
  211.          case '$': i=4; break;
  212.          case '%': i=5; break;
  213.          case '&': i=6; break;
  214.          case '´': i=7; break; //este es el acento
  215.          case '(': i=8; break;
  216.          case ')': i=9; break;
  217.          case '*': i=10; break;
  218.          case '+': i=11; break;
  219.          case ',': i=12; break;
  220.          case '-': i=13; break;
  221.          case '.': i=14; break;
  222.          case '/': i=15; break;
  223.          case ':': i=16; break;
  224.          case ';': i=17; break;
  225.          case '>': i=18; break;
  226.          case '=': i=19; break;
  227.          case '<': i=20; break;
  228.          case '?': i=21; break;
  229.          case '[': i=22; break;
  230.          case ']': i=23; break;
  231.          case '^': i=24; break;
  232.          case '_': i=25; break;
  233.          case '{': i=26; break;
  234.          case '|': i=27; break;
  235.          case '}': i=28; break;
  236.          case '@': i=29; break;
  237.          case 'ñ': i=30; break;  // esta es la enie
  238.          case '\f': i=31; break;
  239.       }
  240.       for(j=0;j<8;j++){
  241.          matriz[5][j]=chars[i][j];
  242.       }
  243.    }
  244. }


Código: C
  1. const int letrasM[26][8]={{48,120,204,204,252,204,204,204},    //A
  2.                           {248,204,204,248,248,204,204,248},   //B
  3.                           {252,192,192,192,192,192,192,252},   //C
  4.                           {240,200,204,204,204,204,200,240},   //D
  5.                           {252,192,192,240,240,192,192,252},   //E
  6.                           {252,192,192,240,240,192,192,192},   //F
  7.                           {60,64,192,192,216,204,204,248},     //G
  8.                           {204,204,204,204,252,204,204,204},   //H
  9.                           {252,48,48,48,48,48,48,252},         //I
  10.                           {252,48,48,48,48,48,176,240},        //J
  11.                           {196,200,208,224,208,204,204,204},   //K
  12.                           {192,192,192,192,192,192,192,252},   //L
  13.                           {238,214,214,198,198,198,198,198},   //M
  14.                           {196,228,244,212,212,204,204,196},   //N
  15.                           {48,204,204,204,204,204,204,48},     //O
  16.                           {248,204,204,204,248,192,192,192},   //P
  17.                           {56,196,196,196,196,212,200,52},     //Q
  18.                           {248,204,204,204,248,208,200,196},   //R
  19.                           {120,204,192,192,120,12,12,248},     //S
  20.                           {252,48,48,48,48,48,48,48},          //T
  21.                           {204,204,204,204,204,204,204,120},   //U
  22.                           {204,204,204,204,204,204,72,48},     //V
  23.                           {198,198,198,198,198,214,214,238},   //W
  24.                           {132,132,72,48,48,72,132,132},       //X
  25.                           {204,204,204,120,48,48,48,48},       //Y
  26.                           {252,252,8,16,32,64,252,252}};       //Z
  27.  
  28. const int letras_m[26][8]={{0,0,112,136,8,120,136,116},        //a
  29.                            {0,128,128,128,240,136,136,240},    //b
  30.                            {0,0,0,120,128,128,128,120},        //c
  31.                            {0,8,8,8,120,136,136,120},          //d
  32.                            {0,0,0,120,136,240,128,120},        //e
  33.                            {0,96,144,128,128,224,128,128},     //f
  34.                            {0,0,112,136,136,112,8,112},        //g
  35.                            {0,128,128,128,240,136,136,136},    //h
  36.                            {0,0,32,0,32,32,32,32},             //i
  37.                            {0,0,16,0,16,16,144,96},            //j
  38.                            {0,128,144,160,192,160,144,144},    //k
  39.                            {0,32,32,32,32,32,32,32},           //l
  40.                            {0,0,0,136,212,164,164,164},        //m
  41.                            {0,0,0,176,200,136,136,136},        //n
  42.                            {0,0,0,112,136,136,136,112},        //o
  43.                            {0,0,240,136,136,240,128,128},      //p
  44.                            {0,0,120,136,136,120,8,28},         //q
  45.                            {0,0,0,176,192,128,128,128},        //r
  46.                            {0,0,112,136,128,112,8,240},        //s
  47.                            {0,32,32,112,32,32,32,24},          //t
  48.                            {0,0,0,136,136,136,152,104},        //u
  49.                            {0,0,0,136,136,136,80,32},          //v
  50.                            {0,0,0,136,136,136,168,80},         //w
  51.                            {0,0,0,136,80,32,80,136},           //x
  52.                            {0,0,0,136,136,112,16,96},          //y
  53.                            {0,0,0,248,16,32,64,248}};          //z
  54.                            
  55. const int numeros[10][8]={{0,120,132,140,148,164,196,120},     //0
  56.                           {0,16,48,80,16,16,16,124},           //1
  57.                           {0,112,136,8,16,32,64,248},          //2
  58.                           {0,112,136,8,48,8,136,112},          //3
  59.                           {0,8,24,40,72,252,8,8},              //4
  60.                           {0,124,128,128,120,4,4,248},         //5
  61.                           {0,120,128,128,248,132,132,120},     //6
  62.                           {0,252,132,8,16,32,64,64},           //7
  63.                           {0,120,132,132,120,132,132,120},     //8
  64.                           {0,120,132,132,124,4,4,120}};        //9
  65.  
  66. const int chars[31][8]={{0,0,0,0,0,0,0,0},                 //space
  67.                         {0,32,32,32,32,32,0,32},           //!
  68.                         {0,40,40,40,0,0,0,0},              //"
  69.                         {0,36,36,254,40,252,80,80},        //#
  70.                         {0,120,148,144,120,20,148,120},    //$
  71.                         {0,196,204,24,48,96,204,140},      //%
  72.                         {0,96,144,144,96,148,136,116},     //&
  73.                         {0,16,16,16,0,0,0,0},              //'
  74.                         {0,24,32,64,64,64,32,24},          //(
  75.                         {0,96,16,8,8,8,16,96},             //)
  76.                         {0,0,146,84,56,56,84,146},         //*
  77.                         {0,16,16,16,254,16,16,16},         //+
  78.                         {0,0,0,0,0,96,32,64},              //,
  79.                         {0,0,0,0,252,0,0,0},               //-
  80.                         {0,0,0,0,0,0,96,96},               //.
  81.                         {0,4,12,24,48,96,192,128},         //  /
  82.                         {0,0,96,96,0,0,96,96},             //:
  83.                         {0,0,96,96,0,96,32,64},            //;
  84.                         {0,0,192,48,12,48,192,0},          //>
  85.                         {0,0,0,252,0,252,0,0},             //=
  86.                         {0,0,12,48,192,48,12,0},           //<
  87.                         {0,120,132,4,24,16,0,16},          //?
  88.                         {0,56,32,32,32,32,32,56},          //[
  89.                         {0,56,8,8,8,8,8,56},               //]
  90.                         {16,40,68,0,0,0,0,0},              //^
  91.                         {0,0,0,0,0,0,0,254},               //_
  92.                         {0,24,32,32,64,32,32,24},          //{
  93.                         {0,32,32,32,32,32,32,32},          //|
  94.                         {0,96,16,16,8,16,16,96},           //}
  95.                         {56,68,146,170,170,148,64,60},     //@
  96.                         {0,112,0,176,200,136,136,136}};    //ñ



Hola amigos
Primero que todo doy gracias a Cryn por su gran código y aporte.
Para mi proyecto me base en ese código y utilice un 16f877A  +4 matrices 8x8 + 8 – bc327+
 4 74HC164
El proyecto en sí funciona perfecto, el único defecto que veo  es que alcanza a parpadear un poco
Sera que hay alguna forma para reducir este parpadeo
Y otra cosa para que sirve el strobe porque para mis 74HC164 no lo utilizo
Gracias.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: De matriz de leds, a letrero electronico
« Respuesta #370 en: 06 de Febrero de 2013, 15:44:56 »
Citar
Para mi proyecto me base en ese código y utilice un 16f877A  +4 matrices 8x8 + 8 – bc327+
 4 74HC164
El proyecto en sí funciona perfecto, el único defecto que veo  es que alcanza a parpadear un poco
Sera que hay alguna forma para reducir este parpadeo
Y otra cosa para que sirve el strobe porque para mis 74HC164 no lo utilizo


Utiliza un registro de desplazamiento con latches, como el 74HC595, en vez del 74HC164, y no tendrás esos problemas.
Strobe (en el chip 4094), es la patilla que controla el latch.
El latch controla un registro de almacenamiento intermedio que carga los bits que va recibiendo, en cuanto has cargado los 8 bits, les das salida a los 8 a la vez poniendo la patilla Strobe a nivel alto (Strobe en el 4094,  STCP en el 74HC595).




Desconectado cmontoya

  • PIC10
  • *
  • Mensajes: 29
Re: De matriz de leds, a letrero electronico
« Respuesta #371 en: 06 de Febrero de 2013, 21:13:10 »

Utiliza un registro de desplazamiento con latches, como el 74HC595, en vez del 74HC164, y no tendrás esos problemas.
Strobe (en el chip 4094), es la patilla que controla el latch.
El latch controla un registro de almacenamiento intermedio que carga los bits que va recibiendo, en cuanto has cargado los 8 bits, les das salida a los 8 a la vez poniendo la patilla Strobe a nivel alto (Strobe en el 4094,  STCP en el 74HC595).



Gracias por el consejo voy a probar con el 595 aver como me va
Saludos

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: De matriz de leds, a letrero electronico
« Respuesta #372 en: 07 de Febrero de 2013, 09:59:02 »
espero no llegar tarde...
Si mi mente no me falla el pin de STROBE en los registros de desplazamiento sirve para una vez que el registro reciba los datos en sus entradas activamos el strobe y lo muestra en su salida...
en la pagina de Ucontrol hay un articulo que se llama Usando el "CD4094 para manejar displays 7 segmentos"
y justo en una linea comenta : "Como se usará un display 7 segmentos, lo mejor es ver el dato completo una vez finalizada la transferencia. Entonces STROBE en un nivel alto mientras enviamos los datos. Con ello garantizamos que el display no muestre valores “extraños” hasta que no pongamos STROBE en bajo, instante que se transferirán los 8 bits completos a los latches de salida."
te recomiendo que leas ese articulo que es interesante.-

Para reducir el parpadeo tienes que aumentar la velocidad de refresco, si los refrescos son de 50 HZ (20ms por pasada) el ojo no lo va a detectar, yo arme una matriz también http://www.todopic.com.ar/foros/index.php?topic=33681.0 pero de 7x32, y bueno solucione el parpadeo haciendo eso, pero ojo también al hacer un refresco muy rápido porque eso produce que los led no enciendan tanto.-

Saludos.-
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: De matriz de leds, a letrero electronico
« Respuesta #373 en: 07 de Febrero de 2013, 10:44:01 »
Entonces STROBE en un nivel alto mientras enviamos los datos. Con ello garantizamos que el display no muestre valores “extraños” hasta que no pongamos STROBE en bajo, instante que se transferirán los 8 bits completos a los latches de salida."


Yo creo que es justo al contrario.
Extraido del datasheet del CD4094 de Fairchild:

"The output of each stage of the shift register feeds a latch, which latches data on the negative edge of the STROBE input. When STROBE is HIGH, Data propagates through the latch to 3-STATE output gates."




Desconectado cmontoya

  • PIC10
  • *
  • Mensajes: 29
Re: De matriz de leds, a letrero electronico
« Respuesta #374 en: 19 de Febrero de 2013, 16:41:23 »
Hola amigos

En el código de Cryn  para extender más el letrero  simplemente se anexaba el número de matrices a utilizar y el número de columnas y listo.

El problema es que al hacer esta modificación no  pasa nada sigue funcionando con sus 5 matrices original
Como puede resolver esto??