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);
}