PIC18F4520 - LCD doesn't UPDATE

Help
2010-11-22
2013-03-12
  • André Barone
    André Barone
    2010-11-22

    Hi there,
    I am trying to porting a MikroC code to be compiled an run on SDCC for my PIC18F4520.

    Right now , I want my Display to be updated every delay100ktcy(40);
    My problem is that LCD is never updated. I have set portb.b2 to blink on every cycle, and its blinking.
    LCD Remains with Character 'A' all the time.

    Best Regards,
    André.

    Would somebody kindly help me?
    PS: PORTE1 and PORTE3 are RS/EN pins.

    #define __18f4520
    #include "pic18f4520.h"
    #include "delay.h"
    #include "string.h"
    #define LCD_EN LATEbits.LATE1
    #define LCD_RS LATEbits.LATE2
    #define LCD PORTD
    void setDisplay(char uiContador);
    void initLCD(void);
    static __code char __at(__CONFIG1H) conf1H = _OSC_HS_1H & _FCMEN_OFF_1H & _OSC_HSPLL_1H;
    static __code char __at(__CONFIG2L) conf2l = _BOREN_OFF_2L;
    static __code char __at(__CONFIG2H) conf2h = _WDT_OFF_2H;
    static __code char __at(__CONFIG3H) conf3h = _PBADEN_OFF_3H ;
    static __code char __at(__CONFIG4L) conf4l = _DEBUG_OFF_4L & _LVP_OFF_4L;
    static __code char __at(__CONFIG5L) conf5l = _CP0_OFF_5L;
    static __code char __at(__CONFIG5H) conf5h = _CPB_OFF_5H & _CPD_OFF_5H;
    void main(){
       unsigned int  uiContador;   // Variavel de armazenamento do contador.
       ADCON1 = 0x0f;      // Configura todos os pinos A/D como I/O
       ADCON0 = 0x00;
       TRISEbits.TRISE1=0;        // Define o pino RE1 do PORTE como saida.
       TRISEbits.TRISE2=0;        // Define o pino RE2 Do PORTE como saida.
       TRISBbits.TRISB2 = 0;      //port B2 output
       TRISD = 0;          // Define todos os pinos Do LCD como saida.
    LATBbits.LATB2 = 0;
       uiContador=0;       // Inicializa a variavel com o valor 0.
      initLCD();
       while(1){
          delay100ktcy(4);
          LATBbits.LATB2 = 0;
          setDisplay(uiContador);
          delay100ktcy(4);
          LATBbits.LATB2 = 1;
          uiContador++;
       }
    }
     void setDisplay(char uiContador){
        LATEbits.LATE2 = 0;    // Define se é comando(0) ou dado(1).(COMANDO)
          LCD=0xC0; // Posiciona cursor na linha2 coluna4.
          LATEbits.LATE1 = 1;    // Habilita LCD.
          delay10tcy(80); // Delay para o LCD assimilar o comando.(40 us)
          LATEbits.LATE1 = 0;    // Desabilita LCD.
          LATEbits.LATE2 = 1;    // Define se é comando(0) ou dado(1).(DADO)
          // Mostra valor da unidade.
          LCD ='A'+uiContador; //
          LATEbits.LATE1 = 1;    // Habilita LCD.
          delay10tcy(80); // Delay para o LCD assimilar o comando.(40 us)
          LATEbits.LATE1 = 0;    // Desabilita LCD.
    }
    void initLCD(void)
    {
           //Inicializa LCD Alfanumérico de 2x16
           LATEbits.LATE2 = 0;    // Define se é comando(0) ou dado(1).(COMANDO)
           LCD=0x38; // Define que LCD 2 linhas / matriz 7x5
           LATEbits.LATE1 = 1;    // Habilita LCD.
           delay10tcy(80);// Delay para o LCD assimilar o comando.(40 us)
           LATEbits.LATE1 = 0;    // Desabilita LCD.
           delay10ktcy(3);     //  // Delay_ms(15);
           LATEbits.LATE2 = 0;    // Define se é comando(0) ou dado(1).(COMANDO)
           LCD=0x38; // Define que LCD 2 linhas / matriz 7x5
           LATEbits.LATE1 = 1;    // Habilita LCD.
        //   delay10tcy(80); // Delay para o LCD assimilar o comando.(40 us)
           delay10tcy(80);
           LATEbits.LATE1 = 0;    // Desabilita LCD.
           delay10ktcy(3);     //  // Delay_ms(15);
           LATEbits.LATE2 = 0;    // Define se é comando(0) ou dado(1).(COMANDO)
           LCD=0x0C; // Liga display / desliga cursor.
           LATEbits.LATE1 = 1;    // Habilita LCD.
           delay100tcy(32);
          // // Delay_us(1600);   // // // // Delay para o LCD assimilar o comando.(1.6 ms)
           LATEbits.LATE1 = 0;    // Desabilita LCD.
          delay10ktcy(3); // Delay_ms(15);
           LATEbits.LATE2 = 0;    // Define se é comando(0) ou dado(1).(COMANDO)
           LCD=0x01; // Limpa LCD.
           LATEbits.LATE1 = 1;    // Habilita LCD.
           delay100tcy(32); //   // Delay_us(1600);   // // // // Delay para o LCD assimilar o comando.(1.6 ms)
           LATEbits.LATE1 = 0;    // Desabilita LCD.
    }
    
     
  • André Barone
    André Barone
    2010-11-23

    I removed #define __18f4520  and use sdcc -debug LCD_Exemplo8bits.c -mpic16 -p18f4520 to compile, then the linker used was 18f4520.lkr"
    Formerly, with #define __18f452 I was compiling with  sdcc -debug LCD_Exemplo8bits.c -mpic16. in this situation
    linker was 18f452.lkr.