Página 1 de 1
Caracteres especiais no LCD

Enviado:
19 Jul 2007 13:02
por tilvers
Olá amigos, estou com problemas para construir caracteres especiais em displays LCD 16x2, com matriz de 8x5. Estou utilizando o Proteus para simular, com microcontrolador AT89S52.
Peço que, se possível, me mostrem rotinas para a criação de caracteres especiais (em linguagem C de preferência) e que me expliquem o funcionamento.
Desde já agradeço.
Felipe

Enviado:
19 Jul 2007 13:34
por brasilma
Não funcionou...

Enviado:
19 Jul 2007 14:20
por tilvers
brasilma, eu acessei o link que vc me passou e praticamente copiei a rotina de construção e escrita de caracteres especiais. Apenas mudei alguns nomes (para adaptá-los ao meu código), tirei a função que posiciona o caractere na linha desejada (pois não me interessa no momento, estou apenas testando) e atribuí os valores do array
cod dentro da função (o que não muda em nada).
Abaixo segue o código do meu programa, o caractere a ser construído seria o que está como exemplo no site que me passou (
http://www.angelfire.com/ultra/lcd/gerador.htm ), peço que, se puder, analise o código do meu programa e aponte possíveis erros. Obrigado!
Felipe
OBS.: P2 é o port que está sendo usado para o envio de dados.
- Código: Selecionar todos
#include<at89x52.h>
#define RS P3_0
#define RW P3_1
#define E P3_2
void timer(int vezes)
{ while(vezes)
{ TMOD=0x01;
TH0=0xD8; //contagem de 1ms
TL0=0xEF; //contagem de 1ms
TR0=1;
TF0=0;
while(!TF0);
vezes--;
}
}
void clock()
{
E=1;
timer(1);
E=0;
}
void instrucao(char x)
{
RS=0;
RW=0;
P2=x;
clock();
}
void inicia()
{
instrucao(0x38);
timer(15);
instrucao(0x06);
timer(15);
instrucao(0x0F);
timer(15);
instrucao(0x01);
}
void escrita(char x)
{
RS=0;
RW=0;
P2=x;
RS=1;
clock();
}
void especial(int end)
{
char cod[7]={0x04,0x0E,0x1F,0x04,0x04,0x04,0x05,0x02};
int i; //Variável de índice
//Variável contendo os endereços da CGRAM
char endereco[6];
endereco[0]=64;
endereco[1]=72;
endereco[2]=80;
endereco[3]=88;
endereco[4]=96;
endereco[5]=104;
endereco[6]=112;
//Definindo um caracter customizado
RS=0; //prepara o LCD para receber instruções
RW=0;
P2=endereco[end]; //Carrega endereco da CGRAM
clock();
RS=1; //prepara para escrever dados na CGRAM
i=0; //Zera veriável de índice
for (i=0;i<=7;i++)
{
P2=cod[i];
clock();
}
//Escrevendo dados na DDRAM
RS=1;
RW=0;
P2=end;
clock();
}
void main()
{
inicia();
timer(15);
especial(1);
}

Enviado:
19 Jul 2007 18:10
por brasilma
Oque está (ou não) acontecendo?

Enviado:
19 Jul 2007 18:47
por tilvers
Simplesmente não aparece nada no display...

Enviado:
19 Jul 2007 19:08
por brasilma
Beleza, bom isso podem ser duas coisas hardware ou software (óbvio), então façamos como "Jack" e vamos por partes, comecemos pelo primeiro, explique todas as conecções do módulo e deste para o microcontrolador (com numeros de pinos e sinais).

Enviado:
19 Jul 2007 19:37
por tilvers
Eu estou simulando no Proteus, e estou certo de que problema de hardware não é, pois eu consigo escrever caracteres ASCII e enviar instruções usando o msm circuito.
Só não consigo construir e enviar caracteres especiais.
Mas só por desencargo de consciência:
Pino 1(Vss) - Vcc;
Pino 2(Vdd) - Gnd;
Pino 3(Vee) - Desconectado, pois no proteus não é necessário;
Pino 4(RS) - P3.0 do microcontrolador;
Pino 5(R/W) - P3.1 do microcontrolador;
Pino 6(E) - P3.2 do microcontrolador;
Pino 7 ao 14(D0 a D7) - Conectados, respectivamente, aos pinos do P2 do microcontrolador: D0 em P2.0, D1 em P2.1, e assim por diante.
Obrigado pela ajuda até o momento.
Felipe

Enviado:
19 Jul 2007 20:25
por Maurício
A configuração não é 8x5 e sim, 7x5.
O último byte do caractere especial sempre tem que ser 0x00, que é o valor destinado ao cursor.
Dá uma olhada na imagem abaixo, pra vc ver como se constrói o caractere.
[]'s

Enviado:
20 Jul 2007 11:55
por tilvers
Umm.. mas como eu envio os bytes para as endereços?? Que pinos eu tenho que setar para endereçar a CGRAM? E eu envio os bytes referentes ao mapeamento do caractere da mesma forma que se escreve caracteres ASCII no LCD?
Obrigado.
Felipe

Enviado:
20 Jul 2007 13:34
por brasilma
Primeiro é preciso enviar os bytes dos caracteres, há disponibilidade de 8 caracteres com 8 bytes cada, portanto para encher toda a CGRAM são necessários 64bytes.
Seleciona o modo comando e posiciona o ponteiro:
FILLCGRAM1: CLR LCD_RS ; RS modo comando
MOV A,#40H ;Posiciona Ponteiro CGRAM Byte1
LCALL WRLCD
SETB LCD_RS ; RS modo dado
Transfere os bytes:
MOV R0,#28H ; 28H = 40D (40 bytes = 5 caracteres)
MOV DPTR,#STRING24 ;Carrega endereco inic do logo
FILLCGRAM1L1: MOV A,#0
MOVC A,@A + DPTR
LCALL WRLCD
INC DPTR
DJNZ R0,FILLCGRAM1L1
Utilize os caracteres com base nos endereços na CGRAM:
00H,01H,02H,03H,04H...

Enviado:
23 Jul 2007 14:22
por tilvers
Obrigado pela ajuda amigos, consegui escrever os caracteres especiais. Acho que o problema é que eu não estava posicionando o cursor.
Obrigado pela atenção e mais uma vez pela ajuda.
Abraços