Autor Tema: matriz de leds  (Leído 2133 veces)

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

Desconectado henrydav_o

  • PIC10
  • *
  • Mensajes: 7
matriz de leds
« en: 24 de Enero de 2013, 20:38:15 »
Estimados Amigos foreros encontre un codigo que pude probar en el uso de una matriz de leds de 8x8 con exito sin embargo tengo una duda en el codigo aqui esta:

#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4M)
#define clock pin_b0
#define dato pin_b1
#define reset pin_b2
const int alfa[]={0xFC,0XFE,0X1B,0X19,0X1B,0XFE,0XFC,0X00};//letra A
int max,letra;
int cont=0,c=0;

void send_data(short data){
   output_bit(dato,data);
   output_bit(clock,0);
   delay_us(2);
   output_bit(clock,1); 
}

void clear(){
   for(max=1;max<=8;max++){
      send_data(1);
   }
}

void main(){
   set_tris_c(0x00);
   output_c(0x00);
   set_tris_b(0x00);
   output_b(0x00);
   output_bit(reset,1);
   send_data(0);
   while(1){
      for(letra=0;letra<8;letra++){
         output_c(~alfa[letra]);
         delay_ms(5);
         send_data(1);
      }
    send_data(0); // ESTA LINEA NO ENTIENDO QUE HACE
   }
   
}


He eliminado la linea comentada y no funciona la matriz  :? , a mi parecer lo unico que hace es un desplazamiento de un dato 0, pero estoy confundido, porfavor si alguien me puede explicar

aqui mando el esquematico en proteus que funciona de maravilla




Desconectado henrydav_o

  • PIC10
  • *
  • Mensajes: 7
Re: matriz de leds
« Respuesta #1 en: 25 de Enero de 2013, 13:45:44 »
Amigos foreros envio otro codigo para el manejo de 4 displays tambien tengo algunas dudas  :mrgreen:

#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4M)
#define clock pin_b0
#define dato pin_b1
#define reset pin_b2

const int alfa[4][8]={0XFF,0XFF,0X18,0X18,0X18,0XFF,0XFF,0X00 //H
                      0X7E,0XFF,0XC3,0XC3,0XC3,0XFF,0X7E,0X00 //O
                      0XFF,0XFF,0XC0,0XC0,0XC0,0XC0,0XC0,0X00 //L
                      0XFC,0XFE,0X1B,0X19,0X1B,0XFE,0XFC,0X00}; //A

int max;
int cont=0;
int fila;
int columna=0;

void send_data(short data){
   output_bit(dato,data);
   output_bit(clock,0);
   output_bit(clock,1);
}

void clear(){
   for(max=1;max<=32;max++){
      send_data(0);
   }
}
 
void main(){
   set_tris_c(0x00);
   output_c(0x00);
   set_tris_b(0x00);
   output_b(0x00);
   output_bit(reset,1);
   clear();
   send_data(1);
   while(1){
      for(fila=0;fila<=7;fila++){
         output_c(~alfa[columna][fila]);
         delay_ms(1);
         send_data(0); // PORQUE NO SE ENVIA send_data(1), como el ejm anterior
      }
      columna++;
      if(columna==4){
         columna=0;
         send_data(1); // CUAL ES SU USO
      }
   }
}



De igual manera me sirvio y funciona bien envio la imagen en proteus

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: matriz de leds
« Respuesta #2 en: 27 de Enero de 2013, 23:47:34 »
Haber mi lenguaje c lo tengo bastante abandonado, haber si recuerdo...


#include <16f876.h>  //
#fuses XT,NOWDT     //fusible para reloj de hasta 4mhz, y desactivamos el watchdog
#use delay(clock=4M) //decimos que tenemos un cristal de 4 mhz
#define clock pin_b0   //al pin B0 del pic lo llamamos CLOCK
#define dato pin_b1  // al pin B1 lo llamamos DATO
#define reset pin_b2  //pin B2 llamamos RESET
const int alfa[]={0xFC,0XFE,0X1B,0X19,0X1B,0XFE,0XFC,0X00};//letra A
int max,letra;
int cont=0,c=0;

//SUB RUTINA PARA MANEJO DE REGISTRO DE DESPLAZAMIENTO

void send_data(short data)
{
   output_bit(dato,data);  //al pin B1(dato) le asignamos el valor que viene en DATA
   output_bit(clock,0);      //al pin B0 le damos el valor de 0
   delay_us(2);             //esperamos 2 us
output_bit(clock,1);//1 el pin B0 para que en el registro de desplazamiento aparezca un 0 en la primer salida
}

void clear(){
   for(max=1;max<=8;max++){
      send_data(1);
   }
}

void main(){
   set_tris_c(0x00);      //puerto C como salida
   output_c(0x00);       //todas las salidas del puerto C a 0
   set_tris_b(0x00);      //puerto B como salida
   output_b(0x00);       //todas las salidas del puerto B a 0
   output_bit(reset,1);  //pin B2 a 1
   send_data(0);         //sub rutina enviamos el dato 0
   
while(1)       //bucle infinito

     {
         for(letra=0;letra<8;letra++)//ciclo for contador asendente de 0 a 7
           {
             output_c(~alfa[letra]); //array alfa busca el valor (letra) y lo carga en el puerto c
             delay_ms(5);    //espera 5 ms (que para mi es mucho)
             send_data(1);   //envia un 1 a la rutina para que se pase a la siguiente columna en el registro de desplazamiento
           }
      send_data(0); //vuelve a cargar un 0 en el registro de desplazamiento.-
     }
   
}


Entonces estan conectados los Ánodos de los led a las salidas del puerto C y los Cátodos a los pines del registro de desplazamiento, entonces cuando en uno de los pines del registro se encuentra en 0 y el puerto C del pic tenga pines en 1 se van a encender algunos led, ahora si yo inserto 1 y 1 y 1 en el registro de desplazamiento llega en un momento que estan todos los pines en alto y por ende los led no encienden, entonces el SEND_DATA(0); hace que vuelva a ponerse en 0 un pin del registro para encender los led.-

nose si te confundi o ayude, cualquier cosa a disposicion.-

Saludos.-
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo

Desconectado henrydav_o

  • PIC10
  • *
  • Mensajes: 7
Re: matriz de leds
« Respuesta #3 en: 28 de Enero de 2013, 12:14:39 »
Hola Korpaztk gracias por responder si es cierto el puerto C actua como anodo y el catodo es el registro en el primer ejemplo( solo la letra A) para que la displaye se niega el dato y se desplaza un 1(send_data(1)) 8 veces por letra y luego se manda un 0; en el segundo ejemplo de igual forma se niega el dato y se desplaza con 0(send_data(0)) 8 veces por letra y al finalizar cada letra se envia un 1, es decir es lo contrario al ejemplo anterior, cual es la explicacion de que este ultimo funcione  8) y porque se tiene que enviar un dato al finalizar los 8 envios para una letra, gracias por el interes

 :mrgreen:

Saludosssss

Desconectado henrydav_o

  • PIC10
  • *
  • Mensajes: 7
Re: matriz de leds
« Respuesta #4 en: 28 de Enero de 2013, 12:24:07 »
Envio los archivos de los codigos y simulaciones para que puedan utilizarlos. :-/

Saludos

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: matriz de leds
« Respuesta #5 en: 28 de Enero de 2013, 12:43:31 »
Hola a todos, al ver tu código creo que estas realizando el barrido por columnas, yo tengo una matriz hecha de esa forma, el problema radica en que si la longitud de la matriz es larga, el parpadeo sera evidente ya que tiene que refrescar todas las columnas, estoy intentando pasar un codigo similar para realizar el barrido por las filas pero no entiendo la logica si alguien que lea este comentario me desea ayudar se lo agradecería bastante ya que estoy perdido en la forma de mostrar varias letras y desplazarlas, gracias
« Última modificación: 28 de Enero de 2013, 12:46:04 por camhost1 »

Desconectado henrydav_o

  • PIC10
  • *
  • Mensajes: 7
Re: matriz de leds
« Respuesta #6 en: 28 de Enero de 2013, 13:07:25 »
Hola camhost1 te envio el programa que hice para el desplazamiento  :mrgreen:, pero aun tengo la duda de los envios de 1 o 0  despues de la letra, he pensado lo que comentas pero si agrego dos ceros o dos unos no funciona por lo menos en el proteus si fuera el refresco se notaria algo no?  :D .

Bueno espero que te sirva los archivos

Saludossss

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: matriz de leds
« Respuesta #7 en: 28 de Enero de 2013, 13:30:31 »
Hola henrydav_o, te agradezco tu disposición a ayudarme,  al leer el código veo que el barrido es por las columnas, cuando uno amplia la matriz por ej: a 8x64 el parpadeo se nota bastante, de casualidad no encontraste ese codigo en un pdf?? si es asi ese programa tiene el siguiente problema, el alista el dato y habilita la columna, lo muestra y apag toda las demas columnas hasta que repita el ciclo y continue con el siguiente dato, entonces se va a ver aun mas el parpadeo, si piensas hacer una matriz real y de digamos 8x64 o mas grande te recominedo que mejor intentes cambiar a barrido por filas. chauu saludos..........

Desconectado henrydav_o

  • PIC10
  • *
  • Mensajes: 7
Re: matriz de leds
« Respuesta #8 en: 28 de Enero de 2013, 13:54:33 »
ok camhost1 entonces el envio del 1 o 0 es para apagar todo y asi alistar el siguiente dato que bueno saberlo, si el programa lo saque de un pdf, queria ver como funcionaba, entonces el barrido por columnas no es util, bueno vere como se hace por filas para probarlo y notar la diferencia gracias por la ayuda  ((:-))

Saludos

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: matriz de leds
« Respuesta #9 en: 29 de Enero de 2013, 09:51:16 »
Hola henrydav_o, si quieres pasate por el tema que cree http://www.todopic.com.ar/foros/index.php?topic=40049.0, ahí estoy tratando la matriz de led de barrido por filas, para que veas los avances que estoy realizando, y también aportes de los foreros  o los tuyos que estas investigando igual que yo sobre el tema :mrgreen:, dos cabezas piensan mas que una y me podrías ayudar a mejorar el programa que estoy usando. Cuidate y espero verte comentando en mi tema......

Desconectado korpaztk

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 202
Re: matriz de leds
« Respuesta #10 en: 29 de Enero de 2013, 14:02:50 »
si utilizan mplab para programar, tienen una funcion para poder car4gar un archivo de proteus, y asi simularlo paso a paso y poder comprender que es lo que hace realmente, a mi me ha ayudado muchisimo.-
Korpaz.
Técnico Electronico.

El Papel Es Mi Mejor Psicologo