Ir ao conteúdo
  • Cadastre-se

Deslocamento de Mensagem em Lcd 16x2 com Pic16F877


Edu Pacheco

Posts recomendados

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.......

Link para o comentário
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...

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!