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
-
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:
#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...
-
e pronto.. mais uma destes lcds resolvida.. duvidas? postem.. mas acho mm k o tiago já disse tudo..
-
Ui estive a ver se conseguia encontrar isto ^^ mas só encontrei para PIC's.
muito obrigado, tcustodio e ricardo-reis!
-
Muito bem, bom trabalho! :D
-
http://s498.photobucket.com/albums/rr346/AmandoAbreu/?action=view¤t=100_3329.jpg (http://s498.photobucket.com/albums/rr346/AmandoAbreu/?action=view¤t=100_3329.jpg)
hehe.
dúvida: como se escolhe a linha em que o caracter vai? eu usei lcd.setCursor, e nada... =/
-
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..
-
mas onde? e puz entre o
}
lcd.setCursor(0,1);
lcd.command(72);
mas ficou na mesma...
-
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..
-
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
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...
-
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...
-
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...
-
genial malta! vocês são fantásticos!! muito obrigado por partilharem!
-
estamos aqui é para isso, partilhar ;)
-
Partilha ai 200 euros... ;D
-
;D ;D ;D
-
Partilha ai 200 euros... ;D
nem isso tenho :'(