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  
Tcharlles

Pic 16f628A,lcd nao responde

Recommended Posts

ola pessoal gostaria de saber se neste codigo tem algum erro, porque no ccs e no proteus ele funciona normalmente e quando gravo ele no pic 16f628A no lcd nao aparece nada; utilizo um cristal de 2 mhz e ja é o segundo lcd que nao funciona. Utilizo o port B do pic, modifiquei a linha 39 do arquivo lcd.c (#define use_portb_lcd TRUE), desde ja agradeço a ajuda.

#include "teste.h"
#include <LCD2.C>

void main() {

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();

while(1){
output_high(pin_a1);
delay_ms(500);
output_low(pin_a1);
delay_ms(500);
output_high(pin_a1);
delay_ms(500);
output_low(pin_a1);
delay_ms(500);
output_high(pin_a1);
delay_ms(500);
output_low(pin_a1);
delay_ms(2000);
lcd_gotoxy(5,1);
lcd_putc("Teste");
delay_ms(1000);
}
}]

apos modificar a linha 39 do lcd.c salvei o novo arquivo com o nome lcd2.c ,segue tb o arquivo teste.h:

#include <16F628A.h>
#fuses NOWDT,XT, PUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD
#use delay(clock=2000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A3,rcv=PIN_A2,bits=9)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salve e use este drive aqui pra o teu pic,ele ja esta setado para o 16f628a,aterre o pino rw,q ira funcionar, eu usei ele estes tempos na minha tranca com o pic16f628a e funciona 100%.

Agora so uma questao,porque nao usa o oscilador interno?


// flex_lcd.c

// These pins are for the Microchip PicDem2-Plus board,
// which is what I used to test the driver. Change these
// pins to fit your own board.

#define LCD_DB4 PIN_b4
#define LCD_DB5 PIN_b5
#define LCD_DB6 PIN_b6
#define LCD_DB7 PIN_b7

#define LCD_E PIN_b0
#define LCD_RS PIN_b1
#define LCD_RW PIN_b2

// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

//#define USE_LCD_RW 1

//========================================

#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line


int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
0xc, // Display on
1, // Clear display
6 // Increment cursor
};


//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note: !! converts an integer expression
// to a boolean (1 or 0).
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));

delay_cycles(1);
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}

//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine. For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3

retval = 0;

output_high(LCD_E);
delay_cycles(1);

retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);

output_low(LCD_E);

return(retval);
}
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;

output_high(LCD_RW);
delay_cycles(1);

high = lcd_read_nibble();

low = lcd_read_nibble();

return( (high<<4) | low);
}
#endif

//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);

delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_E);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

//----------------------------
void lcd_init(void)
{
int8 i;

output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

output_low(LCD_E);

delay_ms(15);

for(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03);
delay_ms(5);
}

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);

// If the R/W signal is not used, then
// the busy bit can't be polled. One of
// the init commands takes longer than
// the hard-coded delay of 60 us, so in
// that case, lets just do a 5 ms delay
// after all four of them.
#ifndef USE_LCD_RW
delay_ms(5);
#endif
}

}

//----------------------------

void lcd_gotoxy(int8 x, int8 y)
{
int8 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(c)
{
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;
}
}

//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;

lcd_gotoxy(x,y);

// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));

output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);

return(value);
}
#endif

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • jorgeletronico, obrigado pelo codigo vou testar amanha mesmo; a questao do oscilador é q nunca usei o oscilador interno, posso usar o oscilador interno configurado como 4mhz e obter uma boa precisão? e outra duvida, tem como testar o lcd para saber se ele estar queimado?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • jorgeletronico,se eu configurar os fuses deste modo, o intrc corresponde ao oscilador interno nao?

    #fuses NOWDT,INTRC, NOPUT, NOPROTECT, BROWNOUT, MCLR, LVP, NOCPD

    qual a função do _io? você conhece algum modo de testar se o lcd está queimado?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    nao sei q compilador usa,eu uso o ccs.Desde modo intrc_io,estadizendo q ira usar o oscilador rc interno e seus pinos serao usados como entrada ou saida,porque amigo qual o problema do lcd?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • também utilizo o ccs; na opção de escolher o oscilador no pic wizard aparece oscilador interno rc(intrc) e oscilador interno rc,sem clkout. gostaria de testar o lcd porque ele so ascende o backlight, mesmo usando ele com um 18f4550

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • sim, montei o circuito tudo certo, potenciometro(5k), aterrei o rw, utilizei o oscilador interno. programei o pic substituindo o lcd2.c pelo flex_ldc.c ; mas mesmo assim ele nao responde por isso gostaria de um meio para saber se ele(lcd) esta queimado, tudo indica que está.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • sobre o display encontrei esse pdf, mas nao achei qual o processador dele:

    http://shop.a-z-e.de/pub/JHD162A%20SERIES.pdf

    achei tb essa pagina aqui que parece conter uma solução, vou verificar:

    http://bugsa.blogspot.com/2009/12/arduino-e-display-jhd-162a.html

    o pino 3 do lcd(contraste) suporta de 0 a 5 Volts correto?

    Editado por Tcharlles

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    cara uma forma de saber se o lcd ta queimado uo não é ligando ele se ficar um monte de quadradinho na linha de cima ele ta peganu só não foi inicializado corretamente

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • ola pessoal, obrigado pela ajuda, funcionou. fiz como no link que postei, la dizia pra aterrar o rw(como o jorgeletronico disse) e no contraste nao usa potenciometro simplesmente aterra, usa o oscilador interno tb foi bom porque pude colocar o lcd o mais proximo possivel dos pinos do pic, sem jumpers.

    moderador, topico resolvido.

    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

    ×