collapse

* Links de Robótica

* Posts Recentes

Ligar Células de Lithium por Hugu
[Hoje às 02:00]


Encomenda Colectiva N3-2016[@Mouser - Aberta a pedidos!] por Hugu
[Hoje às 01:53]


Printer 3D barata por xmatias
[Ontem às 03:56]


Servidor por almamater
[09 de Dezembro de 2016, 21:39]


mysql server error por andre_f_carvalho
[09 de Dezembro de 2016, 18:56]


Cortar plástico ABS por msr
[05 de Dezembro de 2016, 17:27]


MOVIDO: FPV Drone Racing? por metRo_
[05 de Dezembro de 2016, 10:49]


Módulo gsm por dio123
[04 de Dezembro de 2016, 23:06]


Procuro resistências 220 Ohm de 1% por brunus
[02 de Dezembro de 2016, 15:50]


Package de cond 10uF 35V smd? por KammutierSpule
[02 de Dezembro de 2016, 11:19]

Autor Tópico: LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados  (Lida 5493 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline tcustodio

  • Mini Robot
  • *
  • Mensagens: 344
  • "beware of programmers who carry a soldering iron"
    • Youtube
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:
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...
« Última modificação: 17 de Julho de 2009, 05:50 por tcustodio »
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.300
Re:LCD YM1602C - Caracteres Customizados
« Responder #1 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..

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #2 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!


Offline tr3s

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 811
  • char x=1, y=5; x^=y^=x^=y;
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #3 em: 17 de Julho de 2009, 10:38 »
Muito bem, bom trabalho! :D
Tr3s
Daniel Gonçalves

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #4 em: 17 de Julho de 2009, 16:50 »
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... =/

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.300
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #5 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..

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #6 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...

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.300
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #7 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..
« Última modificação: 17 de Julho de 2009, 17:40 por ricardo-reis »

Offline tcustodio

  • Mini Robot
  • *
  • Mensagens: 344
  • "beware of programmers who carry a soldering iron"
    • Youtube
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #8 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...
« Última modificação: 17 de Julho de 2009, 18:36 por tcustodio »
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #9 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...
« Última modificação: 18 de Julho de 2009, 19:23 por amando96 »

Offline tcustodio

  • Mini Robot
  • *
  • Mensagens: 344
  • "beware of programmers who carry a soldering iron"
    • Youtube
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #10 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...
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

Offline joaoamaral

  • Mini Robot
  • *
  • Mensagens: 218
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #11 em: 26 de Agosto de 2009, 14:52 »
genial malta! vocês são fantásticos!! muito obrigado por partilharem!
Twitter: @joaoamaral | Skype: joaoamaral

Offline tcustodio

  • Mini Robot
  • *
  • Mensagens: 344
  • "beware of programmers who carry a soldering iron"
    • Youtube
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #12 em: 26 de Agosto de 2009, 15:23 »
estamos aqui é para isso, partilhar ;)
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

Offline msaleiro

  • Mini Robot
  • *
  • Mensagens: 691
    • Blog
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #13 em: 26 de Agosto de 2009, 15:31 »
Partilha ai 200 euros...  ;D
msaleiro - Mário Saleiro
UAlg FCT-DEI / VisLab - Instituto de Sistemas e Robótica / eLab Hackerspace
http://thebitbangtheory.com

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.300
Re:LCD YM1602C 16x2 (Compatível HD44780) - Caracteres Customizados
« Responder #14 em: 26 de Agosto de 2009, 15:45 »
 ;D ;D ;D