interconectando pic184f450 con 16X2 lcd en modo de cuatro bits?

0

Estoy trabajando en la interconexión de 16X2 lcd en modo 4bit con pic18f4550. Los 4 bits más altos (D4, D5, D6, D7) están conectados a PORTA1, A2, A3, A4, pin RAO como RS, RE2 como RW, RE3 como RE3. Estoy impresionado con el siguiente código que no muestra nada. El siguiente código se compila sin ningún error, pero no muestra nada (¿no supone ningún error en mi conexión de hardware)?             / *               * Archivo: main.c               * Autor: tamil               *               * Creado el 5 de junio de 2013, 11:32 PM              * /       #incluir

 #pragma config FOSC = HS  // to select external osc
// CPU System Clock Postscaler:
// [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2 = 48 MHz CPU Clock]
#pragma config CPUDIV = OSC1_PLL2
#pragma config PWRT     = ON        // 62 ms waiting at start
#pragma config BOR      = ON        // Brown our Reset enabled (IMPORTANT!!!)
#pragma config BORV     = 2         // Reset level = 2,7 V
#pragma config WDT = OFF  // watch dog timer off
#pragma config DEBUG = ON,LVP = OFF // debugger on , as per pickit3
#pragma config PBADEN = OFF //PORTB<4:0> pins are configured as digital I/O on Reset
#pragma config MCLRE = ON //MCLR pin enabled; RE3 input pin disabled

// lvp debería estar apagado

 #define rs LATAbits.LATA0
 #define rw LATEbits.LATE1
 #define en LATEbits.LATE2
 #define lcdport LATA
    void Delay_ms(int ms)
 {
  int i,j=0;
   for(i=0;i<ms;i++)
    for(j=0;j<165;j++);

  }
       void lcdcmd(unsigned char cmdout)
     {
lcdport=(lcdport |(cmdout << 1));       //Send command to lcdport=PORTB
rs = 0;                     
rw = 0;
en = 1;
Delay_ms(1);
en = 0;
    }
       void lcddata(unsigned char dataout)
    {
lcdport=(lcdport | (dataout << 1)); //Send data to lcdport=PORTB
rs=1;
rw=0;
en=1;
Delay_ms(1);
en=0;
    }
   void dis_data(unsigned char data_value)
   {
unsigned char data_value1;
data_value1=(data_value&0xF0);
lcddata(data_value1);
data_value1=((data_value<<4)&0xF0);
lcddata(data_value1);
    }
    void dis_cmd(unsigned char cmd_value)
    {
unsigned char cmd_value1;
cmd_value1 = (cmd_value & 0xF0);    // Mask lower nibble because RB4-RB7 pins              are being used
lcdcmd(cmd_value1);         // Send to LCD
cmd_value1 = ((cmd_value<<4) & 0xF0);   // Shift 4-bit and mask
lcdcmd(cmd_value1);         // Send to LCD
    }
    void lcd_ini()
    {
dis_cmd(0x02);
    Delay_ms(200);// To initialize LCD in 4-bit mode.
dis_cmd(0x28);
    Delay_ms(200);// To initialize LCD in 2 lines, 5x7 dots and 4bit mode.
dis_cmd(0x0C);
    Delay_ms(200);
dis_cmd(0x06);
    Delay_ms(200);
dis_cmd(0x80);
    Delay_ms(200);
     }
   void main ()
     {
       unsigned char data[]="tamil";
       unsigned int x =8;
       //unsigned int y = 1;
        //unsigned int i=0;
           ADCON1=15; // to configure  all analog pins as digital i/o
           TRISA = 0; // to config port A as o/p
           TRISE = 0;// to make it as o/p
           lcd_ini();
           // LCD initialization

         while(data[i]!='
 #pragma config FOSC = HS  // to select external osc
// CPU System Clock Postscaler:
// [OSC1/OSC2 Src: /1][96 MHz PLL Src: /2 = 48 MHz CPU Clock]
#pragma config CPUDIV = OSC1_PLL2
#pragma config PWRT     = ON        // 62 ms waiting at start
#pragma config BOR      = ON        // Brown our Reset enabled (IMPORTANT!!!)
#pragma config BORV     = 2         // Reset level = 2,7 V
#pragma config WDT = OFF  // watch dog timer off
#pragma config DEBUG = ON,LVP = OFF // debugger on , as per pickit3
#pragma config PBADEN = OFF //PORTB<4:0> pins are configured as digital I/O on Reset
#pragma config MCLRE = ON //MCLR pin enabled; RE3 input pin disabled
') { dis_data(data[i]); Delay_ms(200); i++; }

}

    
pregunta tamil_innov

1 respuesta

2

Me pregunto cómo se está compilando este código. La declaración de "i" está comentada y aún estás usando la variable.

Mis sugerencias:

  1. Inicialice "i" con 0, podría estar obteniendo un valor aleatorio y su ciclo while no se está ejecutando en absoluto.

  2. Intente aumentar el retardo para la transición de Alto a Bajo en el Pin EN, digamos unos 50 mseg.

  3. Simule este código utilizando un simulador o algo así si está tan seguro acerca de la conexión de hardware.
  4. El código dice que la pantalla LCD está conectada al puerto A y el comentario dice que está en el puerto B (primera línea de lcdcmd y lcddata)

Nunca olvides la regla de oro:

  

"Cuando el Código y los comentarios no coinciden, probablemente ambos estén equivocados"

    
respondido por el Swanand

Lea otras preguntas en las etiquetas