Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Edu Pacheco

Deslocamento de Mensagem em Lcd 16x2 com Pic16F877

Recommended Posts

Salve a todos, sou novo no forum e tambem iniciante em PIC, estou com uma duvida que para muitos pode ser bem simples, ja fiz uma busca no forum e não encontrei nada parecido...eu gostaria de deslocar a mensagem no visor do LCD, tanto faz o lado, porém eu gostaria de ter o controle sobre a linha do LCD, Ex: deslocar apenas a 1º linha ou somente a 2º linha ou as duas juntas tanto para esquerda como para a direita toda a mensagem, estou usando um lcd 16x2 Hitachi e um PIC 16F877 o codigo que eu estou usando segue abaixo junto ao drive do LCD, na verdade eu até sei os comandos que são necessarios para o deslocamento da mensagem como por ex: 0x18 ou 0x1c no entando eu não consigo aplicar isso, não sei onde adicionar esses "Hexas".....Valeu galera espero que possam me ajudar obrigado.

drive lcd...:

struct lcd_pin_map {

BOOLEAN unused;

BOOLEAN rs;

BOOLEAN rw;

BOOLEAN enable;

int data : 4;

} lcd;

#if defined(__PCH__)

#if defined use_portd_lcd

#byte lcd = 0xF83

#else

#byte lcd = 0xF81

#endif

#else

#if defined use_portd_lcd

#byte lcd = 8

#else

#byte lcd = 6

#endif

#endif

#if defined use_portb_lcd//minhas alterações do porto b para o porto c

#define set_tris_lcd(x) set_tris_d(x)

#else

#define set_tris_lcd(x) set_tris_b(x)//minhas alterações de porto

#endif

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines

#define lcd_line_two 0x40

BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0};

struct lcd_pin_map const LCD_READ = {0,0,0,0,15};

BYTE lcd_read_byte() {

BYTE low,high;

set_tris_lcd(LCD_READ);

lcd.rw = 1;

delay_cycles(1);

lcd.enable = 1;

delay_cycles(1);

high = lcd.data;

lcd.enable = 0;

delay_cycles(1);

lcd.enable = 1;

delay_us(1);

low = lcd.data;

lcd.enable = 0;

set_tris_lcd(LCD_WRITE);

return( (high<<4) | low);

}

void lcd_send_nibble( BYTE n ) {

lcd.data = n;

delay_cycles(1);

lcd.enable = 1;

delay_us(2);

lcd.enable = 0;

}

void lcd_send_byte( BYTE address, BYTE n ) {

int cont = 200;

lcd.rs = 0;

while ( bit_test(lcd_read_byte(),7) )

{

delay_us(50);

cont --;

if (!cont) break;

}

lcd.rs = address;

delay_cycles(1);

lcd.rw = 0;

delay_cycles(1);

lcd.enable = 0;

lcd_send_nibble(n >> 4);

lcd_send_nibble(n & 0xf);

}

void lcd_init() {

BYTE i;

set_tris_lcd(LCD_WRITE);

lcd.rs = 0;

lcd.rw = 0;

lcd.enable = 0; //alterado de 0 para 1

delay_ms(15);

for(i=1;i<=3;++i) {

lcd_send_nibble(3);

delay_ms(5);

}

lcd_send_nibble(2);

for(i=0;i<=3;++i)

lcd_send_byte(0,LCD_INIT_STRING);

}

void lcd_gotoxy( BYTE x, BYTE y) {

BYTE address;

if(y!=1)

address=lcd_line_two;

else

address=0;

address+=x-1;

lcd_send_byte(0,0x80|address);

}

void lcd_putc( char c) {

switch © {

case '\f' : lcd_send_byte(0,1);

delay_ms(2);

break;

case '\n' : lcd_gotoxy(1,2); break;

case '\b' : lcd_send_byte(0,0x10); break;

default : lcd_send_byte(1,c); break;

}

}

char lcd_getc( BYTE x, BYTE y) {

char value;

lcd_gotoxy(x,y);

while ( bit_test(lcd_read_byte(),7) );

lcd.rs=1;

value = lcd_read_byte();

lcd.rs=0;

return(value);

}

++++++++++++++++++++++++++++codigo++++++++++++++++++++++++

#include <16f877a.h>

#use delay(clock=4000000)

#fuses xt,put,nowdt,protect,nobrownout,NOLVP,NOCPD

#byte porta = 0x05

#byte portb = 0x06

#byte portc = 0x07

#byte portd = 0x08

#byte porte = 0x09

#include "lcd.c"

char temp;

void main(){

set_tris_a(0x01);

set_tris_b(0x00);

set_tris_c(0x00);

set_tris_d(0x00);

set_tris_e(0x00);

porta = 0x00;

portb = 0x00;

portc = 0x00;

portd = 0x00;

porte = 0x00;

setup_adc_ports(ALL_ANALOG);

setup_adc(ADC_CLOCK_INTERNAL);

set_adc_channel(0);

lcd_init();

for(;;){

temp = read_adc();

lcd_putc("\f Temp Chiller ");

printf(lcd_putc,"\n %d%cc",temp*2,0xdf);

delay_ms(400);

while(!input(PIN_D0) ){

lcd_putc("\f Chiller Falhou ");

delay_ms(400);

}

}

}

até mais.......

Compartilhar este post


Link para o post
Compartilhar em outros sites

dê uma olhada no datasheet do próprio controlador de LCD (aquele Hitachi alguma coisa)... ele ja tem um comando que faz o deslocamento se bem me recordo.

Esse código você envia para o LCD como um comando, tal como os comandos para escrita, leitura, você apenas aplica a sequencia para habilitar a entrada de comandos, e depois envia o comando pela porta de dados para o LCD...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda Lucas vou tentar, quanto ao datasheet eu ja olhei mais não adiantou muita coisa, mais uma coisa galera, olhando nos codigos que eu postei vocês fazem ideia de onde eu deveria adicionar tal comando de deslocamoento???

Compartilhar este post


Link para o post
Compartilhar em outros sites

pior que é, eu nunca imaginei um probleminha tão zica como este, parece simples, alías é simples deslocar uma mensagem no lcd, desde que seja "UMA" mensagem e não uma rotina de termometro feito essa minha, porque na verdade onde está a mensagem lcd_putc("f Temp Chiller "); TEMP CHILLER deve haver mais informação e não apenas TEMP CHILLER entende! já estou quase desistindo rsrsrs......muito obrigado Lucas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×