

#include<16f877a.h>
#include <STRING.h>
#use delay(clock=4000000)
#use standard_io(b)
#use standard_io(A)
#use standard_io(c)
#use standard_io(d)
#byte portc=7				//DIRECCIONAMIENTO DE PUERTOS
#byte portb=6
#byte portD=8
#byte portA=5
#byte	set_tris_A = 85
#byte	set_tris_b = 86
#byte	set_tris_c = 87
#byte	set_tris_D = 88
#use rs232 (BAUD=9600 , XMIT=PIN_C6 , RCV=PIN_C7 , BITS=8)          // Definicin del RS232


char LETRA;
char cadena[7]={'P','U','B','L','I','K'};//ALMACENA 50 CARACTERES, SIEMPRE ADICIONO 1 AL TAMAO DE LA CADENA
long int valor,I, CARACTER,T=0;
signed long CONTA, desplace, desplace2;

//LETRAS REPRESENTADAS POR EL MODO EN Q LAS COLUMNAS DEBEN ILUMINARSE, GESTIONADAS POR EL PIC, EMPIEZA ASI 8.7.6.5.4.3.2.1
 //VISTAS DEDERECHA A IZQIERDA DE FRENTE A LA MATRIZ DE 8X8,  PERO SE PROGRAMAN D ARRIBA PARA ABAJO, ES DECIR, LED 1.2.3.4.5.6.7.8
 // (los ceros son los leds q se iluminan) por ejemplo para el primer segmento de la letra 'A'el portb=filas debe mandar el dato 127
 //y el portc=columnas debe mandar el 1, y asi sucesivamente hasta q las columnas lleguen a 8,EL noveno valor FF LIMPIA LA MATRIZ,
 //Este mecanismo, ejecutado muchas veces en un segundo, nos permitir percibir que la letra A est quieta all y
 // que se forma toda junta y de una sola vez
int const letra_A[9]={0b10000000,0b01110111,0b01110111,0b01110111,0b01110111,0b01110111,0b01110111,0b10000000,0b11111111};
int const letra_B[9]={0b10010001,0b01101110,0b01101110,0b01101110,0b01101110,0b01101110,0b01101110,0b00000000,0b11111111};
int const letra_C[9]={0b10111101,0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,0b10000001,0b11111111};
int const letra_D[9]={0b11000011,0b10111101,0b01111110,0b01111110,0B01111110,0B01111110,0B01111110,0b00000000,0b11111111};
int const letra_E[9]={0b01111110,0b01101110,0b01101110,0b01101110,0b01101110,0b01101110,0b01101110,0b00000000,0b11111111};
int const letra_F[9]={0b01111111,0b01101111,0b01101111,0b01101111,0b01101111,0b01101111,0b01101111,0b00000000,0b11111111};
int const letra_G[9]={0b10110001,0b01110110,0b01110110,0b01110110,0b01111110,0b01111110,0b01111110,0b10000001,0b11111111};
int const letra_H[9]={0b00000000,0b11101111,0b11101111,0b11101111,0b11101111,0b11101111,0b11101111,0b00000000,0b11111111};
int const letra_I[9]={0b01111110,0b01111110,0b01111110,0b00000000,0b00000000,0b01111110,0b01111110,0b01111110,0b11111111};
int const letra_J[9]={0b01111111,0b01111111,0b01111111,0b00000001,0b00000000,0b01111110,0b01111110,0b01111110,0b11111111};
int const letra_K[9]={0b01111110,0b10111101,0b11011011,0b11100111,0b11110111,0b11110111,0b11110111,0b00000000,0b11111111};
int const letra_L[9]={0b11111111,0b11111110,0b11111110,0b11111110,0b11111110,0b11111110,0b11111110,0b00000000,0b11111111};
int const letra_M[9]={0b00000000,0b10111111,0b11011111,0b11101111,0b11101111,0b11011111,0b10111111,0b00000000,0b11111111};
int const letra_N[9]={0b00000000,0b11111101,0b11111011,0b11110111,0b11101111,0b11011111,0b10111111,0b00000000,0b11111111};
int const letra_O[9]={0b10000001,0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,0b10000001,0b11111111};
int const letra_P[9]={0b10011111,0b01101111,0b01101111,0b01101111,0b01101111,0b01101111,0b01101111,0b00000000,0b11111111};
int const letra_Q[9]={0b10000000,0b01111100,0b01111010,0b01111110,0b01111110,0b01111110,0b01111110,0b10000001,0b11111111};
int const letra_R[9]={0b10011110,0b01101101,0b01101011,0b01100111,0b01101111,0b01101111,0b01101111,0b00000000,0b11111111};
int const letra_S[9]={0b10110001,0b01101110,0b01101110,0b01101110,0b01101110,0b01101110,0b01101110,0b10011101,0b11111111};
int const letra_T[9]={0b01111111,0b01111111,0b01111111,0b00000000,0b00000000,0b01111111,0b01111111,0b01111111,0b11111111};
int const letra_U[9]={0b00000001,0b11111110,0b11111110,0b11111110,0b11111110,0b11111110,0b11111110,0b00000001,0b11111111};
int const letra_V[9]={0b00000111,0b11111011,0b11111101,0b11111110,0b11111110,0b11111101,0b11111011,0b00000111,0b11111111};
int const letra_W[9]={0b00000011,0b11111101,0b11111110,0b11110001,0b11110001,0b11111110,0b11111101,0b00000011,0b11111111};
int const letra_X[9]={0b01111110,0b10111101,0b11011011,0b11100111,0b11100111,0b11011011,0b10111101,0b01111110,0b11111111};
int const letra_Y[9]={0b00111111,0b11011111,0b11101111,0b11110000,0b11110000,0b11101111,0b11011111,0b00111111,0b11111111};
int const letra_Z[9]={0b01111110,0b00111110,0b01011110,0b01101110,0b01110110,0b01111010,0b01111100,0b01111110,0b11111111};
int const letra_ [9]={0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111};


void Configurar_puertos(void);
void send_data0(void);
void Send_data1(void);
void rota(void);
void letra_usb(void);
void ceros(void);


void main() {

Configurar_puertos();


 do{

//letra=getc();
//getS(CADENA);  //ALMACENA LA CADENA DE TEXTO, 50 CARACTERES EN ESTE CASO, no borra los caracteres con backspace, ojo arreglar

T=strlen (CADENA); //CUENTA EL # D CARACTERES EN CADENA

for(CARACTER=0;CARACTER<T;CARACTER++){ //SACA LA FRASE DESPUES DEL ENTER, D LETRA POR LETRA HASTA LLEGAR A T, CUENTA ESPACIOS TAMBIEN
    LETRA=cadena[CARACTER];


////////////////////////////////////SE DESPLAZA HACIA LA DERECHA REDUCIENDO SENDATA0/////////////////////////////////////////////////////////////////////////////////7

   for (desplace=1;desplace<10;desplace++){   //# de ceros q se envian al registro para implementar el movimiento del texto

   for (conta=0;conta<20;conta++){ //REPINTA LA LETRA APROX 1 (1msx8x100) SEGUNDO
   ceros();    //para q aparezca por la derecha
   for (i=0;i<9; i++){ //barrido del 74595, rota las columnas, i es un indicador d la tabla
   letra_usb();      //LLAMA LA TABLA
   delay_ms(1);      //RETIENE LA INTERSECCION DE LA COLUMNA Y LA FILA, OSEA UN PUNTO D LA MATRIZ
   send_data1();

  }
   }
   }

}
}

while (TRUE);

}


////////////////////////////FUNCIONES//////////////////////////////////////////////////////////////////

void Configurar_puertos(void){
   set_tris_B(0x00);          //PORTB como SALIDA PARA MANEJAR FILAS
   set_tris_d(0x00);          //Puerto D COMO SALIDA PARA EL 74164 REGISTRO DE DESPLAZAMIENTO
   output_b(0x00);            //BORRAR FILAS
   output_d(0x00);            //BORRAR REGISTRO , LIMPIAR MEJOR DICHO!!
}

void send_data0(void){
   output_low(pin_d0);     //pongo en 0 data, este es el bit q se rota, osea las columnas
   output_low(pin_d1);     //pongo en 0 clock,
   delay_us(2);            //espero 2us
   output_high(pin_d1);    //pongo en 1 clock,
   delay_us(2);            //espero 2us, En este punto el dato entra efectivamente en el registro de desplazamiento.
}

void send_data1(void){
   output_high(pin_d0);    //pongo en 1 data, este es el bit q se rota, osea las columnas
   output_low(pin_d1);     //pongo en 0 clock,
   delay_us(2);            //espero 2us
   output_high(pin_d1);    //pongo en 1 clock,
   delay_us(2);            //espero 2us, En este punto el dato entra efectivamente en el registro de desplazamiento.
}

void letra_usb(void){
switch(letra){
case 'A': output_b(letra_A[i]); break;
case 'B': output_b(letra_B[i]); break;
case 'C': output_b(letra_C[i]); break;
case 'D': output_b(letra_D[i]); break;
case 'E': output_b(letra_E[i]); break;
case 'F': output_b(letra_F[i]); break;
case 'G': output_b(letra_G[i]); break;
case 'H': output_b(letra_H[i]); break;
case 'I': output_b(letra_I[i]); break;
case 'J': output_b(letra_J[i]); break;
case 'K': output_b(letra_K[i]); break;
case 'L': output_b(letra_L[i]); break;
case 'M': output_b(letra_M[i]); break;
case 'N': output_b(letra_N[i]); break;
case 'O': output_b(letra_O[i]); break;
case 'P': output_b(letra_P[i]); break;
case 'Q': output_b(letra_Q[i]); break;
case 'R': output_b(letra_R[i]); break;
case 'S': output_b(letra_S[i]); break;
case 'T': output_b(letra_T[i]); break;
case 'U': output_b(letra_U[i]); break;
case 'V': output_b(letra_V[i]); break;
case 'W': output_b(letra_W[i]); break;
case 'X': output_b(letra_X[i]); break;
case 'Y': output_b(letra_Y[i]); break;
case 'Z': output_b(letra_Z[i]); break;
case ' ': output_b(letra_ [i]); break;
}
}

void ceros(void){
switch(desplace){


case 9: send_data0();break;
case 8: send_data0();send_data0(); break;
case 7: send_data0();send_data0();send_data0(); break;
case 6: send_data0();send_data0();send_data0();send_data0(); break;
case 5: send_data0();send_data0();send_data0();send_data0();send_data0(); break;
case 4: send_data0();send_data0();send_data0();send_data0();send_data0();send_data0(); break;
case 3: send_data0();send_data0();send_data0();send_data0();send_data0();send_data0();send_data0(); break;
case 2: send_data0();send_data0();send_data0();send_data0();send_data0();send_data0();send_data0();send_data0(); break;
case 1: send_data0();send_data0();send_data0();send_data0();send_data0();send_data0();send_data0();send_data0(); send_data0();break;

}
}

