// Usando el CD4094 para manejar 2 matrices led 8x8
#include <16F84A.h>
#fuses XT,NOPROTECT,NOWDT,PUT
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
// Definición de pines de control
#define DATA PIN_A0
#define CLOCK PIN_A1
#define STROBE PIN_A2
int t;
int a,b; //a sirve para llevar el conteo de las filas, b habilita la fila cuando ya se cargo el valor en las dos pantallas
byte const segmentos[14]={0b11000011,0b10000011,0b10111101,0b10111101,0b10111101,0b10111101,0b10111101,
0b10000011,0b10111101,0b10111111,0b10111101,0b10111111,0b11000011,0b10111111};
// declaración de la función escribir_4094
void escribir_4094(int caracter);
// programa principal
void main(){
set_tris_a(0x00);
set_tris_b(0x00);
output_a(0x00);
output_b(0x00);
a=1;
b=0;
while(true){
for(t=0;t<14;t++){
escribir_4094(t); // envía los datos a las columnas para armar la letra o el caracter en la matriz
if(b==2){ //**si ya cargo los valores en las dos matrices habilite la fila para mostrarlo
output_B(a); //muestra el dato habilitando la fila que corresponda a
a*=2; // aumenta el valor de la fila para el próximo dato que se genere en las columnas
if(a>64)a=1; // si el dato termino las 7 filas vuelva a comenzar desde la primera
delay_ms(7);
output_B(0);
b=0;
}
}
}
}
void escribir_4094(int caracter){
int contador_8;
output_low(DATA);
output_low(STROBE);
output_low(CLOCK);
for(contador_8=0;contador_8<8;contador_8++){
output_bit(DATA,bit_test(segmentos[caracter],contador_8));
output_high(CLOCK);
delay_cycles(1);
output_low(CLOCK);
}
output_low(CLOCK);
output_high(STROBE);
delay_cycles(1);
output_low(STROBE);
b++;
}