Caracteres especiais no LCD

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Caracteres especiais no LCD

Mensagempor tilvers » 19 Jul 2007 13:02

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
tilvers
Bit
 
Mensagens: 8
Registrado em: 09 Abr 2007 18:52

Mensagempor brasilma » 19 Jul 2007 13:34

Dá uma olhada neste link: http://www.angelfire.com/ultra/lcd/ .
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Não funcionou...

Mensagempor tilvers » 19 Jul 2007 14:20

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);
 
}
"Use seu cérebro frequentemente, mas pense bem antes de usá-lo." Felipe Barker
tilvers
Bit
 
Mensagens: 8
Registrado em: 09 Abr 2007 18:52

Mensagempor brasilma » 19 Jul 2007 18:10

Oque está (ou não) acontecendo?
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor tilvers » 19 Jul 2007 18:47

Simplesmente não aparece nada no display...
"Use seu cérebro frequentemente, mas pense bem antes de usá-lo." Felipe Barker
tilvers
Bit
 
Mensagens: 8
Registrado em: 09 Abr 2007 18:52

Mensagempor brasilma » 19 Jul 2007 19:08

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).
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor tilvers » 19 Jul 2007 19:37

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
"Use seu cérebro frequentemente, mas pense bem antes de usá-lo." Felipe Barker
tilvers
Bit
 
Mensagens: 8
Registrado em: 09 Abr 2007 18:52

Mensagempor Maurício » 19 Jul 2007 20:25

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.

Imagem


[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor tilvers » 20 Jul 2007 11:55

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
"Use seu cérebro frequentemente, mas pense bem antes de usá-lo." Felipe Barker
tilvers
Bit
 
Mensagens: 8
Registrado em: 09 Abr 2007 18:52

Mensagempor brasilma » 20 Jul 2007 13:34

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...
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor tilvers » 23 Jul 2007 14:22

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
"Use seu cérebro frequentemente, mas pense bem antes de usá-lo." Felipe Barker
tilvers
Bit
 
Mensagens: 8
Registrado em: 09 Abr 2007 18:52


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x