• Welcome to LusoRobótica - Robótica em Português.
 

LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados

Started by tcustodio, 17 de July de 2009, 05:29

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

tcustodio

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:



Vamos ao código:

#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...
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

ricardo-reis

e pronto.. mais uma destes lcds resolvida.. duvidas? postem.. mas acho mm k o tiago já disse tudo..

amando96

Ui estive a ver se conseguia encontrar isto ^^ mas só encontrei para PIC's.

muito obrigado, tcustodio e ricardo-reis!


tr3s

Tr3s
Daniel Gonçalves

amando96


ricardo-reis

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..

amando96

mas onde? e puz entre o

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

mas ficou na mesma...

ricardo-reis

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..

tcustodio

Quote from: amando96 on 17 de July de 2009, 17:16
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:

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


Quote from: ricardo-reis on 17 de July de 2009, 17:30
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...
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

amando96

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...

tcustodio

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.


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...
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

joaoamaral

genial malta! vocês são fantásticos!! muito obrigado por partilharem!
Twitter: @joaoamaral | Skype: joaoamaral

tcustodio

Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

msaleiro

msaleiro - Mário Saleiro
UAlg FCT-DEI / VisLab - Instituto de Sistemas e Robótica / eLab Hackerspace
http://thebitbangtheory.com