Este programa sirve para demostrar el control de una matriz de 5x7 de forma estática, se crearon 8 letras en el estándar ASCII para matrices de 5x7, la palabra escrita es "ELECTGPL " se puede modificar por cualquier letra o bien agregarle mas o quitarle algunas.
El programa se realiza en dos etapas, la principal donde se realiza el multiplexado de las columnas y se muestran los valores de cada fila a una velocidad de 10ms y la interrupción por desbordamiento del timer, dentro de la interrupción se alojan los caracteres dentro de un switch el cual servirá para ir cambiando entre cada letra, ya que al final de cada caso tiene un contador "letra++" el cual será el valor a testear por el switch, a medida que se recorra cada una de las 5 columnas se incrementara en 1 la variable letra, de esta forma pasara al siguiente paso, por consiguiente la siguiente letra, la ultima letra en lugar de incrementar en 1, iguala a cero la variable letra, entonces comenzara de nuevo.
El tiempo esta dado por set_timer1(1000), es totalmente configurable a gusto del desarrollador.
Como el circuito utilizado es el más sencillo posible para que se encienda un Led debe existir un 1 y un 0 de cada lado de la matriz, se podría haber usado el selector de columnas como 0b11111110, 0b11111101, etc... Pero para comprenderlo fácil se utilizo un 1 donde se quiere encender, para que no salga la letra negada en la matriz se utilizo el operando "~" delante del vector de las filas, de esta forma complementa el valor de la variable para que se vea correctamente.
Para utilizar más columnas debería utilizarse mas salidas, como podemos imaginarnos, podríamos hacer una matriz de 8x8 con dos puertos del PIC, pero se puede hacer más grande implementando registros de desplazamiento serie/paralelo, como el 74164, 74595, 4094, etc... Estos integrados reciben los datos de las columnas de forma serial y lo despliegan en paralelo en sus salidas, los mismos se pueden concatenar para hacer matrices más grandes, estos integrados se controlan mediante un Clock de sincronismo, un Dato donde se enviaran los valores seriales, y un Reset que pondrá el puerto paralelo de los registros a ceros.
El programa se realiza en dos etapas, la principal donde se realiza el multiplexado de las columnas y se muestran los valores de cada fila a una velocidad de 10ms y la interrupción por desbordamiento del timer, dentro de la interrupción se alojan los caracteres dentro de un switch el cual servirá para ir cambiando entre cada letra, ya que al final de cada caso tiene un contador "letra++" el cual será el valor a testear por el switch, a medida que se recorra cada una de las 5 columnas se incrementara en 1 la variable letra, de esta forma pasara al siguiente paso, por consiguiente la siguiente letra, la ultima letra en lugar de incrementar en 1, iguala a cero la variable letra, entonces comenzara de nuevo.
El tiempo esta dado por set_timer1(1000), es totalmente configurable a gusto del desarrollador.
Como el circuito utilizado es el más sencillo posible para que se encienda un Led debe existir un 1 y un 0 de cada lado de la matriz, se podría haber usado el selector de columnas como 0b11111110, 0b11111101, etc... Pero para comprenderlo fácil se utilizo un 1 donde se quiere encender, para que no salga la letra negada en la matriz se utilizo el operando "~" delante del vector de las filas, de esta forma complementa el valor de la variable para que se vea correctamente.
Para utilizar más columnas debería utilizarse mas salidas, como podemos imaginarnos, podríamos hacer una matriz de 8x8 con dos puertos del PIC, pero se puede hacer más grande implementando registros de desplazamiento serie/paralelo, como el 74164, 74595, 4094, etc... Estos integrados reciben los datos de las columnas de forma serial y lo despliegan en paralelo en sus salidas, los mismos se pueden concatenar para hacer matrices más grandes, estos integrados se controlan mediante un Clock de sincronismo, un Dato donde se enviaran los valores seriales, y un Reset que pondrá el puerto paralelo de los registros a ceros.
#include <16f883.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOMCLR,INTRC
#use delay (int=4000000)
int fila[5],letra=0;
#INT_TIMER1
void isr()
{
switch(letra){
case 0: fila[0]=0b01000001;
fila[1]=0b01000001;
fila[2]=0b01001001;
fila[3]=0b01001001;
fila[4]=0b01111111;
letra++;
break;
case 1: fila[0]=0b00000001;
fila[1]=0b00000001;
fila[2]=0b00000001;
fila[3]=0b00000001;
fila[4]=0b01111111;
letra++;
break;
case 2: fila[0]=0b01000001;
fila[1]=0b01000001;
fila[2]=0b01001001;
fila[3]=0b01001001;
fila[4]=0b01111111;
letra++;
break;
case 3: fila[0]=0b01000001;
fila[1]=0b01000001;
fila[2]=0b01000001;
fila[3]=0b01000001;
fila[4]=0b00111110;
letra++;
break;
case 4: fila[0]=0b01000000;
fila[1]=0b01000000;
fila[2]=0b01111111;
fila[3]=0b01000000;
fila[4]=0b01000000;
letra++;
break;
case 5: fila[0]=0b00000110;
fila[1]=0b01001001;
fila[2]=0b01001001;
fila[3]=0b01000001;
fila[4]=0b00111110;
letra++;
break;
case 6: fila[0]=0b00110000;
fila[1]=0b01001000;
fila[2]=0b01001000;
fila[3]=0b01001000;
fila[4]=0b01111111;
letra++;
break;
case 7: fila[0]=0b00000001;
fila[1]=0b00000001;
fila[2]=0b00000001;
fila[3]=0b00000001;
fila[4]=0b01111111;
letra++;
break;
case 8: fila[0]=0b00000000;
fila[1]=0b00000000;
fila[2]=0b00000000;
fila[3]=0b00000000;
fila[4]=0b00000000;
letra = 0;
break;
}
set_timer1(1000);
}
void main(void)
{
enable_interrupts(INT_TIMER1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(65535);
enable_interrupts(GLOBAL);
set_tris_c(0x00);
set_tris_a(0x00);
while(TRUE){
output_a(0b00000001);
output_c(~fila[0]);
delay_ms(10);
output_a(0b00000010);
output_c(~fila[1]);
delay_ms(10);
output_a(0b00000100);
output_c(~fila[2]);
delay_ms(10);
output_a(0b00001000);
output_c(~fila[3]);
delay_ms(10);
output_a(0b00010000);
output_c(~fila[4]);
delay_ms(10);
}
}