Matriz de Leds 8x8

(1/12) > >>

DaviD_H:
Buenas a tod@s.
Estoy simulando la matriz 8x8 en proteus y me gustaría saber si alguien tiene un código en basic por ejemplo que permita escribir letras en la misma, o alguna secuencia de letras (como en el video de eejemplo de la web).

¡No doy con ello!!!

GRACIAS

Ariel:
A ver....Esto esta hecho en CCS. Puede servirte como base para hacer algo en BASIC.

Adjunto en un RAR el HEX correspondiente y el contenido de la EEPROM.

Código:

//Device/Fuses/Etc.---------------------------------
#INCLUDE <16F628A.H>
#INCLUDE <MATH.H>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
//#FUSES NOMCLR                 //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#use delay(clock=4000000)

//Configuracion de los puertos--------------------------------------------------
#BYTE PORTA = 0x05
#BYTE PORTB = 0x06
#BYTE PORTA_TRIS = 0x85
#BYTE PORTB_TRIS = 0x86

//Configuracion de los pines usados para el registro de desplazamiento----------
#DEFINE RDD_DATA  PIN_A1
#DEFINE RDD_CLOCK PIN_A0

//Configuracion de los pines usados para la EEPROM------------------------------
#DEFINE EEPROM_SCL PIN_A2
#DEFINE EEPROM_SDA PIN_A3
#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)
#define EEPROM_ADDRESS long int

//Funciones utilizadas----------------------------------------------------------
void fConfigurar_puertos(void);
void fRDD_send_data0(void);
void fRDD_send_data1(void);
void fRDD_send_byte1(int);
void fRDD_send_byte2(int);
void fDibujoPantalla(long int imagen, int efecto);
void init_ext_eeprom();
void write_ext_eeprom(long int address, BYTE data);
int8 read_ext_eeprom(long int address);


//Main--------------------------------------------------------------------------
void main(){
   int8 i;
   fConfigurar_puertos();
   init_ext_eeprom(); //Inicializo la EEPROM
   output_low(RDD_CLOCK); //RELOJ = Bajo
   output_low(RDD_DATA);
   
   
   while (TRUE){
      fDibujoPantalla(10,1);
      fDibujoPantalla(11,1);
      fDibujoPantalla(12,1);
      fDibujoPantalla(13,1);
      fDibujoPantalla(14,1);
      fDibujoPantalla(15,1);
      fDibujoPantalla(16,1);
      fDibujoPantalla(17,1);
      for (i=1;i<5;i++) {
      fDibujoPantalla(1,1);
      fDibujoPantalla(0,1); }
     
      fDibujoPantalla(10,2);
      fDibujoPantalla(11,2);
      fDibujoPantalla(12,2);
      fDibujoPantalla(13,2);
      fDibujoPantalla(14,2);
      fDibujoPantalla(15,2);
      fDibujoPantalla(16,2);
      fDibujoPantalla(17,2);
      for (i=1;i<5;i++) {
      fDibujoPantalla(1,2);
      fDibujoPantalla(0,2);       
      }
   }//Fin while
   
}//Fin main
//- FUNCIONES---------------------------------------
void fConfigurar_puertos(void){
   PORTA_TRIS = 0b11000000; //1=ENTRADA, 0=SALIDA
   PORTB_TRIS = 0b00000000; //1=ENTRADA, 0=SALIDA
   
   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);
   setup_vref(FALSE);
}

void fRDD_send_data0(void){
   output_low(RDD_DATA);
   //delay_us(2);
   output_low(RDD_CLOCK);
   //delay_us(2);
   output_high(RDD_CLOCK);
}
void fRDD_send_data1(void){
   output_high(RDD_DATA);
   //delay_us(2);
   output_low(RDD_CLOCK);
   //delay_us(2);
   output_high(RDD_CLOCK);
}
void init_ext_eeprom()
{
   output_float(EEPROM_SCL);
   output_float(EEPROM_SDA);

}
void write_ext_eeprom(long int address, BYTE data)
{
   short int status;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
   i2c_start();
   status=i2c_write(0xa0);
   while(status==1)
   {
   i2c_start();
   status=i2c_write(0xa0);
   }
}
int8 read_ext_eeprom(long int address)
{
   BYTE data;
   i2c_start();
   i2c_write(0xa0);
   i2c_write(address>>8);
   i2c_write(address);
   i2c_start();
   i2c_write(0xa1);
   data=i2c_read(0);
   i2c_stop();
   return(data);
}
void fDibujoPantalla(long int imagen, int efecto) {
   int i=0,j=0, tiempo;
   int tabla[8]; //={0x3C,0x42,0x81,0xa5,0x81,0x99,0x42,0x3c};
   int fila[8]={254,253,251,247,239,223,191,127};
   //Cargo en la tabla los valores de la EEPROM
   for (i=0;i<=7;i++) {
      tabla[i] = read_ext_eeprom ((long int)imagen*9+i);
   }
   //Leo el valor del tiempo que tengo que mostrar esta imagen
   tiempo = read_ext_eeprom ((long int)imagen*9+8);
   
   //Bucle que muestra la imagen "tiempo veces"
   for (i=1;i<=tiempo;i++) {
     
      for (j=0;j<8;j++) {
      PORTB = 255; //Filas apagadas.
      //escribo registro desplazamiento
      if (efecto == 1) { fRDD_send_byte1(tabla[j]); }
      if (efecto == 2) { fRDD_send_byte2(tabla[j]); }     
      //Enciendo la fila correspondiente
      PORTB = fila[j];
      delay_ms(1);
      }
      PORTB = 255; //Filas apagadas.
      //delay_ms(1);
   }
}
//--- Envia un byte al registro de desplazamiento - NORMAL---------------------
void fRDD_send_byte1(int valor){
   int i;
   //Escribo el valor en el registro de desplazamiento
   for (i=0;i<8;i++) {
      if (bit_test(valor, i) == 1) { fRDD_send_data0(); }
      if (bit_test(valor, i) == 0) { fRDD_send_data1(); }
      }
}
//--- Envia un byte al registro de desplazamiento - VIDEO INVERSO --------------
void fRDD_send_byte2(int valor){
   int i;
   //Escribo el valor en el registro de desplazamiento
   for (i=0;i<8;i++) {
      if (bit_test(valor, i) == 1) { fRDD_send_data1(); }
      if (bit_test(valor, i) == 0) { fRDD_send_data0(); }
      }
}

DaviD_H:
Buenas
estaba comparando el esquema de la colocacion de los pull ups de tu web con la foto real y creo que en uno de los dos hay un error.
En el esquematico estan en paralelo y en la imagen real cada uno va a una linea bajo el eeprom.

Lo correcto es lo de la foto ¿no?

Ariel:
Si, no tengo la placa a mano, pero creo que las habia olvidado al dibujar el PCB y las tuve que poner del lado de abajo (una verdadera guarrada, :) ). En concreto, van de cada linea a +5V.

Saludos!

DaviD_H:
luego tambien, en la foto del circuito acabado, veo que hay un condensador de más respecto al esquematico.
los dos que me tienen intrigados son los del registro de desplazamiento y el de la eeprom.

el primero se ve que es de 100nF pero el de la eeprom no se que valor tiene.

¿que valores tienen y cual es su función?

gracias

Navegación

[0] Índice de Mensajes

[#] Página Siguiente