quarta-feira, 17 de agosto de 2016

Módulo LCD 16x2

Módulo LCD 16x2


Para ligarmos um display LCD 16×2 ao PIC, precisamos antes de mais nada entender um pouco sobre a forma como esse tipo de display trabalha. Um dos tipos mais comuns de controlador utilizados em displays LCD é o HD44780, que pode ser ligado ao microcontrolador usando-se 4 ou 8 fios, e que vai determinar a velocidade de comunicação entre eles.

Não podemos simplesmente enviar dados à um LCD sem uma sequência lógica. Antes de utilizá-lo, é necessário o envio de comandos que preparam o display para receber caracteres. Vamos tomar como exemplo o display LCD 16×2 com controlador HD44780.
Esse tipo de display tem 16 pinos: 3 pinos de alimentação, 3 de controle, 8 de dados e 2 para acionar o backlight (ou luz de fundo), que você pode ver em detalhes na imagem abaixo:



  • Os pinos de controle do display LCD 16×2 são o RS, o R/W e o E.
  • O pino RS tem a função de mostrar ao display que tipo de dados estamos transmitindo. Em nível baixo (0), os dados são tratados como comandos, e em nível alto (1), os dados são tratados como caracteres. 
  • O pino R/W (Read/Write) é utilizado para determinar se estamos lendo ou transmitindo dados para o display. 

Já o pino ENABLE é utilizado para determinar o início da transferência de dados entre o microcontrolador e o display.
Os pinos de dados D0 a D7 formam o barramento de dados. O mais comum é utilizarmos apenas 4 pinos para comunicação com o microcontrolador, mas nada impede que em aplicações mais elaboradas sejam utilizados todos os 8 pinos. Essa é uma das funções do envio de comandos que preparam o display, pois é nesse momento que determinamos se vamos usar 4 ou 8 pinos para comunicação. Partindo do problema da aula anterior (Display de 7 segmentos – Leitura do nibble presenta na porta B), imagine que se queira ler o byte inteiro presente na porta B e colocar o seu valor escrito em 2 displays de 7 segmentos.

  

Biblioteca do LCD

Existem várias bibliotecas que simplificam a utilização deste periférico. Utilizamos a biblioteca mostrada no livro “Micontroladores PIC18 – Aprenda e Programe em Linguagem C” de Alberto Noboru Miyadaira. Esta biblioteca possui as seguintes funções:
  • lcd_inicia (conf_1, conf_2, conf_3) Inicia o lcd, os parâmetros
    • conf_1:
      • 0x20 – Comunicação em 4 bits, display de 1 linha, matriz 8 x 5
      • 0x24 – Comunicação em 4 bits, display de 1 linha, matriz 10 x 5
      • 0x28 – Comunicação em 4 bits, display de 2 ou mais linhas, matriz 8 x 5
      • 0x2C – Comunicação em 4 bits, display de 2 ou mais linhas, matriz 10 x 5
      • 0x30 – Comunicação em 8 bits, display de 1 linha, matriz 8 x 5
      • 0x34 – Comunicação em 8 bits, display de 1 linha, matriz 10 x 5
      • 0x38 – Comunicação em 8 bits, display de 2 ou mais linhas, matriz 8 x 5
      • 0x3C – Comunicação em 8 bits, display de 2 ou mais linhas, matriz 10 x 5
    • conf_2:
      • 0x3C – Desliga o cursor
      • 0X08 – Desliga o display
      • 0x02 – Desloca o cursor para linha 1 coluna 1
      • 0x14 – Desloca o cursor para direita sem deslocar a mensagem
      • 0x10 – Desloca o cursor para esquerda, sem deslocar a mensagem
      • 0x0F – Liga o cursor com alternância
      • 0x0E – Liga o display e o cursor
      • 0x0D – Liga o display e o cursor piscante
      • 0x01 – Limpa a tela do display e desloca para linha 1, coluna1
    • conf_3:
      • 0x04 – Desloca o cursor para esquerda quando um caractere é inserido, mas não desloca a mensagem
      • 0x06 – Desloca o cursor para direita quando um caractere é inserido mas não desloca a mensagem
      • 0x05 – Desloca o cursor e a mensagem para esquerda quando um caractere é inserido
      • 0x07 – Desloca o cursor e a mensagem para direita quando um caractere é inserido
  • lcd_limpa_tela () Limpa a tela do display LCD
  • lcd_posicao (linha, coluna) Coloca o cursor em uma determinada posição do display LCD
  • imprime_string_lcd (s_caracteres) Envia uma string localizada na memória de programa para o display LCD, onde s_caracteres = ponteiro para a string
  • imprime_buffer_lcd (s_caracteres, tamanho_buffer) Envia uma matriz de dados para o display LCD, onde s_caracteres = ponteiro para o buffer e tamanho_buffer = quantidade de dados que serão enviados
  • lcd_LD_cursor (config) Liga/Desliga o cursor/display
    • 0 – Desliga o cursor
    • 1 – Desliga o display
    • 2 – Liga o cursor com alternância
    • 3 – Liga o display e o cursor
    • 4 – Liga o display e o cursor piscante
  • lcd_cursor_home() Coloca o cursor na linha e coluna 1 do display
  • lcd_desloca_cursor (direita-esquerda) Descola o cursor para a direita  ou esquerda
    • 0 – Direita
    • 1 – Esquerda
  • lcd_desloca_mensagem(direita_esquerda) Desloca a mensagem para direita ou esquerda
    • 0 – Direita
    • 1 – Esquerda
  • lcd_escreve_dado(dado) Escreve um caractere ou símbolo no display
  • lcd_le_dado () Retorna o caractere presente na posição do cursor
  • lcd_status() Retorna o valor do status + contador de endereço

  

Ligação do display LCD no PIC

A biblioteca prevê uma ligação utilizando o a porta D, porém nada impede a edição do arquivo para modificação dos pinos ou mesmo da porta.
Utilizando uma comunicação de 4 bits temos o uso de 7 pinos:
        PIC              LCD
        RD0 (19)     RS (04)
         RD1 (20)     RW (05)
         RD7 (30)     E (6)
         RD6 (29)     D4 (11)
         RD5 (28)     D5 (12)
         RD4 (27)     D6 (13)
         RD2 (21)     D7 (14)


  

Programa de exemplo uso do LCD



/*
 * File:   IS2_LCD_0_Exemplo.c
 * Author: Pilger-Win7
 *
 * Created on 15 de Março de 2018, 10:36
 *
 * LCD 2 x 16
 * 0 - Exemplo
 * 
 * Objeto: Mostrar o LCD em funcionamento
 *
 */

#define _XTAL_FREQ 48000000

#include <xc.h>
#include "c:\h\Config_PIC18F4550.h"
#include "c:\h\biblioteca_lcd_2x162_48M_XC.h"

void delay_ms(int i) {
    for (int x = 0; x < i; x++) {
        __delay_ms(1);
    }
}

void delay_1s(unsigned char tempo) {
    for (int i = 0; i < tempo; i++) { // Gera um delay de múltiplos de 1s
        delay_ms(1000); // Gera um delay de 1s
    }
}

void main(void) {
    ADCON1 = 0x0F; // configura os pinos dos ports A a E como IO
    TRISD = 0x00; // define o port D como saída
    LATD = 0; // "zera" a porta D
    lcd_inicia(0x28, 0x0f, 0x06); // Inicializa o LCD
    lcd_posicao(1, 5); // coloca o cursor na linha 1, coluna 5
    imprime_string_lcd(" PIC18F4550 "); // escreve texto no LCD
    delay_1s(4); // conta 4s
    while (1) {
        lcd_posicao(2, 1); // coloca o cursor na linha 2, coluna 1
        imprime_string_lcd(" Teste do LCD "); // escreve texto no LCD
        delay_1s(4); // conta 4s
        lcd_posicao(2, 1); // coloca o cursor na linha 2, coluna 1
        imprime_string_lcd(" LCD escrito  "); // escreve texto no LCD
        delay_1s(4); // conta 4s
    }
}



  

Atividades

Atividade 1:

Escrever um programa em Linguagem C para o PIC18F4550, para controlar um LED por um botão e mostrar no display o status do hardware botão solto ou pressionado, e LED ligado ou desligado.

Atividade 2:

Utilizando o programa do semáforo “cruzamento” (aula 4) pede-se construir/modificar o programa para informar no módulo LCD 2 x 16 o estado de cada semáforo.


  

Nenhum comentário:

Postar um comentário