Autor Tema: Ayuda con LCD para dsPIC30F4011  (Leído 4040 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado IECN

  • PIC10
  • *
  • Mensajes: 1
Ayuda con LCD para dsPIC30F4011
« 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;      //
};

« Última modificación: 14 de Noviembre de 2010, 01:47:35 por IECN »