Ir ao conteúdo
  • Cadastre-se

Editar arquivo lcd.c com compilador ccs


bruno.gf

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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.

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

Link para o comentário
Compartilhar em outros sites

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.

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