/*
* File: main.c
*/
//******************************************************************************
#include "main.h"
/******************************************************************************
******************************************************************************
******************************************************************************/
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;
LCD_E = 1; // habilita la comunicacion para que procese el nibble
// __delay_us( 50 ); // delay para garantizar el pasaje de datos al lcd
__delay_ms( 50 );
LCD_E = 0; // deshabilita la comunicacion
// transmite el nibble bajo al lcd
LCD_D7 = dato.b3;
LCD_D6 = dato.b2;
LCD_D5 = dato.b1;
LCD_D4 = dato.b0;
LCD_E = 1; // habilita la comunicacion para que procese el nibble
// __delay_us( 50 ); // delay para garantizar el pasaje de datos al lcd
__delay_ms( 50 );
LCD_E = 0; // deshabilita la comunicacion
__delay_ms( 50 ); // retardo para que el lcd efectue la tarea
}
/******************************************************************************/
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 activar_interrupciones_PORTB_TIMER(void)
{
/* ¿Por qué activo las banderas de interrupciones? */
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 = 0b00000000; // Salida
TRISD = 0b00000000; // Salida
TRISE = 0b00000000; // Salida
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
PORTE = 0b00000000;
}
/******************************************************************************/
// inicializacion del lcd con bus de 4 bits
void inicializa_lcd(void)
{
t_byte dato;
__delay_ms( 20 );
LCD_E = 0; // deshabilita la comunicacion
LCD_RS = 0; // aviso de envio de comando
LCD_D7 = 0;
LCD_D6 = 0;
LCD_D5 = 1;
LCD_D4 = 0; // DL = 0 bus de 4 bits
LCD_E = 1; // habilita la comunicacion
// __delay_us( 50 );
__delay_ms( 50 );
LCD_E = 0; // deshabilita la comunicacion
// __delay_us( 50 );
__delay_ms( 50 );
//dato.byte = 0b00101000; // Establece Funcion
dato.byte = 0b00101100; // caracteres 5x10
enviaByteLCD( dato );//envio en 2 partes la confirmacion de comando 4 bits
dato.byte = 0b00000110; // Establece Modo de Entrada
enviaByteLCD( dato ); //comando display quieto incrementa cursor
//dato.byte = 0b00001110; // Control Encendido/Apagado de Pantalla
dato.byte = 0b00001100; // cursor oculto
enviaByteLCD( dato ); //comando LCD on Cursor on
}
/******************************************************************************
******************************************************************************
******************************************************************************/
#define LCD_DIRECTO
#define LCD_CD4094
int main(void)
{
t_byte caracter;
configurar_pic();
activar_interrupciones_PORTB_TIMER();
#ifdef LCD_DIRECTO
inicializa_lcd();
for ( int i=0; i<4; i++ )
{
caracter.byte = 'A';
enviaDatoLCD( caracter );
caracter.byte = 'b';
enviaDatoLCD( caracter );
caracter.byte = 'C';
enviaDatoLCD( caracter );
caracter.byte = 'd';
enviaDatoLCD( caracter );
caracter.byte = ' ';
enviaDatoLCD( caracter );
}
/*
* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
* 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 1º linea
* 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2º linea
*/
// mueve el cursor al primer caracter de la segunda linea
caracter.byte = 0b11000000;
enviaComandoLCD( caracter );
for ( int i=0; i<16; i++ )
{
caracter.byte = 'A';
enviaDatoLCD( caracter );
}
caracter.byte = 0b11001011;
enviaComandoLCD( caracter );
for ( int i=0; i<4; i++ )
{
caracter.byte = 'D';
enviaDatoLCD( caracter );
caracter.byte = 'c';
enviaDatoLCD( caracter );
caracter.byte = 'B';
enviaDatoLCD( caracter );
caracter.byte = 'a';
enviaDatoLCD( caracter );
}
caracter.byte = 0b10000110;
enviaComandoLCD( caracter );
for ( int i=0; i<4; i++ )
{
caracter.byte = 'D';
enviaDatoLCD( caracter );
}
#endif
#ifdef LCD_CD4094
CD4094_LCD_inicializar();
for ( int i=0; i<4; i++ )
{
caracter.byte = 'D';
CD4094_LCD_enviar( caracter, true );
caracter.byte = 'c';
CD4094_LCD_enviar( caracter, true );
caracter.byte = 'B';
CD4094_LCD_enviar( caracter, true );
caracter.byte = 'a';
CD4094_LCD_enviar( caracter, true );
caracter.byte = ' ';
CD4094_LCD_enviar( caracter, true );
}
/*
* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
* 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 1º linea
* 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 2º linea
*/
// mueve el cursor al primer caracter de la segunda linea
caracter.byte = 0b11000000;
CD4094_LCD_enviar( caracter, false );
for ( int i=0; i<16; i++ )
{
caracter.byte = 'A';
CD4094_LCD_enviar( caracter, true );
}
caracter.byte = 0b11001011;
CD4094_LCD_enviar( caracter, false );
for ( int i=0; i<4; i++ )
{
caracter.byte = 'W';
CD4094_LCD_enviar( caracter, true );
caracter.byte = 'x';
CD4094_LCD_enviar( caracter, true );
caracter.byte = 'Y';
CD4094_LCD_enviar( caracter, true );
caracter.byte = 'z';
CD4094_LCD_enviar( caracter, true );
}
caracter.byte = 0b10000110;
CD4094_LCD_enviar( caracter, false );
for ( int i=0; i<4; i++ )
{
caracter.byte = 'M';
CD4094_LCD_enviar( caracter, true );
}
#endif
while ( 1 )
{
;
}
}