LusoRobótica - Robótica em Português

Robótica => Projectos de robótica => Projectos Concluídos => Tópico iniciado por: tcustodio em 17 de Julho de 2009, 05:29

Título: LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: tcustodio em 17 de Julho de 2009, 05:29
Bem, são 5 e meia da manhã e eu e o ricardo-reis estamos ca moca artificial, mas não deixámos passar isto, cá desvendámos como se fazem os caracteres customizados. Na verdade até é bastante simples.
O nosso lcd tem 64 bytes de ram para caracteres nossos; cada caracter ocupa 8 bytes (um byte por linha) e os bits determinam os pixéis ligados de cada linha.
Apenas temos que fazer o seguinte:
  -  Dizer ao lcd o endereço de memória onde vamos pôr o nosso caracter;
  -  Mandar os bytes seguidos, o lcd auto-incrementa o endereço de memória.

O valor de cada byte é determinado da seguinte maneira:

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.imagesco.com%2Farticles%2Flcd%2FCG-Ram1.jpg&hash=bee16ea861644bd44e3e2334f2e8746bb8f1eba1)

Vamos ao código:
Código: [Seleccione]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

int caracter1[8] = {3, 2, 2, 2, 2, 14, 30, 12};  //este array guarda os bytes que formam o bitmap do caracter
int caracter2[8] = {31, 1, 1, 1, 1, 7, 15, 6};   //temos aqui dois caracteres diferentes

void setup(){
  //analogWrite(6,80);       //isto regula o contraste do lcd, não se esqueçam!
  lcd.command(64);           //este comando põe o lcd no endereço de memória 64 (0x40), é a primeira posição que temos disponível
  for (int i=0; i<8; i++){
    lcd.write(caracter1[i]);
  }
  lcd.command(72);           //vamos para a segunda posição disponível, que é a anterior, mas com os 8 bytes ocupados (0x48)
  for (int i=0; i<8; i++){
    lcd.write(caracter2[i]);
  }
  lcd.clear();               //no fim temos que abandonar este modo de escrita, limpamos a ddram e pomos o cursor na posição 0,0
  lcd.write(0);              //os caracteres costumizados ficam com os valores 0...7 da tabela ascii, vamos chamá-los para o ecrã
  lcd.write(1);
}

void loop(){  
}

Desta maneira podem fazer animações trocando periódicamente de caracter.  ;)
Se meterem no ecrã um dos caracteres costumizados, e de seguida alterarem o seu bitmap, as alterações vão reflectir-se instantaneamente no ecrã...  ;)

Neste site têm uma ferramenta para a construção de caracteres (no fundo da página):
http://www.8051projects.net/lcd-interfacing/lcd-custom-character.php

Neste site têm também uma ferramenta, mas só dá valores até 7 linhas, mas têm já uma boa amostra de caracteres prontos para usarmos!
http://www.quinapalus.com/hd44780udg.html

Qualquer dúvida, não hesitem em perguntar...
Título: Re:LCD YM1602C - Caracteres Customizados
Enviado por: ricardo-reis em 17 de Julho de 2009, 05:36
e pronto.. mais uma destes lcds resolvida.. duvidas? postem.. mas acho mm k o tiago já disse tudo..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: amando96 em 17 de Julho de 2009, 10:19
Ui estive a ver se conseguia encontrar isto ^^ mas só encontrei para PIC's.

muito obrigado, tcustodio e ricardo-reis!

Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: tr3s em 17 de Julho de 2009, 10:38
Muito bem, bom trabalho! :D
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: amando96 em 17 de Julho de 2009, 16:50
http://s498.photobucket.com/albums/rr346/AmandoAbreu/?action=view&current=100_3329.jpg (http://s498.photobucket.com/albums/rr346/AmandoAbreu/?action=view&current=100_3329.jpg)

hehe.

dúvida: como se escolhe a linha em que o caracter vai? eu usei lcd.setCursor, e nada... =/
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: ricardo-reis em 17 de Julho de 2009, 17:14
lcd.setCursor(x,y);   o x controla a coluna, o y a linha.. sendo que o x varia entre 0 e 15 e o y varia entr 0 e 1..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: amando96 em 17 de Julho de 2009, 17:16
mas onde? e puz entre o

}
lcd.setCursor(0,1);
  lcd.command(72);

mas ficou na mesma...
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: ricardo-reis em 17 de Julho de 2009, 17:30
e que tal mudares o 0 e o 1.. por exemplo: lcd.setCursor(5,1);


mas explica-me melhor a tua duvida, n estejamos nós a falar de coisas diferentes..
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: tcustodio em 17 de Julho de 2009, 18:32
mas onde? e puz entre o

}
lcd.setCursor(0,1);
  lcd.command(72);

mas ficou na mesma...

Se queres definir o sítio onde vai aparecer o caracter, experimenta defini-lo antes de escrevermos o caracter, e não antes de o metermos na memória do lcd.

Primeiro defines os caracteres na memória, e antes de os escreveres, dizes onde queres que apareçam:
Código: [Seleccione]
lcd.command(64);           //este comando põe o lcd no endereço de memória 64 (0x40), é a primeira posição que temos disponível
  for (int i=0; i<8; i++){
    lcd.write(caracter1[i]);
  }
lcd.clear();
lcd.setCursor(0,1);
lcd.write(0);      // escrever zero é estar a chamar o caracter que definimos no endereço de memória 64

mas explica-me melhor a tua duvida, n estejamos nós a falar de coisas diferentes..

ricardo-reis, ele estava a definir a posição no ecrã, antes sequer de meter o caracter na memória, obviamente não ía acontecer nada...
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: amando96 em 18 de Julho de 2009, 18:21
ahh ok ok  :D  :D

foi mesmo Fail da minha parte  :-X

está aí em anexo algo que estive a fazer ;D  lol

aínda pode ser melhorado...
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: tcustodio em 18 de Julho de 2009, 22:19
deixo aqui uma actualização ao código que eu e o ricardo-reis andámos a desenvolver; no caso de andarem a pôr caracteres à doida, isto vai simplificar.

Código: [Seleccione]
uint8_t caracter1[] = {1,3,15,15,15,3,1};         // uint8_t ocupa só um byte, int ocupa 2 bytes, não me precisamos de tanta coisa
uint8_t caracter2[] = {8,16,0,24,0,16,8};         // e sempre torna o código mais leve!

void criar_caracter(uint8_t pos, uint8_t caracter[], uint8_t b){
  lcd.command(64 + 8*pos);
  for(int i=0; i<8; i++){
    if(i>=b){
      lcd.write(0);
    } else{
      lcd.write(caracter[i]);
    }
    lcd.home();
  }
}

void setup(){
  //analogWrite(6,80);
  lcd.clear();
  criar_caracter(0, caracter1, sizeof(caracter1) );     // os parâmetros são: a posição (0...7) onde guardar o caracter,
  criar_caracter(1, caracter2, sizeof(caracter2));     // o array do caracter e o sizeof() do array
  lcd.write(0);
  lcd.write(1);
}

Declarem as arrays como sendo do tipo uint8_t, ou short int, ou byte, mas têm que alterar os tipos depois na função criar_caracter().

Não precisam de declarar o tamanho da array, e não precisam de declarar o valor de todas as linhas, por exemplo:
se o vosso caracter não usa a 8ª linha, podem omitir o 8º valor da array, a função trata disso sozinha.

A função, no fim, executa lcd.home(), para sair do modo de escrita da memória; podem querer escrever caracteres na memória durante o programa principal, e se usássemos o lcd.clear() lá se ía o que lá tinhamos escrito...
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: joaoamaral em 26 de Agosto de 2009, 14:52
genial malta! vocês são fantásticos!! muito obrigado por partilharem!
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: tcustodio em 26 de Agosto de 2009, 15:23
estamos aqui é para isso, partilhar ;)
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: msaleiro em 26 de Agosto de 2009, 15:31
Partilha ai 200 euros...  ;D
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: ricardo-reis em 26 de Agosto de 2009, 15:45
 ;D ;D ;D
Título: Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
Enviado por: tcustodio em 26 de Agosto de 2009, 18:38
Partilha ai 200 euros...  ;D

nem isso tenho  :'(