Ir ao conteúdo

Rolagem do texto.


admilson moreira

Posts recomendados

Postado

Olá!!

Como faço para rolar um texto no display lcd 16x20 usando o pic 18f4520. O programa foi feito em linguagem C e copilado pelo C18. Simulando no Proteus a mensagem aparece, mas não consigo fazê-la aparecer da esquerda para direita. Algo parecido com a mensagem dos displays de telefones públicos.

Obrigado.

Postado

Poste o código para saber qual biblioteca está usando,se é que esta usando alguma,pois existe um comando no display para fazer isso que voce quer.

Postado

O código está assim:

/** I N C L U D E S **********************************************************/
#include <p18f4520.h>

#include <delays.h>

#include <stdio.h>

#include "displayLCD.h"

#include <stdlib.h>

#include <math.h>

/** V A R I A V E I S G L O B A I S ****************************************/

unsigned char linha1[20]="MENSAGEM DE TEXTO ROLANDO";
unsigned char linha2[20];
/** P R O T O T I P O S P R I V A D O S ***********************************/
void ConfiguraSistema(void);


void main(void)
{
// Configura as portas e periféricos usados no projeto
ConfiguraSistema();

// Seleciona o endereço inicial da linha 1 (0x80) do display
envia_byte_lcd(0,0x80);
// Escreve a string da "ROM" no display LCD
putsXLCD(linha1);
Delay10KTCYx(250);
}//end main

void ConfiguraSistema(void)
{
ADCON1=0x0F;
TRISD = 0b00000000;
PORTD = 0b00000000;

//Inicializa o LCD 16x2 alfa-numerico
inicializa_lcd();

}//end ConfiguraSistema

Mas pode ser alterado. É apenas para efeito didático.

Postado

De uma lida no Datashhet do controlador que tem mais comandos.

Como é didádico,analise como deslocar uma linha só.

Eu não usei a lib "displayLCD.h" porque não a tenho,mas no próprio código voce pode alterar o PORT e os pinos para ligar no LCD.



#include <p18f2550.h>
#include <delays.h>
//#define CLK_4MHZ 1
#pragma config PLLDIV=2, CPUDIV=OSC1_PLL2, USBDIV=2, FOSC=HS//, FCMEM=OFF //CRISTAL =CPU COM 8 MHZ SEM PLL E USB FULLSPEED 48MHZ
#pragma config IESO=OFF, PWRT=OFF, BOR=ON_ACTIVE, BORV=3, VREGEN=ON, WDT=OFF
#pragma config MCLRE=ON, PBADEN=OFF, CCP2MX=OFF, STVREN=ON, LVP=ON, XINST=OFF, DEBUG=OFF
//.............................................................
//LCD (PortB)
#define E PORTBbits.RB6
#define R_W PORTBbits.RB5
#define RS PORTBbits.RB4
#define LCDdata PORTB //D4=B0,D5=B1,D6=B2,D7=B3
//..............................................................
void command(unsigned char);
void write(unsigned char);
void Nybble(unsigned char);
void init(void);
void PutMessage(const rom char *);
//.................................................................
void main()
{
unsigned char i;

ADCON1 = 0x0F; //make RA0 digital
TRISA = 0x00;
TRISB = 0x00;
// TRISD = 0x00;
init();
while(1){

command(0x0C); //PRIMEIRA LINHA
PutMessage("Display LCD 16X2");
command(0xC0); //SEGUNDA LINHA
PutMessage(" Compilador C18");
for(i=0;i < 16;i++){
Delay1KTCYx(100);
command(0x18); //MOVE PARA A ESQUERDA
}
for(i=0;i < 16;i++){
Delay1KTCYx(100);
command(0x1C); //MOVE PARA A DIREITA
}
Delay1KTCYx(255);
command(0x01); //LIMPA O DISPLAY
}

}

//Write a string to the LCD
void PutMessage(const rom char *Message)
{
const rom char *Pos = Message;
while(*Pos!=0)
write(*Pos++);
}

/**********************************************************/
//4-bit methods for LCD
/**********************************************************/
void command(unsigned char i)
{
RS =0;
R_W =0; //R/W=LOW : Write
Nybble(i>>4); //Send upper 4 bits
Nybble(i); //Send lower 4 bits
Delay1KTCYx(2); //must wait at least 2mS (2*1000*4/1e6 = 8ms used)
}
//..............................................................
void write(unsigned char i)
{
RS =1;
R_W =0; //R/W=LOW : Write
Nybble(i>>4); //Send upper 4 bits
Nybble(i); //Send lower 4 bits
Delay1KTCYx(2); //must wait 2mS
}
/**********************************************************/
void Nybble(unsigned char dat)
{
dat &= 0x0f; //clear top bits of dat
LCDdata &= 0xf0; //clear bottom bits of port (interested only in DB7-DB4)
LCDdata |= dat; //or the two and store at port
E = 1;
Delay1TCY(); //enable pulse width >= 300ns (used 4uS)
E = 0; //Clock enable: falling edge
}
/**********************************************************/
void init(void)
{
LCDdata=0x00;
Delay1KTCYx(40); //Wait >15 msec after power is applied (used 20mS)
Nybble(0x30); //command 0x30 = Wake up
Delay1KTCYx(15); //must wait 160us, busy flag not available (used 160uS)
Nybble(0x02); //command 0x30 = Wake up #2
Delay1KTCYx(15); //must wait 160us, busy flag not available (used 160uS)

command(0x2C); //Function set: 4-bit/2-line
command(0x0C); ////PRIMEIRA LINHA
command(0x06); //Entry Mode set
command(0x01);
}
/**********************************************************/

Um detalhe importante!!

Eu esquecí que voce está usando o 4520,altere o Include para #include <p18f4520.h> e mude os parametros do PORTB para o PORTD no código!

Mude os pinos e PORT aquí;

#define E PORTBbits.RB6

#define R_W PORTBbits.RB5

#define RS PORTBbits.RB4

#define LCDdata PORTB //D4=B0,D5=B1,D6=B2,D7=B3

Apague as linhas abaixo ou set conforme seu projeto;

#pragma config PLLDIV=2, CPUDIV=OSC1_PLL2, USBDIV=2, FOSC=HS//, FCMEM=OFF //CRISTAL =CPU COM 8 MHZ SEM PLL E USB FULLSPEED 48MHZ

#pragma config IESO=OFF, PWRT=OFF, BOR=ON_ACTIVE, BORV=3, VREGEN=ON, WDT=OFF

#pragma config MCLRE=ON, PBADEN=OFF, CCP2MX=OFF, STVREN=ON, LVP=ON, XINST=OFF, DEBUG

  • Coordenador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!