//escrito para ccs 4 por Jose luna//
//joseluna2003@cantv.net//
#include "C:\Users\monica\Documents\projectos con pic en ccs\16f887\led-mat-rs232-16f887.h"
#include <string.h>
#define PORT_BASE_ADDRESS 0x40 //direccion del expansor i2c pcf8574
int1 flag2=0; // bandera indicadora de ultimo caracter en la cadena mensaje
int1 flag=0; // reconocer si el caracter a mostrar es de 5x4 o de 5x5, escir si termina en una columna blanca o no
int8 t1=2; //tiempo del delay o duracion de la secuencia
int8 p=20; //veces que se ejecuta cada escena o frame de la animacion de scroll antes de pasar a la siguiente escena o frame
int8 cont3=0; //contador de veces que se ha mostrado un frame o escena
int8 cont2=0; // contador que se incrementa hasta encontrar la posicion en la tabla de un caracter solicitado
int1 e=0; //solo una variable para conocer el estado de un diodo activado por la interrupcion externa para comprobar que funciona
char mensaje[50]="on"; // variable tipo array o cadena de caracteres contiene lo que debe mostrarse en la matriz
int8 const lenbuff=32; // longitud del buffer, esta parte es tomada de un ejemplo de redpic que fue el ultimo que intente hacer funcionar
int1 flag3=0; // el flag 3 inidica que se introdujo un dato por el rs232
int xbuff=0x00; // Índice: siguiente char en cbuff
char cbuff[lenbuff]; // Buffer
char rcvchar=0x00; // último caracter recibido
////////////////////////
///letras de 5x4 y 5x5//
////////////////////////
//cada letra contiene en orden las lineas que deben activarse para cada una de las 5 columnas
const char letras[27][6]={
{'a',0x1f,0x05,0x05,0x1f,0x00},
{'b',0x1f,0x15,0x15,0x0a,0x00},
{'c',0x0e,0x1b,0x11,0x11,0x00},
{'d',0x1f,0x11,0x1b,0x0e,0x00},
{'e',0x1f,0x1f,0x15,0x15,0x00},
{'f',0x1f,0x1f,0x05,0x05,0x00},
{'g',0x1f,0x11,0x15,0x1d,0x00},
{'h',0x1f,0x1f,0x04,0x1f,0x00},
{'i',0x11,0x1f,0x1f,0x11,0x00},
{'j',0x19,0x11,0x1f,0x11,0x00},
{'k',0x1f,0x04,0x0a,0x11,0x00},
{'l',0x1f,0x1f,0x10,0x10,0x00},
{'m',0x1f,0x02,0x06,0x02,0x1f},
{'n',0x1f,0x06,0x0c,0x1f,0x00},
{'o',0x1f,0x11,0x11,0x1f,0x00},
{'p',0x1f,0x1f,0x05,0x07,0x00},
{'q',0x0f,0x09,0x1d,0x09,0x0f},
{'r',0x1f,0x05,0x0d,0x1f,0x17},
{'s',0x17,0x15,0x15,0x1d,0x00},
{'t',0x01,0x1f,0x1f,0x01,0x00},
{'u',0x1f,0x10,0x10,0x1f,0x00},
{'v',0x03,0x06,0x18,0x06,0x03},
{'w',0x1f,0x08,0x06,0x08,0x1f},
{'x',0x11,0x1b,0x04,0x11,0x1b},
{'y',0x01,0x12,0x0c,0x03,0x00},
{'z',0x19,0x1d,0x17,0x13,0x00},
{' ',0x00,0x00,0x00,0x00,0x00}
};
int8 lineas=0; //variable que indica con los 5 primeros bits las lineas que deben activarse(1 para linea activa)
unsigned int8 pcf=0; //variable que controla el puerto del expansor, es decir se envia por i2c(L1,L2,L3,C1,C2,C3,C4,C5)
int1 bita2=0; // variable que maneja la lina 4(L4)
int1 bita4=0; //variable que maneja la linea 5(L5)
//funcion para escribir en el puerto completo del expansor
void write_to_port(unsigned char data_byte)
{
i2c_start();
i2c_write(PORT_BASE_ADDRESS);
i2c_write(data_byte);
i2c_stop();
}
//funcion para escribir en la matriz de leds de 5x5 donde (se debe introducir el byte del puerto y los bits de los pines a2 y a4)
void write_to_mat5x5(int8 pcf,int1 bita2, int1 bita4){
write_to_port(pcf);
output_bit (pin_A0, bita2);
output_bit (pin_A1, bita4);
}
//funcion que muestra con scroll una cadena de caracteres introducida
void escribir_en_matriz(char mensaje[]){
int8 col[5]; //array que contiene todos los bytes que representan las lineas activas para cada columna
col[0]=0; //col[0] debe contener el byte que maneja todas las lineas activas para determinado caracter en la columna 0
col[1]=0; //col[1] debe contener el byte que maneja todas las lineas activas para determinado caracter en la columna 1
col[2]=0;
col[3]=0;
col[4]=0;
int8 tam_cad
=strlen(mensaje
); // determina el tamaño de la cadena
int8 cont=0; //inicializa el contador 0 que indicara en que caracter de la cadena mensaje estamos posicionados
for(cont=0;cont<tam_cad;cont++){ //este bucle ejecuta el codigo de la funcion tantas veces como el tamaño de la cadena
a1: // inicio de la funcion
if(cont==(tam_cad-1)){flag2=1;} //determina si esta en el ultimo caracter de la cadena
int1 coin=0; //esta variable determina la coincidencia encontrada entre el caracter en evaluacion de la cadena mensaje y la posicion en la tabla
while (coin==0) //ejecuta esta parte del codigo hasta que encuentra la posicion del caracter en la tabla
if (mensaje[cont]==letras[cont2][0]){ //si encuentra la coincidencia hace esto
coin=1;
int8 i=0;
int8 pos=0; //variable que guarda la posicion que ocupa el caracter dentro de la tabla
pos=cont2;
int8 r=0; // es aqui donde se genera el scroll
for(r=0;r<5;r++){
col[0]=col[1];
col[1]=col[2];
col[2]=col[3];
col[3]=col[4];
col[4]=letras[pos][r+1];
while(cont3<p){
for(i=0;i<5;i++){
lineas=col[i];
if(lineas==0&&pos!=26&&i==4){flag=1;goto salida_espacio_vacio;}
//se encarga de crear las variables que se necesitan para introducirlas en la funcion write to matrix por cada columna
if (bit_test(lineas,0)){bit_clear(pcf,7);}else{bit_set(pcf,7);}
if (bit_test(lineas,1)){bit_clear(pcf,6);}else{bit_set(pcf,6);}
if (bit_test(lineas,2)){bit_clear(pcf,5);}else{bit_set(pcf,5);}
if (bit_test(lineas,3)){bita2=0;}else{bita2=1;}
if (bit_test(lineas,4)){bita4=0;}else{bita4=1;}
bit_clear(pcf,0);
bit_clear(pcf,1);
bit_clear(pcf,2);
bit_clear(pcf,3);
bit_clear(pcf,4);
bit_set(pcf,i);
write_to_mat5x5(pcf,bita2,bita4);
delay_ms(t1);
if(pos==26&&i==2){;goto blanco;} //evalua si se trata de un espacio vacio y se dirije a la seccion del programa que denomine blanco
}
cont3++;
}
salida_espacio_vacio:
cont3=0;
if(flag==1){flag=0;cont++;cont2=0;cont3=0;if(flag2==0){goto a1;}else{flag2=0;}}
}
if(letras[pos][6]!=0x00){
blanco:
col[0]=col[1];
col[1]=col[2];
col[2]=col[3];
col[3]=col[4];
col[4]=0;
int j=0;
for(j=0;j<40;j++){
for(i=0;i<5;i++){
lineas=col[i];
if (bit_test(lineas,0)){bit_clear(pcf,7);}else{bit_set(pcf,7);}
if (bit_test(lineas,1)){bit_clear(pcf,6);}else{bit_set(pcf,6);}
if (bit_test(lineas,2)){bit_clear(pcf,5);}else{bit_set(pcf,5);}
if (bit_test(lineas,3)){bita2=0;}else{bita2=1;}
if (bit_test(lineas,4)){bita4=0;}else{bita4=1;}
bit_clear(pcf,0);
bit_clear(pcf,1);
bit_clear(pcf,2);
bit_clear(pcf,3);
bit_clear(pcf,4);
bit_set(pcf,i);
write_to_mat5x5(pcf,bita2,bita4);
delay_ms(t1);}}
}
cont2=0;
}else{
cont2++;
}
}
}
void addcbuff(char c){
cbuff[xbuff++]=c;
}
#int_RDA
void serial_isr() {
printf("int rs232 iniciado \r\n"); printf("introduzca la frase a mostrar \r\n"); rcvchar=0x00; // Inicializo caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar
=getc(); // lo descargo y ... addcbuff(rcvchar);
}
printf("int rs232 finalizado \r\n"); printf("mensaje= ,%s",mensaje
); }
#int_EXT
void EXT_isr(void)
{
printf("int ext iniciado \r\n"); if (e==0){output_bit(pin_A2,1);e=1;}else{
output_bit(pin_A2,0);e=0;}
printf("int ext finalizado\r\n");
flag3=1;
}
void inicbuff(void){ // Inicia a cbuff -------------------
int i;
for(i=0;i<lenbuff;i++){ // Bucle que pone a 0 todos los
cbuff[ i ]=0x00; // caracteres en el buffer
}
xbuff=0x00; // Inicializo el indice de siguiente
// caracter
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
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);// This device COMP currently not supported by the PICWizard
enable_interrupts(INT_RDA);
disable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
setup_oscillator(OSC_8MHZ);
ext_int_edge(H_TO_L);
printf("buffer iniciado \r\n"); inicbuff();
write_to_mat5x5(0b00011111,0,0);
delay_ms(1000*t1);
printf("programa iniciado \r\n");
flag=0;
//buble infinito
while(true){
enable_interrupts(INT_EXT);
enable_interrupts(INT_RDA);
printf("bucle iniciado \r\n"); printf("mensaje= ,%s",mensaje
);
escribir_en_matriz(mensaje);
}
}