Fork me on GitHub

18/10/12

Tutorial 1: Biblioteca MikroC: LCD

Bibliotecas MikroC PRO for PIC: LCD 4Bits



O MikroC para quem não sabe, é um compilador de linguagem C para a programação de Microcontroladores.



Possui uma grande quantidade de bibliotecas que facilitam o desenvolvimento do projeto.

Nesse e nos próximos tutoriais mostrarei a função e códigos de cada biblioteca.

BIBLIOTECA LCD


proporciona a comunicação com Lcds (com HD44780 controladores compatíveis) através da interface de 4 bits.

É de uso obrigatório dessa biblioteca a colocação desse seguinte código:

//Configura a saída dos Pinos do LCD.
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit; 
sbit LCD_D7 at RB3_bit; 
sbit LCD_D6 at RB2_bit; 
sbit LCD_D5 at RB1_bit; 
sbit LCD_D4 at RB0_bit; 
//Configura a direção dos pinos do LCD. 
sbit LCD_RS_Direction at TRISB4_bit; 
sbit LCD_EN_Direction at TRISB5_bit; 
sbit LCD_D7_Direction at TRISB3_bit; 
sbit LCD_D6_Direction at TRISB2_bit; 
sbit LCD_D5_Direction at TRISB1_bit; 
sbit LCD_D4_Direction at TRISB0_bit;


Rotinas:

LCD_Init() - Inicializa o módulo LCD.



LCD_Out(char row, char column, char text) -Escreve um texto qualquer no LCD.
     row - Em qual linha será inserido o texto.
     colunm - Em qual coluna será inserido o texto.
     text - Texto qualquer.



LCD_Out_Cp(char text) - Escreve o texto na posição atual do cursor.



LCD_Chr(char row, char column, char out_char) - Escreve uma caracter no LCD.
     row - Em qual linha será inserido o texto.
     colunm - Em qual coluna será inserido o texto.
     out_char - código do caracter a ser inserido (ver tabela ASCII).

LCD_Chr_Cp(char out_char) - Escreve um caracter na posição atual do cursor.

Lcd_Cmd(char out_char) - Envia um comando ao LCD.
COMANDOS:
_LCD_FIRST_ROW - Mover o cursor para a linha 1
_LCD_SECOND_ROW - Mover o cursor para a linha 2
_LCD_THIRD_ROW - Mover o cursor para a linha 3
_LCD_FOURTH_ROW - Mover o cursor para a linha 4
_LCD_CLEAR - Limpa o display
_LCD_RETURN_HOME -  Retorna o cursor para posição inicial.
_LCD_CURSOR_OFF - Desliga o cursor.
_LCD_UNDERLINE_ON - sublinha o cursor.
_LCD_BLINK_CURSOR_ON - Liga o pisca-pisca do cursor.
_LCD_MOVE_CURSOR_LEFT - Move o cursor para esquerda.
_LCD_MOVE_CURSOR_RIGHT -  Mover cursor para a direita.
_LCD_TURN_ON - LCD Desligado.
_LCD_TURN_OFF - LCD ligado.
_LCD_SHIFT_LEFT -  Move o texto todo para a esquerda.
_LCD_SHIFT_RIGHT -  Move o texto todo para a direita.

EXEMPLO:

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
char txt1[] = "mikroElektronika";
char txt2[] = "EasyPIC6";
char txt3[] = "Lcd4bit";
char txt4[] = "example";
char i;                              // Loop variable
void Move_Delay() {                  // Function used for text moving
  Delay_ms(500);                     // You can change the moving speed here}
void main(){
  ANSEL  = 0;                        // Configure AN pins as digital I/O
  ANSELH = 0;
  C1ON_bit = 0;                      // Disable comparators
  C2ON_bit = 0;
  Lcd_Init();                        // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
  Lcd_Out(1,6,txt3);                 // Write text in first row
  Lcd_Out(2,6,txt4);                 // Write text in second row
  Delay_ms(2000);
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Out(1,1,txt1);                 // Write text in first row
  Lcd_Out(2,5,txt2);                 // Write text in second row
  Delay_ms(2000);
  // Moving text
  for(i=0; i<4; i++) {               // Move text to the right 4 times
    Lcd_Cmd(_LCD_SHIFT_RIGHT);
    Move_Delay();
  }
  while(1) {                         // Endless loop
    for(i=0; i<8; i++) {             // Move text to the left 7 times
      Lcd_Cmd(_LCD_SHIFT_LEFT);
      Move_Delay();
    }
    for(i=0; i<8; i++) {             // Move text to the right 7 times
      Lcd_Cmd(_LCD_SHIFT_RIGHT);
      Move_Delay();
    }
  }
}



16 comentários:

  1. É possível fazer uma leitura em um conversor A/D de 10 bits e enviar a leitura para um LCD de 8 bits? Existe algum truque pra isso?

    ResponderExcluir
    Respostas
    1. É possivel sim, veja um exemplo:


      void main()
      {
      int adc_read;
      char string[8];
      ADC_Init();
      Lcd_Init();

      while(1)
      {
      adc_read = ADC_Read(0);//leitura do canal 0
      inttostr(adc_read, string);//converte int para string
      lcd_out(1,1,string);//escreve no lcd o valor
      delay_ms(100);
      }
      }

      Excluir
  2. Boa tarde.

    Existe uma maneira de diminuir as casas decimais de uma variável tipo float e enviar para o LCD? Por exemplo "234.3948" para "234.3". Uso o "FloatToStr" diminuo o número de caracteres dessa string na declaração, mas quando faço isso, aparece um caractere indesejado, um "$".


    //Configura a saída dos Pinos do LCD.
    sbit LCD_RS at RC0_bit;
    sbit LCD_EN at RC2_bit;
    sbit LCD_D7 at RC7_bit;
    sbit LCD_D6 at RC6_bit;
    sbit LCD_D5 at RC5_bit;
    sbit LCD_D4 at RC4_bit;
    //Configura a direção dos pinos do LCD.
    sbit LCD_RS_Direction at TRISC0_bit;
    sbit LCD_EN_Direction at TRISC2_bit;
    sbit LCD_D7_Direction at TRISC7_bit;
    sbit LCD_D6_Direction at TRISC6_bit;
    sbit LCD_D5_Direction at TRISC5_bit;
    sbit LCD_D4_Direction at TRISC4_bit;

    char msg1[14];
    char msg2[14];
    char msg3[14];
    float V;
    void main() {

    Trisa=0b11111111; //Port A como entrada
    Trisc=0b00000000; //Port C como saída

    Lcd_Init(); // Inicializa LCD
    Lcd_Cmd(_Lcd_clear); // Limpa display
    Lcd_Cmd(_Lcd_cursor_off); // Desliga cursor
    V = ADC_Read(0)*0.00488*55.1126; //Leit. Canal 0*Resolução*Const q mantem 4Vcc=220Vac
    FloatToStr (V,msg1);
    lcd_out(1,1,msg1);

    }

    ResponderExcluir
  3. tem como mover apenas uma coluna para direita ou esquerda??

    ResponderExcluir
  4. opa é uma LINHA* para direita ou esquerda

    ResponderExcluir
    Respostas
    1. o comando SHIFT_RIGHT ou SHIFT_LEFT desloca TODAS as linhas ao mesmo tempo.

      Excluir
  5. e qual outro comando eu poderia usar para mover apenas uma linha?

    ResponderExcluir
  6. Ola amigo! Como eu faço para colocar o LCD no PORTD no meu PIC16F877A,
    pois ele da erro ao compilar..

    1 402 ; expected, but 'RD2_bit' found 16F877A_.c

    ResponderExcluir
    Respostas
    1. 1 402 ; expected, but 'RD2_bit' found 16F877A_.c
      Está dizendo que você esqueceu de colocar Ponto-e-virgula(;)

      Excluir
  7. Boa Tarde!

    Estou utilizando PIC16F877A, com simulação no Proteus , meu código consiste em 3 etapas de mensagens para controlar motores de passo, a programação dos motores está OK, porém as 3 mensagens que deveriam ir pro LCD estão com problemas, quando eu executo o codigo inteiro ele passa a primeira mensagem normalmente, o segundo bloco de mensagem que é praticamente igual ao primeiro já embaralha tudo e vai pro fim do programa com tudo embaralhado....o estranho é que se eu coloco */ pra cancelar por exemplo o primeiro bloco, dai ele consegue executar o segundo normalmente porém depois ja embaralha de novo.....eu utilizei os codigos do lcd do proprio mikroc, igual que você passou, teria alguma solução? Obrigado!

    ResponderExcluir
  8. Tentei utilizar a função LCD_Out em um código que contém interrupção do Timer1 Overflow, mas o PIC fica resetando. Alguém sabe o motivo? Obrigado.

    ResponderExcluir
  9. como faço para mover somente uma linha do LCD?????

    ResponderExcluir
  10. Estou tentando exibir uma mensagem em um LCD 16x2 com o PIC18F2550 utilizando o PORTB, porém quando envio uma msg para o LCD a mensagem sai faltando algum caracter e as vezes exibe alguns caracteres indesejados em seguida da msg e até altera o valor de uma variável hexadecimal acrescentando +1 a cada carácter, por exemplo, AAF vira BB0.
    O código compila normalmente, não sei o porque do erro.
    Se alguém puder me ajudar eu agradeço.

    ResponderExcluir
  11. Olá a todos do blog. Estou tentando fazer um scroll de uma array de 71 bytes em apenas uma linha do display LCD 20x4. Alguém de vocês poderia ajudar?

    ResponderExcluir

Postagens Relacionadas!!