Proyecto de matricez 5x7 con microcontrolador

Hola, como estan? Necesito una ayuda de como puedo hacer un aviso con mi nombre juntando 5 matrices 5x7, el aviso tiene que correr de derecha a izquierda , la verdad necesito que me guien en la logica de programacion o que me colaboren con un programa en c, estoy utilizando el pic 18f452 y lo estoy programando en mplab c18, Alguien propone alguna idea? agradezco su ayuda ...
 
Última edición:
es que es algo complicado de entender.

te puedo decir lo siguiente:

la matriz en realidad es un harware muy simple
las filas pueden ser manejadas por un puerto de 8 bits en este caso el puerto B
este puerto solo hara un barrido de arriba a abajo o de abajo para arriba es lo unico que va a hacer.

la parte de las columnas es con registros de corrimiento el 75hc595 en cascada
es decir este se comportara como un super puerto de muchos pines.

la idea es que de un jalon escribas varios caracteres y las filas van a ir dibujando linea alinea.

el software.

esa es la parte mas dificil de la matriz.

la idea es tener todas las letras mapeadas en memoria, es decir dibujar todas las letras en ROM
luego tener un buffer para contener una frase

digamos : FOROS DE ELECTRONICA.

esa frase debe ocupar texto en la matriz pero para eso se necesitan varios buffers para contener filas y columnas , estos buffers deben tener el ancho de memoria que van a ocupar nuestros registros de corrimiento.

se va a jugar con el desplazamiento de los buffers y esto hace el scroll en la pantalla
 
Llevo esto:
PHP:
#include<p18f452.h>
#include<delays.h>
unsigned char apuntador=0;
unsigned char letras[5]={0x7E,0x09,0x09,0x09,0x7E};
unsigned char rotar[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
int t,a=0,c=0,d=0,e=0,ti=0,li=0,a1=0,o=0;
void subrutina()
{
    PORTB=letras[apuntador];
    apuntador++;
    if(apuntador==5)
    {    
        apuntador=0;
    }
}

void main (void)
{
    ADCON1=0x07;
    TRISA=0x00;
    TRISB=0x00;
    TRISC=0x00;
    TRISD=0x00;
    TRISE=0x00;
    while(1)
    {     
        ti=0;
        t=1;
        PORTB=0xFF;
        while(ti<=30)
        {
    
        while(a<6)
         {
            subrutina();
            PORTA=rotar[a];
            Delay1KTCYx(t);
            PORTA=0xFF;

            
            a++;
            PORTC=0xFF;
            PORTD=0xFF;
            PORTE=0xFF;
        }

        while(c<8)
         {
            subrutina();
            PORTC=rotar[c];
            Delay1KTCYx(t);
            PORTC=0xFF;
            

            c++;
            PORTA=0xFF;
            PORTD=0xFF;
            PORTE=0xFF;
        }

        while(d<8)
         {
            subrutina();
            PORTD=rotar[d];
            Delay1KTCYx(t);
            PORTD=0xFF;
            

            d++;
            PORTC=0xFF;
            PORTA=0xFF;
            PORTE=0xFF;
        }

        while(e<3)
         {
            subrutina();
            PORTE=rotar[e];
            Delay1KTCYx(t);
            PORTE=0xFF;
            

            e++;
            PORTC=0xFF;
            PORTD=0xFF;
            PORTA=0xFF;
        }
        a=0;
        c=0;
        d=0;
        e=0;
        ti++;
        }
                a=a+1;
                c=c+1;
                d=d+1;
                e=e+1;    
    }
}
Pero no sé cómo hacer para meter las letras que quiera sin que aparezcan a la vez.
¿Qué dicen?
 
no nada que ver

no se que hardware tengas construido pero lo elemental es hacer uso de registros de corrimiento.

te dejo un link para que puedas hecharle un ojo, ponen un codigo que bien el algoritmo funciona, pero hacer copypaste no se puede pues esta hecho para arduino y hay funciones que no funcionan del todo bien.

mira revisa esta pagina estudiala y me cuentas las dudas que te salgan.

http://embedded-lab.com/blog/making-a-8x40-led-matrix-marquee-using-shift-registers/

yo me base en el algoritmo de esa pagina para poder hacer funcionar esta matriz led bicolor


claro hay que hacer una serie de modificaciones para que funcione bien.
 
Muchas gracias por tu colaboración. Ya logré hacerlo.
Manejo el software de MPLAB y utilizo un PIC18F452

Dejo la programación por si alguien le quiere echar un ojo.

Gracias

PHP:
#include<p18f452.h>
#include<delays.h>
unsigned char apuntador=0;
unsigned char letras[231]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x2A,0x1C,0x08,0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x3E,0x04,0x08,0x3E,0x00,0x3E,0x22,0x1C,0x00,0x3E,0x0A,0x36,0x00,0x3E,0x2A,0x22,0x00,0x2E,0x2A,0x3A,0x00,0x00,0x3E,0x41,0x41,0x41,0x41,0x00,0x3C,0x0A,0x0A,0x3C,0x00,0x3E,0x04,0x08,0x04,0x3E,0x00,0x22,0x3E,0x22,0x00,0x3E,0x20,0x20,0x00,0x1C,0x22,0x22,0x1C,0x00,0x00,0x21,0x41,0x3F,0x01,0x01,0x1C,0x22,0x22,0x1C,0x00,0x3E,0x0A,0x34,0x00,0x3C,0x0A,0x0A,0x3C,0x00,0x3E,0x04,0x08,0x04,0x3E,0x00,0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x3C,0x0A,0x0A,0x3C,0x00,0x3E,0x04,0x08,0x04,0x3E,0x00,0x22,0x3E,0x22,0x00,0x3E,0x0A,0x34,0x00,0x3E,0x2A,0x22,0x00,0x32,0x2A,0x26,0x00,0x00,0x3F,0x02,0x04,0x02,0x3F,0x00,0x3E,0x2A,0x22,0x00,0x3E,0x0A,0x34,0x00,0x1C,0x22,0x22,0x00,0x3E,0x08,0x3E,0x00,0x3C,0x0A,0x0A,0x3C,0x00,0x3E,0x04,0x08,0x3E,0x00,0x00,0x22,0x26,0x1A,0x00,0x22,0x12,0x0E,0x00,0x0E,0x08,0x3E,0x00,0x22,0x26,0x1A,0x00,0x34,0x2A,0x24};
unsigned char rotar[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
int t,a=0,c=0,d=0,e=0,ti=0,barrido=0;

void subrutina()
{
    
    PORTB=letras[apuntador];
    apuntador++;
    if(barrido==200)
    {
        barrido=0;
        apuntador=0;
    }

}

void main (void)
{
    ADCON1=0x07;
    TRISA=0x00;
    TRISB=0x00;
    TRISC=0x00;
    TRISD=0x00;
    TRISE=0x00;
    while(1)
    {     

        t=2;
        PORTB=0xFF;

        while(a<6)
         {
            subrutina();
            PORTA=rotar[a];
            Delay1KTCYx(t);
            PORTA=0xFF;

            
            a++;
            PORTC=0xFF;
            PORTD=0xFF;
            PORTE=0xFF;
        }

        while(c<8)
         {
            subrutina();
            PORTC=rotar[c];
            Delay1KTCYx(t);
            PORTC=0xFF;
            

            c++;
            PORTA=0xFF;
            PORTD=0xFF;
            PORTE=0xFF;
        }

        while(d<8)
         {
            subrutina();
            PORTD=rotar[d];
            Delay1KTCYx(t);
            PORTD=0xFF;
            

            d++;
            PORTC=0xFF;
            PORTA=0xFF;
            PORTE=0xFF;
        }

        while(e<3)
         {
            subrutina();
            PORTE=rotar[e];
            Delay1KTCYx(t);
            PORTE=0xFF;
            

            e++;
            PORTC=0xFF;
            PORTD=0xFF;
            PORTA=0xFF;
        }
        a=0;
        c=0;
        d=0;
        e=0;
        apuntador=apuntador-24;
        barrido++;
    }
}
 
Última edición por un moderador:
Atrás
Arriba