Fórum

arrow_back

Display LCD 16x2 por I2C

DIEGO DE OLIVEIRA SANTOS

24/05/2024 15:27:31

Boa tarde, fiz uma programação super simples apenas para escrever no display LCD por I2C com o PCF8574A com as conexões da seguinte forma: 
A programação esta deste jeito: 


#include "lcd_i2c_lib.h"

char  Lcd_I2C_address = 0x40;

short msg = 0;


void configMCU ();


void ConfigMCU ()

{

#ifdef P18F45K22

 ANSELB = 0;                    //CONFIGURA PORTB COMO I/O DIGITAL

 ANSELC = 0;                    //CONFIGURA PORTC COMO I/O DIGITAL

#else

 ADCON1 |= 0X0F;                //IDEM PARA PIC18F4520/4550

#endif

  TRISD.RD0 = 1;

  TRISD.RD1 = 1;

  TRISD.RD2 = 1;

  TRISD.RD3 = 1;

  TRISC.RC0 = 0;

  PORTC.RC0 = 0;

  

  //*****************Configuração para PIC18F*********************************

 //Habilitar a interrupção (chave geral)

 INTCON.GIEH = 1;                 //Chave Geral

 INTCON.GIEL = 1;                 //Liga o vetor de baixa, apesar de não usar nesse projeto

 RCON.IPEN   = 1;                 //Define 2 level de prioridade de interrupção (presente somente nos PIC18F)

}


void main() 

{

  ConfigMCU();


  

  I2C1_Init(100000);

  Delay_ms(300);

  PORTC.RC0 = ~LATC.RC0;

  Lcd_I2C_Init();

  Lcd_I2C_Out(1,1,"Oi");

  Delay_ms(50);

  Lcd_I2C_Out(2,1,"Tchau");

  Delay_ms(50);

  Lcd_I2C_Cmd(_LCD_CURSOR_OFF);

  Lcd_I2C_Cmd(_LCD_CLEAR);

  while(1);

}

>

E a biblioteca esta deste jeito:


/*

Biblioteca Lcd I2C com CI - PCF8574T

Autor: Diego de Oliveira Santos

MikroC 6.4v

OBS.: Habilitar Biblioteca I2C

*/



void Lcd_I2C_Init();

void Lcd_I2C_Cmd(char out_char);

void Lcd_I2C_Chr(char row, char column, char out_char);

void Lcd_I2C_Chr_CP(char out_char);

void Lcd_I2C_Out(char row, char col, char *text);

void Lcd_I2C_Out_CP(char *text);

void Lcd_I2C_Enable();


 

extern char Lcd_I2C_address;


//char Lcd_I2C_address = 0x40; //A0 - 0, A1 - 0, A2 - 0


#define _LCD_FIRST_ROW          0x80     //Move cursor to the 1st row - ok 

#define _LCD_SECOND_ROW         0xC0     //Move cursor to the 2nd row - ok

#define _LCD_THIRD_ROW          0x94     //Move cursor to the 3rd row - ok

#define _LCD_FOURTH_ROW         0xD4     //Move cursor to the 4th row - ok

#define _LCD_CLEAR              0x01     //Clear display - ok

#define _LCD_RETURN_HOME        0x02     //Return cursor to home position, returns a shifted display to

                                         //its original position. Display data RAM is unaffected. - ok

#define _LCD_CURSOR_OFF         0x0C     //Turn off cursor - ok

#define _LCD_UNDERLINE_ON       0x0E     //Underline cursor on - ok

#define _LCD_BLINK_CURSOR_ON    0x0F     //Blink cursor on - ok

#define _LCD_MOVE_CURSOR_LEFT   0x10     //Move cursor left without changing display data RAM - ok

#define _LCD_MOVE_CURSOR_RIGHT  0x14     //Move cursor right without changing display data RAM - ok

#define _LCD_TURN_ON            0x0C     //Turn Lcd display on - ok

#define _LCD_TURN_OFF           0x08     //Turn Lcd display off - ok

#define _LCD_SHIFT_LEFT         0x18     //Shift display left without changing display data RAM 

#define _LCD_SHIFT_RIGHT        0x1E     //Shift display right without changing display data RAM 




//Enviar um comando para Lcd_I2C-PCF8574

void Lcd_I2C_Cmd(char out_char)

{//Inicio do Lcd_I2C_Cmd


    char I2C_byte;    

    

    I2C_byte = out_char & 0xF0;    


    I2C1_Start();

    I2C1_Wr(Lcd_I2C_address);

    

    I2C_byte.F0 = 0;

    I2C_byte.F2 = 1;    

    I2C1_Wr(I2C_byte);    

    I2C_byte.F2 = 0;    

    I2C1_Wr(I2C_byte);

    

    I2C_byte = (out_char << 4) & 0xF0;

    

    I2C_byte.F0 = 0;

    I2C_byte.F2 = 1;   

    I2C1_Wr(I2C_byte);   

    I2C_byte.F2 = 0;    

    I2C1_Wr(I2C_byte);

    I2C1_Stop();


    Delay_ms(10);

}//Final LCD_I2C_Cmd


//Inicializa o Lcd_I2C-PCF8574

void Lcd_I2C_Init()

{//Inicio do Lcd_I2C_Init    


    char I2C_byte = 0x30;

        

    Delay_ms(100);

  

    I2C1_Start();

    I2C1_Wr(Lcd_I2C_address);

    

    I2C_byte.F2 = 1;                //Seta Enable do LCD em 1

    I2C1_Wr(I2C_byte);


    I2C_byte.F2 = 0;                //Seta Enable do LCD em 0

    I2C1_Wr(I2C_byte);


    I2C_byte.F2 = 1;                //Seta Enable do LCD em 1

    I2C1_Wr(I2C_byte);

    I2C_byte.F2 = 0;                //Seta Enable do LCD em 0

    I2C1_Wr(I2C_byte);


    I2C_byte.F2 = 1;                //Seta Enable do LCD em 1

    I2C1_Wr(I2C_byte);

    I2C_byte.F2 = 0;                //Seta Enable do LCD em 0


    I2C_byte = 0x20;


    I2C_byte.F2 = 1;                //Seta Enable do LCD em 1

    I2C1_Wr(I2C_byte);

    I2C_byte.F2 = 0;                //Seta Enable do LCD em 0

    I2C1_Wr(I2C_byte);

    

    I2C_byte.F2 = 1;                //Seta Enable do LCD em 1

    I2C1_Wr(I2C_byte);

    I2C_byte.F2 = 0;                //Seta Enable do LCD em 0

    I2C1_Wr(I2C_byte);


    Lcd_I2C_Cmd(0x28);

    Lcd_I2C_Cmd(0x0C);

    Lcd_I2C_Cmd(0x06);

    Lcd_I2C_Cmd(0x01);

}//Final do I2C_Lcd_Init


//Enviar um caracter para Lcd_I2C-PCF8574

void Lcd_I2C_Chr_CP(char out_char) 

{//Inicio da Lcd_I2C_Chr_CP


    char byte;

    

    byte = out_char & 0xF0;    


    I2C1_Start();

    I2C1_Wr(Lcd_I2C_address);

    

    byte.F0 = 1;

    byte.F2 = 1;   

    I2C1_Wr(byte);

    byte.F2 = 0;    

    I2C1_Wr(byte);

    

    byte = (out_char << 4) & 0xF0;

    

    byte.F0 = 1;

    byte.F2 = 1;   

    I2C1_Wr(byte);

    byte.F2 = 0;    

    I2C1_Wr(byte);

    

    I2C1_Stop();

    Delay_ms(10);

}//Final da Lcd_I2C_Chr_CP


//Enviar um texto para o Lcd_I2C-PCF8574

void Lcd_I2C_Out_CP(char *text)

{//Inicio do Lcd_I2C_Out_CP

    while(*text)

    {

     Lcd_I2C_Chr_CP(*text);

     text++;

    }

}//Final do Lcd_I2C_Out_CP


//Enviar um caracter para uma linha e uma coluna Lcd_I2C-PCF8574

void Lcd_I2C_Chr(char row, char column, char out_char) 

{//Inicio do Lcd_I2C_Chr


    char byte;

    

    switch(row)

    {

        case 1:

        Lcd_I2C_Cmd(0x80 + (column - 1));

        break;

        case 2:

        Lcd_I2C_Cmd(0xC0 + (column - 1));

        break;

        case 3:

        Lcd_I2C_Cmd(0x94 + (column - 1));

        break;

        case 4:

        Lcd_I2C_Cmd(0xD4 + (column - 1));

        break;

    };


      Lcd_I2C_Chr_CP(out_char);

}//Final do Lcd_I2C_Chr


//Enviar um texto para uma linha e uma coluna Lcd_I2C-PCF8574

void Lcd_I2C_Out(char row, char col, char *text)

{//Inicio do Lcd_I2C_Out

    while(*text)

    {

         Lcd_I2C_Chr(row, col, *text);

         col++;

         text++;

    }

}//Final do Lcd_I2C_Out


Porém quando eu dou play nada acontece no display. Fiz o teste de colocar uma linha de comando de trocar o LATC.RC0 para fazer o teste na programação. Se eu colocar antes da linha (37) -->   Lcd_I2C_Init(); o LATC.RC0 funciona, depois do comando Lcd_I2C_Init(); ele não funciona mais. Me ajudem por favor

Este site usa cookies para melhorar sua experiência. Política de Privacidade