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

Editar arquivo lcd.c com compilador ccs

Recommended Posts

Pessoal estou utilizando o PIC16F628A, compilador CCS e MPLAB.

Ja usei o search do forum, procurei em outros lugares e tentei muitas vezes sem sucesso fazer a comunicação do LCD (16x2) com meu pic. Meu problema esta na edição do arquivo "lcd.c", os pinos que estou utilizando são:

DB7--> RA7

DB6--> RA6

DB5--> RA5

DB4--> RA4

E--> RA2

RS--> RA3

RW--> GROUND

Em minha busca descobri que deveria editar o arquivo lcd.c com as seguintes linhas:

struct lcd_pin_map {

BOOLEAN unused1; // Para RA0

BOOLEAN unused2; // Para RA1

BOOLEAN enable; // Para RA2

BOOLEAN rs; // Para RA3

int data : 4; // Para RA4-RA7

} lcd;

e além de tudo incluir "#device 16F628A" logo no comeco do arquivo.

Apesar de fazer estes passos, o compilador detecta muitos erros.

Alguma coisa eu estou fazendo de errado na edição deste arquivo, pois eu compilei utilizando um arquivo pronto que encontrei na internet para um pic16F877 e a compilacao foibem sucedida.

Gostaria que, se possível, alguem me ajudasse na edição do "lcd.c" ou que disponibilizasse um codigo pronto para minha aplicação.

Obrigado pessoal,

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Viu neto, o arquivo lcd.c nao tem segredo mesmo eu apenas modifiquei aquela parte do comeco do tópico e acrescentei a linha "#define PIC16F628A"

    Meu arquivo principal é o seguinte:

    -----------------------------------------------------------------

    #include <16F628A.h>

    #use delay(clock=4000000) // you must use this line becuse the LCD.C use the delay_us() functions

    #define use_porta_lcd

    #include <lcd.c>

    void main() {

    lcd_init();

    lcd_gotoxy(1,1);

    lcd_putc("Hello World");

    }

    ----------------------------------------------------------------------

    Valeu,

    Abraços.

    Editado por bruno.gf

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Mas a compilação do lcd.c esta dando erro!!

    Nao sei se o que estou fazendo esta certo entendeu???

    ALguem teria um codigo lcd.c pra eu dar uma olhada???

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Porque em vez de usar função pronta, faz sua propria função para iniciar o LCD, o melhor de tudo será que voce vai saber como ele funciona!!

    E assim um dia poder editar corretamente a biblioteca.

    Veja esse arquivo de como operar um LCD qualquer:

    http://reocities.com/CapeCanaveral/6744/a_04_03.pdf

    mas leia tudo e entenda como funciona, qualquer duvida so perguntar!

    ABS.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Felipe muito obrigado pela apostila. Ja li ela inteira e achei bem esclarecedora!

    Consegui criar um arquivo "lcd.c" baseado em um outro que encontrei. Neste arquivo fiz praticamente as mesmas mudancas que eu citei no comeco do tópico, a compilacão foi bem sucedida e consegui enviar a programacao ao meu pic. Só que quando coloco os 5V na protoboard, o lcd nao da nem sinal de vida!! Ja revisei umas dez vezes as intalacões e elas estão ok, também conferi o pic e esta funcionando normalmente. Abaixo segue o codigo do lcd.c que estou usando, se puder dar uma olhada e identificar algo de incoerente eu lhe agradeceria.

    Código:

    ----------------------------------------------

    #define use_portb_lcd TRUE

    struct lcd_pin_map {

    BOOLEAN unused1; // RB0

    BOOLEAN unused2; // RB1

    BOOLEAN enable; // RB2

    BOOLEAN rs; // RB3

    int data : 4; // RB4-RB7

    } lcd;

    //

    #byte lcd = 0xF81 // Direcao da estrutura "lcd".

    #byte lcd = 6 // Direcao da porta B.

    #define set_tris_lcd(x) set_tris_b(x)

    #define lcd_type 2 // Tipo de LCD: 0=5x7, 1=5x10, 2=2 linha

    #define lcd_line_two 0x40 // Direcao de LCD RAM para a 2da. linha

    //

    //Defino a cadeia de inicializacao do LCD.

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

    //

    //Configuro o estado de cada pino para leitura e escrita:

    struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // Escrever.

    struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // Ler.

    //

    //Funcoes:

    BYTE lcd_read_byte() {

    BYTE low,high;

    set_tris_lcd(LCD_READ);

    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 ) {

    lcd.rs = 0;

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

    lcd.rs = address;

    delay_cycles(1);

    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.enable = 0;

    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;

    }

    }

    -----------------------------------------------------

    E o rw estou conectando direto no GND.

    Aguardo sua resposta Felipe, muito obrigado desde já.

    abraços.

    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

    ×