/*
* File: main.c
*/
//******************************************************************************
#include "main.h"
/******************************************************************************
******************************************************************************
******************************************************************************/
void pasaje_datos_lcd(void)
{
LCD_E = 1; // habilita la comunicacion para que procese el nibble
__delay_us( 10 ); // delay para garantizar el pasaje de datos al lcd
LCD_E = 0; // deshabilita la comunicacion
}
/******************************************************************************/
void enviaByteLCD( t_byte dato )
{
// transmite el nibble alto al lcd
LCD_D7 = dato.b7;
LCD_D6 = dato.b6;
LCD_D5 = dato.b5;
LCD_D4 = dato.b4;
pasaje_datos_lcd();
// transmite el nibble bajo al lcd
LCD_D7 = dato.b3;
LCD_D6 = dato.b2;
LCD_D5 = dato.b1;
LCD_D4 = dato.b0;
pasaje_datos_lcd();
__delay_ms(5);
}
/******************************************************************************/
// inicializacion del lcd con bus de 4 bits
void inicializa_lcd(void)
{
t_byte dato;
__delay_ms( 20 ); // espera a que el voltaje se estabilice
LCD_RS = 0; // aviso de envio de comando
LCD_E = 0; // deshabilita la comunicacion
__delay_ms( 15 );
//----------------------------------
dato.byte = 3;
for ( int i=0; i<3; i++ )
enviaByteLCD( dato );
dato.byte = 2;
enviaByteLCD( dato );
dato.byte = 2;
enviaByteLCD( dato );
for ( int i=0; i<3; i++ )
{
dato.byte = 0x28;
enviaByteLCD( dato );
dato.byte = 0xC;
enviaByteLCD( dato );
dato.byte = 1;
enviaByteLCD( dato );
dato.byte = 6;
enviaByteLCD( dato );
}
}
/******************************************************************************/
void enviaComandoLCD( t_byte comando )
{
LCD_RS = 0; // aviso de envio de comando
enviaByteLCD( comando );
}
/******************************************************************************/
void enviaDatoLCD( t_byte dato )
{
LCD_RS = 1; // aviso de envio de datos
enviaByteLCD( dato );
}
/******************************************************************************/
void enviaCadenaLCD(const unsigned char *car)
{
while ( *car )
{
t_byte caracter;
caracter.byte = *car;
enviaDatoLCD( caracter );
car++;
}
}
/******************************************************************************
******************************************************************************
******************************************************************************/
void activar_interrupciones_PORTB_TIMER(void)
{
INTCONbits.RBIF = 1;
INTCONbits.INTF = 1;
/**** INTERRUPCIONES ****/
INTCONbits.PEIE = 1; // Enables all unmasked peripheral interrupts
INTCONbits.RBIE = 1; // Enables the RB port change interrupt
// PORTB pull-ups are enabled by individual port latch values
OPTION_REGbits.nRBPU = 1;
// Interrupt on rising (creciente) edge of RB0/INT pin
OPTION_REGbits.INTEDG = 1;
INTCONbits.RBIF = 0;
INTCONbits.INTF = 0;
INTCONbits.GIE = 1; // Enables all unmasked interrupts
//T1CONbits.TMR1ON = 1; // Timer1 On bit
}
/******************************************************************************/
void configurar_pic(void)
{
/*****************************
******** T I M E R 1 ********
*****************************/
// cronometro para el tiempo de las duchas
T1CONbits.TMR1CS = 0; // Timer1 Clock Source - 0 Internal clock (FOSC/4)
T1CONbits.T1CKPS1 = 1; // prescaler
T1CONbits.T1CKPS0 = 1; // 1:8
TMR1H = VALOR_TMR1H; // 3036
TMR1L = VALOR_TMR1L; // 500 ms
T1CONbits.TMR1ON = 0; // Timer1 On bit
PIE1bits.TMR1IE = 1; // TMR1 Overflow Interrupt Enable bit
/*********************
*** P U E R T O S ***
*********************/
/**** PORTD I/O ****/
TRISEbits.PSPMODE = 0; // PORTD functions in general purpose I/O mode
/**** PORTE I/O ****/
TRISEbits.TRISE2 = 0; // Output
TRISEbits.TRISE1 = 0; // Output
TRISEbits.TRISE0 = 0; // Output
/**** PORTA / PORTE I/O ****/
ADCON1 = 0b00000111; // RA5:RA0 y RE2:RE0 Digital
TRISA = 0b00000000; // Salida
TRISC = 0b10000000; // Salida
TRISD = 0b00000000; // Salida
TRISE = 0b00000000; // Salida
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
PORTE = 0b00000000;
}
/******************************************************************************
******************************************************************************
******************************************************************************/
int main(void)
{
t_byte caracter;
configurar_pic();
activar_interrupciones_PORTB_TIMER();
inicializa_lcd();
__delay_ms( 20 );
caracter.byte = _LCD_CMND_LIMPIAR_;
enviaComandoLCD( caracter );
caracter.byte = _LCD_L1_C_01_;
enviaComandoLCD( caracter );
while ( 1 )
{
caracter.byte = _LCD_L1_C_01_;
enviaComandoLCD( caracter );
enviaCadenaLCD("Prueba de LCD");
__delay_ms( 1000 );
// mueve el cursor al primer caracter de la segunda linea
caracter.byte = _LCD_L2_C_01_; //0b11000000;
enviaComandoLCD( caracter );
enviaCadenaLCD("Texto de prueba");
__delay_ms( 1000 );
caracter.byte = _LCD_CMND_LIMPIAR_; // limpia la pantalla
enviaComandoLCD( caracter );
__delay_ms( 200 );
//--------------------------------------------------------------
// mueve el cursor al primer caracter de la segunda linea
caracter.byte = _LCD_L1_C_01_; //0b11000000;
enviaComandoLCD( caracter );
enviaCadenaLCD("DSD");
__delay_ms( 100 );
// mueve el cursor al 12º caracter de la primer linea
caracter.byte = _LCD_L1_C_12_; //0b11000000;
enviaComandoLCD( caracter );
enviaCadenaLCD("CD-9");
// mueve el cursor al primer caracter de la segunda linea
caracter.byte = _LCD_L2_C_01_; //0b11000000;
enviaComandoLCD( caracter );
enviaCadenaLCD("www.dysd.com.ar");
__delay_ms( 1000 );
caracter.byte = _LCD_CMND_LIMPIAR_; // limpia la pantalla
enviaComandoLCD( caracter );
__delay_ms( 200 );
}
}