Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
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

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

×