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

LCD YM1602C 16x2 (Compatível HD44780) TEXT SCROLL

Started by ricardo-reis, 12 de July de 2009, 17:06

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

ricardo-reis

Bem, pessoal.. A pedido de várias famílias, e com uns toques de outras tantas, venho cá postar um exemplo simples de como pôr o texto dos vossos lcds a rodar no ecrã:

Código Actualizado

#include <MsTimer2.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int i=16;
char teste[35] = "abcd";   // arrays de caracteres de tamanho máximo recomendável de 412 caracteres
char aux[35] = "";                             // de forma a que estes sejam impressos sem qualquer tipo de problema

void escreve() {
 lcd.clear();
 if(i==0){
   if (teste!=aux){
     for(int a=0; a<sizeof(teste); a++){
       aux[a] = teste[a];
     }
   }
 }
 if(i<0){
   for(int a=0; a<sizeof(aux); a++){
     aux[a] = aux[a+1];  
   }
   lcd.setCursor(0,0);
   lcd.print(aux);
   if(aux[0]=='\0'){
     i=16;
   }
 }
 else{
   lcd.setCursor(i,0);
   lcd.print(teste);
   i--;
 }
}
void setup() {
 analogWrite(6,80);  // isto serve para quem tem o pino 6 do arduino ligado ao pino que regula o contraste do lcd
 MsTimer2::set(250, escreve);  // 250 é o tempo em ms.. se quiserem ter o texto a rodar mais depressa diminuam o tempo, se quiserem mais devagar aumentem..
 MsTimer2::start();
}

void loop() {
}


com isto, e sem nenhum outro recurso a hardware podem pôr arrays de 412 caracteres a passar no vosso lcd.. (isto numa linha, conforme o exemplo, se quiserem nas duas terão que dividir o valor).
se os vossos projectos forem mais exigentes a nível de caracteres, podem sempre pensar em aplicar o tutorial do tr3s, que vos ensina a interagir entre arduino e eeproms, que podem encontrar aqui.

alguma sugestão correcção será bem vinda..
(bem como os vossos videos, já que eu n tenho como postar aqui um)

ps: ainda faço referência à possibilidade de, para quem isso interessar, poder controlar o shift do lcd, que permite fazer o scroll do texto que está no lcd. este tem a capacidade para 80 caracteres, como diz o datasheet. para fazer uso deste shift: lcd.command(24);

pss: agradeço também a disponibilidade do metRo_ e do Tr3s que me deram umas dicas sobre isto.. ;)

metRo_


tcustodio

na libraria LCD4bit, já existem funções pré definidas para o scroll de texto :P

mas por acaso também gosto mais da Liquid Crystal, acho-a mais "madura"

na cpp da LCD4bit está este código:

#define CMD_LEFT 0x18

void LCD4Bit::leftScroll(int num_chars, int delay_time){
 for (int i=0; i<num_chars; i++) {
   commandWrite(CMD_LEFT);
   delay(delay_time);
 }
}


parece-me remeter para o tal shift interno do lcd

tenho que experimentar esse teu código. Isto era giro era com um ecrã 20x4  8)
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.


amando96


ricardo-reis

Quote from: little resources on 12 de July de 2009, 18:43
e já agora, como se faz para o texto ir da esquerda para a direita??

em vez de começar na posição 16 deve passar a começar da posição 0 ou -1, em vez de decrementares o i, incrementas, em vez de apagar a primeira posição do array aux passas a apagar a ultima.. assim de repente é só..

amando96

Quote from: ricardo-reis on 12 de July de 2009, 19:08
Quote from: little resources on 12 de July de 2009, 18:43
e já agora, como se faz para o texto ir da esquerda para a direita??

em vez de começar na posição 16 deve passar a começar da posição 0 ou -1, em vez de decrementares o i, incrementas, em vez de apagar a primeira posição do array aux passas a apagar a ultima.. assim de repente é só..

ahh ok ok, eu procurei algo no código, mas não pensei que fosse isso, até puz 1250, em vez de 250 :P


se a lguem comprar uns daqueles LCD's de 4X20 char, peça mais um pra mim se faz favor :)

ricardo-reis

como eu digo no comentário ao 250, alterar aquele valor só altera o tempo de rotação do texto.. um valor mais baixo e o texto anda mais depressa, um valor mais alto e o texto anda mais devagar..

tcustodio

Quote from: little resources on 12 de July de 2009, 19:23
se a lguem comprar uns daqueles LCD's de 4X20 char, peça mais um pra mim se faz favor :)

se eu comprar, aviso-te  8)
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

amando96

ok obrigado :)


tenho uma questão, não me lembro onde, mas vi esse código já noutro local...

mas só tinha 6 fios ligados ao arduino... como? porque? era o mesmo LCD...

ricardo-reis

este código n deves ter visto (pk é meu e só o postei aqui), mas se viste, podes dizer onde e quando..


quanto aos 6 fios, é mt simples.. eu tenho 8, dos quais posso tirar um, que é o do contraste e ligá-lo a vcc com uma resistencia ou potenciometro, e o 11 (se n tou em erro) que podes ligar a gnd (confirma no outro topico)..

amando96


ricardo-reis

pessoal, quem está a usar o código aqui postado, passem a usar esta versão que apresento neste post.

só acrescentei uma linha, mas que permite ao lcd limpar a ram. reparei que ele passado algum tempo se começava a baralhar e a imprimir coisas fora do sítio.


#include <MsTimer2.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int i=16;
char teste[35] = "abcd";   // arrays de caracteres de tamanho máximo recomendável de 412 caracteres
char aux[35] = "";                             // de forma a que estes sejam impressos sem qualquer tipo de problema

void escreve() {
 lcd.clear();
 if(i==0){
   if (teste!=aux){
     for(int a=0; a<sizeof(teste); a++){
       aux[a] = teste[a];
     }
   }
 }
 if(i<0){
   for(int a=0; a<sizeof(aux); a++){
     aux[a] = aux[a+1];  
   }
   lcd.setCursor(0,0);
   lcd.print(aux);
   if(aux[0]=='\0'){
     lcd.print("                ");
     i=16;
   }
 }
 else{
   lcd.setCursor(i,0);
   lcd.print(teste);
   i--;
 }
}
void setup() {
 analogWrite(6,80);  // isto serve para quem tem o pino 6 do arduino ligado ao pino que regula o contraste do lcd
 MsTimer2::set(250, escreve);  // 250 é o tempo em ms.. se quiserem ter o texto a rodar mais depressa diminuam o tempo, se quiserem mais devagar aumentem..
 MsTimer2::start();
}

void loop() {
}

ricardo-reis

Quote from: little resources on 12 de July de 2009, 21:49
está aí
http://arduino.cc/en/Tutorial/LiquidCrystalScroll

mas agora que olhei com olhos de ver, reparei que é diferente...

ok.. fui lá ver o código e explico-te por alto as diferenças essenciais:

no que eu apresentei, é usada a mstimer2, que vos permite que o programa continue a executar sem parar..
no que está nesse link, são usados os delays, que páram a execução de código, pelo tempo do delay, não permitindo que seja executado mais nada.

amando96

ahh ok :)

então este em 100 vezes melhor!!

mas não podia fazer mesmo mais nada nada nada?