You are on page 1of 4

//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(); } } }

You might also like