Matriz 8x40 + pulsadores

#1
Hola amigos.
Tengo ganas de hacer un Publik o también conocido como matriz 8x40, pero la idea que tengo es hacerlo y que se puede programar mediante pulsadores.
Me explico mejor una matriz en la cual mediante pulsadores (digamos 4 pulsadores – un pulsador vocales- un pulsador consonantes y otro pulsador números, etc.)de tal formar el mensaje que se muestra el la matriz se pueda formar mediante pulsadores sin necesidad de sacar el micro, yo sé que es necesario el uso de una memoria.
Me gustaría saber donde puede encontrar información ha cerca de estas matrices o Publik???? O algún código ???? o con que nombre las puedo encontrar…
Gracias por sus comentarios y ojala los códigos no sean en assembler
 
#2
Mejor haz un interface de teclado ps2, es sencillo y está muy documentado con ejemplos de soft y hard.
 
#4
Supongo que será para un juego de adivinar las palabras ocultas, o para un cartel gigante de publicidad donde la publicidad vaya cambiando a gusto..

Acá lo tienen los colectivos y bueno...son de led's...
 
#5
Hola amigos.
Gracias por sus consejos.(y)
Ya que estoy aprendiendo a programar en C con el hi-tech, estoy tratando de hacer un publick –matrix 8x32 el problema que tengo en estos momentos es que el mensaje que se muestra parpadea será que me falta algo?? En el código o esta algo mal???

------------------------------------------------------------------------------------------
Código:
#include <htc.h>
#define _XTAL_FREQ 4000000//declaramos que la frecuencia del microncontrolador es 4mhz 
#define CLOCK RD0
#define DATO RD1
#define RESET RD2
__CONFIG(0x2F41);
//---------------------------------------------------------
//VARIABLES DONDE SE ENCUENTRA LAS LETRAS                                  /
//---------------------------------------------------------

const int ALFA[4][8]={255, 255, 96, 48, 48, 96, 255, 255,//M
                                    0, 255, 255, 219, 219, 195, 3, 0,//E
                                    63, 127, 200, 200, 200, 127, 63, 0,//A
                                      0, 248, 252, 6, 3, 6, 252, 248};//V
/*****************************************************************************/
int MAX;        //Variable que se va usar en la funcion "CLEAR"
int CONT=0;        //variable que se va usar en la funcion "HABILITO"
int Fila;
int Columna=0;

void config(void){
        TRISB=0x00;
        PORTB=0x00;
        TRISD=0x00;
        PORTD=0x00;
}
//---------------------------------------------------------
//FUNCION DE TE PERIMITE ENVIAR UN CERO O UNO                          /
//---------------------------------------------------------
void SEND_DATA(short DATA){
        RD1=(DATO,DATA);
        RD0=(CLOCK,0);
        RD0=(CLOCK,1);
}
//----------------------------------------------------------
//FUNCION DE BORRADO                                                                                /
//----------------------------------------------------------

void CLEAR(void){
        for(MAX=1;MAX<=32;MAX++){                //25 ES EL MAXIMO DE->
                SEND_DATA(0);                                //->COLUMNAS
        }
}
//-----------------------------------------------------------
//                        PROGRAMA PRINCIPAL                                                                /
//-----------------------------------------------------------
void main(void){
                config(); //Configuramos puertos
                RD2=(RESET,1);
                CLEAR();
                SEND_DATA(1);
                //while( RD0){
for(;;){
                        for(Fila=0;Fila<=7;Fila++){
                                PORTB=(~ALFA[Columna][Fila]);
                                __delay_ms(1);
                                SEND_DATA(0);
                        }
                        Columna++;
                        if(Columna==4){
                                Columna=0;
                                SEND_DATA(1);
                        }
                }
}
Agradezco cualquier correcion!!!
 

Adjuntos

#7
Si debe ser la velocidad del multiplexado...si supera los 24Hz el ojo ya no lo notará...pero para estar seguros, podés tirarlo a 50Hz o más...y listo.
 
#9
NO

4MHz es la frecuencia del reloj...nosotros te deciamos la velocidad de muestreo de los led's..

y no son Mega Hertz...son sólo Hertz!!

el ojo humano a 24 hertz o 24 muestras por segundo ya se confunde y ve una sola imagen...

pero si lo haces más rápido aún es mejor..
 
#11
Hola amigos

Tengo este código para una matriz para que muestre el texto desplazándose pero tengo un problemas………como puedo eliminar el parpadeo ?????? ya probé con todos los delay pero no doy con el chistes hasta aumente el xtal a 8Mhz pero nada, además si aumento los caracteres (dígitos) se pronuncia todavía mas el parpadeo que puede estar pasando??:confused:


Código:
#include <htc.h>
#define _XTAL_FREQ 8000000//declaramos que la frecuencia del microncontrolador es 4mhz 
#define CLK RA0
#define DATA RA2
#define RESET RA1
__CONFIG(0x2F42);
int CONT=0;


void config(void){
      ADCON1=0x06;
      TRISB=0x00;
      TRISA=0x00;
}
void DATA0(void){
      RA2=(DATA,0);
      RA0=(CLK,0);
      __delay_us(2);
      RA0=(CLK,1);
      __delay_us(2);
}
void DATA1(void){
       RA2=(DATA,1);
      RA0=(CLK,0);
      __delay_us(2);
      RA0=(CLK,1);
    __delay_us(2);
     
}


void MOVER(void){
                if(CONT==0) DATA0();        //ENVIO DATA 0 O 1
              else DATA1(); 

}

       const int  caracter[10][8]={0xFF ,0x81 ,0x7A ,0x76, 0x6E ,0x5E ,0x81 ,0xFF ,
                                  0xFF, 0x81,0x6E ,0x6E ,0x6E ,0x9F ,0xFF ,0xFF , 
                                  0xFF ,0x91 ,0x6E ,0x6E ,0x6E ,0x91 ,0xFF ,0xFF, 
                                  0xFF ,0x3F ,0x5F ,0x6F ,0x70 ,0x7F ,0x7F ,0xFF,
                                  0xFF ,0x71 ,0x6E ,0x6E ,0x6E ,0x6E ,0x81 ,0xFF,  
                                  0xFF ,0x71 ,0x6E ,0x6E ,0x6E ,0x6E ,0x9E ,0xFF,  
                                  0xFF ,0xF7 ,0x0 ,0x77 ,0xB7 ,0xD7 ,0xE7 ,0xFF,  
                                  0xFF, 0xFF, 0x91, 0x6E, 0x6E, 0x7E, 0xBD, 0xFF,
                                  0xFF,0xFF, 0x9E, 0x6E, 0x76, 0x7A, 0xBC, 0xFF ,
                                  0xFF, 0xFE, 0xFE, 0x0, 0x0, 0x9E, 0xDE, 0xFF};//"cero" 



void main(void){
unsigned int K;
K=sizeof(caracter);
//unsigned char M;


      int i;   //Hasta 7 digitos
      int j=0; // HAsta 25 digito
      config();
      RA1=(RESET,1);  // "ON"
      RA0=(CLK,0);
      RA2=(DATA,0);
for(;;){
     
  

/************************************************/
            for(i=0;i<=7;i++){
            // for(M=0;M>=5;M++){
               PORTB=~caracter[j][i];         //cero
               __delay_ms(1);//Parpadeo
             MOVER();  //funcion de corrimiento
if(CONT>=sizeof(caracter));
                                CONT++;
                                if(CONT==79)CONT=0;
                        }
                       j++;
                        if(j==10) j=0;

	}
}
 

Adjuntos

#12
solo lo vi a grosso modo pero creo que el delay esta muy elevado... necesitas hacerlo mas pequeño, desconozco si existe una instruccion delay_us pero podrias usarla

Tambien el problema puede estar en que tu programa esta en C.... desafortunadamente C no es un lenguaje que ahorre recursos, por lo que las rutinas tienen a ser mas faciles de entender pero tardan mucho mas tiempo en ejecutarse y requieren mas memoria... para eliminar eso podrias usar el TMR0 para generar interrupciones...
 
Arriba