A maior rede de estudos do Brasil

Grátis
143 pág.
Apostila sobre microcontroladores ATMEGA

Pré-visualização | Página 8 de 29

5. Levar o pino E para 0 lógico. 
6. Intercalar uma rotina de atraso entre as instruções ou fazer a leitura do Busy Flag (o bit 
7 da linha de dados) antes do envio da instrução e enviá-la somente quando ele for 0 
lógico. 
 
34 
 
Toda vez que a alimentação do módulo é ligada, o LCD executa a rotina de inicialização. 
Durante a execução dessa rotina o Busy Flag está em 1 lógico. Este estado “ocupado” dura por 
10 ms após a tensão de alimentação atingir 4,5 V. Muitas vezes este detalhe é esquecido e o LCD 
não funciona adequadamente quando o µcontrolador manda informações antes do tempo. Para 
corrigir esse problema, basta colocar uma rotina de atraso no início do programa, só depois, então, 
as rotinas para o LCD. 
As instruções executadas na inicialização do LCD são (detalhes no Anexo 5): 
• Limpa display (0x01). 
• Fixa modo de utilização (0x20), com DL = 1 (interface de 8 bits, N = 0 (linha única) e 
F = 0 (matriz 5x7). 
• Controle ativo/inativo do display (0x08), com D = 0 (mensagem não aparente), C = 0 
(cursor inativo) e B = 0 (função intermitente inativa). 
• Fixa modo de operação (0x06), com I/D = 1 (modo incremetal) e S = 0 (deslocamento 
do display inativo). 
PROGRAMAÇÃO C 
As vantagens do uso do C comparado ao assembly são numerosas: redução do tempo de 
desenvolvimento, facilidade de re-uso do código e facilidade de manutenção e portabilidade. Os 
problemas podem ser: códigos compilados grandes e, consequentemente, redução da velocidade de 
processamento. Ressaltando-se que com o assembly (se bem programado) se consegue o máximo 
desempenho do µcontrolador. 
Como os compiladores C são eficientes para arquitetura do AVR, a programação é feita em C, 
só em casos extremos existe a necessidade de se programar puramente em assembly. O bom é que 
os compiladores C aceitam trechos de código em assembly quando este for imprescindível. 
A partir de agora será emprega exclusivamente a linguagem C para a programação do AVR. 
Detalhes do compilador WinAVR e suas bibliotecas podem ser encontrados no help do AVR 
Studio. No Anexo 4 encontram-se dicas para uma programação C eficiente. Abaixo se encontram as 
rotinas de escrita no LCD em conjunto com um programa exemplo que escreve na linha superior do 
LCD: “ABCDEFGHIJKLMNOP”; e na linha inferior: “QRSTUVXYZ 123456”, (circuito da 
Fig. 4.8). 
 
 
 
35 
 
//=============================================================================================== // 
// ACIONANDO UM DISPLAY DE CRISTAL LIQUIDO DE 16x2 // 
// // 
// Interface de dados de 8 bits // 
//=============================================================================================== // 
#define F_CPU 1000000UL //define a frequência do ucontrolador 1 MHz (necessário para usar as 
//rotinas de atraso) 
#include <avr/io.h> //definições do componente especificado 
#include <util/delay.h> //biblioteca para o uso das rotinas de atraso 
#include <avr/pgmspace.h> //uso de funções para salvar dados na memória de programa 
 
//Definições de macros 
#define set_bit(adress,bit) (adress|=(1<<bit)) //facilidades para o acesso aos pinos de I/O 
#define clr_bit(adress,bit) (adress&=~(1<<bit)) // (PORTx,Pxx) 
#define tst_bit(adress,bit) (adress&(1<<bit)) // leitura dos I/Os (PINx, Pxx) 
#define cpl_bit(adress,bit) (adress^=(1<<bit)) //complementa o valor do bit 
 
#define DADOS_LCD PORTD //8 bits de dados do LCD na porta B 
#define RS PB1 //pino de instrução ou dado para o LCD 
#define E PB0 //pino de enable do LCD 
 
const unsigned char msg1[ ] PROGMEM = "ABCDEFGHIJKLMNOP"; //mensagem 1 armazenada na memória flash 
//-----------------------------------------------------------------------------------------------
//Sub-rotina para enviar comandos ao LCD 
//-----------------------------------------------------------------------------------------------
void cmd_LCD(unsigned char c, char cd) 
{ 
DADOS_LCD = c; 
 
if(cd==0) 
 clr_bit(PORTB,RS); //RS = 0 
else 
 set_bit(PORTB,RS); //RS = 1 
 
set_bit(PORTB,E); //E = 1 
clr_bit(PORTB,E); //E = 0 
_delay_us(45); 
 
if((cd==0) && (c<127)) //se for instrução espera tempo de resposta do display 
_delay_ms(2); 
} 
//-----------------------------------------------------------------------------------------------
//Sub-rotina de inicializacao do LCD 
//-----------------------------------------------------------------------------------------------
void inic_LCD(void) //envio de instrucoes para o LCD 
{ 
 cmd_LCD(0x38,0); //interface 8 bits, 2 linhas, matriz 7x5 pontos 
 cmd_LCD(0x0C,0); //mensagem aparente cursor ativo nao piscando 
 cmd_LCD(0x01,0); //limpa todo o display 
 cmd_LCD(0x80,0); //escreve na primeira posicao a esquerda - 1a linha 
} 
//-----------------------------------------------------------------------------------------------
//Sub-rotina de escrita no LCD 
//-----------------------------------------------------------------------------------------------
void escreve_LCD(char *c) 
{ 
 for (; *c!=0;c++) cmd_LCD(*c,1); 
} 
//----------------------------------------------------------------------------------------------- 
int main( ) 
{ 
unsigned char i; 
 
DDRB = 0xFF; //porta B como saída 
DDRD = 0xFF; //porta D como saída 
 
inic_LCD( ); //inicializa o LCD 
 
for(i=0;i<16;i++) //enviando caractere por caractere 
cmd_LCD(pgm_read_byte(&msg1[i]),1); //lê na memória flash e usa cmd_LCD 
 
cmd_LCD(0xC0,0); //desloca o cursor para a segunda linha do LCD 
 
escreve_LCD("QRSTUVXYZ 123456"); //segunda mensagem para o LCD 
 //mostra a versatilidade da rotina escreve_LCD 
for(;;); //laço infinito 
 
} 
//=============================================================================================== 
 
36 
 
INTERFACE DE DADOS DE 4 BITS 
 
Utilizar a interface de dados de 8 bits para o LCD 16x2 com não tem sido mais empregado em 
projetos de hardware devido ao uso excessivo de pinos para o acionamento do display (10 ou 11). 
Empregar 4 bits de dados libera 4 pinos do µcontrolador para outras atividades, além de diminuir a 
complexidade da placa de circuito impresso. O custo é um pequeno aumento na complexidade do 
programa de controle do LCD, com alguns bytes a mais de programação. 
Na Fig. 4.9 é apresentado o circuito µcontrolado do LCD 16x2 com via de dados de 4 bits. Na 
seqüência, o programa de controle do LCD. 
 
Fig. 4.9 – Circuito para acionamento de um LCD 16x2 com interface de dados de 4 bits. 
 
//=============================================================================================== // 
// ACIONANDO UM DISPLAY DE CRISTAL LIQUIDO DE 16x2 // 
// // 
// Interface de dados de 4 bits // 
//=============================================================================================== // 
#define F_CPU 1000000UL //define a frequência do ucontrolador 
#include <avr/io.h> //definições do componente especificado 
#include <util/delay.h> //biblioteca para o uso das rotinas de atraso 
#include <compat/deprecated.h> //biblioteca para tratamento dos pinos de I/Os 
 
#define DADOS_LCD PORTD //8 bits de dados do LCD na porta B 
#define RS PD2 //pino de instrução ou dado para o LCD 
#define E PD3 //pino de enable do LCD 
 
unsigned char i=1; //variável para inicializar corretamente o LCD 
//----------------------------------------------------------------------------------------------- 
//Sub-rotina para enviar comandos ao LCD com dados de 4 bits 
//-----------------------------------------------------------------------------------------------
void cmd_LCD(unsigned