TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: IECN en 14 de Noviembre de 2010, 01:41:02
-
HOLA A TODOS
e estado batallando para hacer funcionar un LCD en el 30F4011, necesito terminarlo esta semana por que es parte de mi trabajo final de Microcontroladores, agradezco de alntemano la ayuda que puedan brindarme.
UTILIZO EL MTC-C162DPLY-2N-V10 y un dsPIC30F4011 en C30
SE QUE LO MAS FACIL SERIA CONECTAR LOS 8 BITS DE SALIDA AL PUERTO B, PERO NO PUEDO POR QUE LOS OCUPO PARA LEER VOLTAJES ANALOGICOS ASI QUE USO EL PUERTO F Y DB0
Este es mi codigo fuente, lo unico que logro hacer es que la primer linea del LCD se encienda y se prendan todos los pixeles, pero no logro escribir nada
# include <p30f4011.h>
# define FCY 3000000
# define DB7 PORTDbits.RD0 //DB7 MSB
# define E PORTEbits.RE0 // ENABLE
# define RS PORTEbits.RE1
# define RW PORTEbits.RE2 //PIN R/W DEL LCD
#define BUS7 PORTF // DB0 A DB6
#define LCD_BUSY() LEE_LCD(DB7) // INDICA SI LCD ESTA OCUPADO
# define Esperame IFS0bits.T1IF
void CONFIG_ENVIO (void);
void INICIALIZA_LCD (void);
void ESCRIBE_LCD (unsigned char DIR, unsigned char C);
char LEE_LCD (unsigned char x);
void HAB_TIMER4 (void);
void RETARDO (void);
int main(int argc, char**argv){
CONFIG_ENVIO ();
INICIALIZA_LCD(); //INICIALIZO EL LCD COMO LO INDICA LA HOJA DE DATOS
while (1){
ESCRIBE_LCD (0X08, 'C'); //PRETENDO ESCRIBIR EL CARACTER C A LA MITAD DEL LCD
}
return 0;
}
void CONFIG_ENVIO (void){
TRISEbits.TRISE0 = 0;
TRISEbits.TRISE1 = 0;
TRISEbits.TRISE2 = 0;
TRISFbits.TRISF0 = 0;
TRISFbits.TRISF1 = 0;
TRISFbits.TRISF4 = 0;
TRISFbits.TRISF5 = 0;
TRISFbits.TRISF2 = 0;
TRISFbits.TRISF3 = 0;
TRISFbits.TRISF6 = 0;
TRISDbits.TRISD0 = 0;
};
void INICIALIZA_LCD(void){
RETARDO (); RETARDO ();
RETARDO (); RETARDO (); // DELAY 16 ms
BUS7 = 0b00110000;
DB7 = BUS7 >>7;
RS = 0;
RW = 0;
RETARDO (); RETARDO (); // DELAY 8ms
BUS7 = 0b00110000;
DB7 = BUS7 >> 7;
RETARDO (); // DELAY 4 ms
BUS7 = 0b00110000;
DB7 = BUS7 >> 7;
RETARDO ();
BUS7 = 0b00111000; //PANTALLA DE 2 LINEAS, CARACTERES DE 5x7 PUNTOS
DB7 = BUS7>> 7;
RETARDO ();
BUS7 = 0b00001000; //APAGA EL DISPLAY
DB7 = BUS7 >> 7;
RETARDO ();
BUS7 = 0b00000001; //LIMPIA LA PANTALLA
DB7 = BUS7 >> 7;
RETARDO();
BUS7 = 0b00000110; // INFO NO SE DEZPLAZA, INCREMENTO AUTOMATICO DEL CURSOR
DB7 = BUS7 >> 7;
};
void HAB_TIMER4 (void){
T4CONbits.TON = 0; //APAGA EL TIMER
T4CONbits.TCKPS = 0; // PREESCALADOR 1:1
TMR4 = 0; //EMPIEZA EN 0
PR4 = 12000; //CUENTA 4ms
IFS0bits.T1IF = 0; //limpia la bandera
IEC0bits.T1IE = 1; //HABILITA LA INTERRUPCION
IPC0bits.T1IP = 5; //PRIORIDAD 5
};
void RETARDO (void){
T4CONbits.TON = 1; //ENCIENDE EL TIMER
while (!Esperame);
};
void __attribute__((__interrupt__, no_auto_psv)) _T4Interrupt (void){
TMR4 = 0; //Reinicia el Conteo
IFS1bits.T4IF = 0; //Limpia la Bandera
T4CONbits.TON = 0; //ENCIENDE EL TIMER
};
char LEE_LCD (unsigned char x){ //ESTA FUNCION INDICA SI LCD ESTA OCUPADO Y NO PUEDE RECIBIR DATOS
RS = 0; //MODO LEER
RW = 1; //
char VALOR;
DB7 = x;
TRISDbits.TRISD0 = 1; //LEE EL BIT DB7
VALOR = DB7;
TRISDbits.TRISD0 = 0;
return (VALOR);
};
void ESCRIBE_LCD (unsigned char DIR, unsigned char C){ //FUNCION PARA ESCRIBIR UN SOLO CARACTER
while (LCD_BUSY() ); //ESCRIBE HASTA QUE LCD ESTE DESOCUPADO
RS = 0; //
RW = 0; //MODO ENVIAR DIRECCION
DB7 = 1; //
BUS7 = DIR; //
while (LCD_BUSY());
RS = 1; //MODO CARACTER
RW = 0; //
BUS7 = C; //MANDA EL CODIGO ASCII DEL CARACTER POR EL BUS
DB7 = C >> 7; //
};