TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: simon365 en 12 de Julio de 2008, 19:30:07
-
Hola a todos:
Tengo el problema de linkeado a la llamada al archivo lcd.c el cual me da este error:
Error 128 "LCD1.c" Line 21(1,1): A #DEVICE required before this line
el archivo es:
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 // Direccion de la estructura "lcd".
#byte lcd = 6 // Direccion del puerto B.
#define set_tris_lcd(x) set_tris_b(x)
#define lcd_type 2 // Tipo de LCD: 0=5x7, 1=5x10, 2=2 lineas
#define lcd_line_two 0x40 // Dirección de la LCD RAM para la 2da. linea
//
//Defino la cadena de inicializacion del LCD.
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}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
//Funciones//
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 ) {
lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
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;
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 (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;
}
}
char lcd_getc( BYTE x, BYTE y) {
char value;
lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}
gracias-
-
Hola.
Cuando incluyas las librerias, es suficiente hacerlo en el programa principal, no se debe incluir en el Source File, ya que la va a compilar como un archivo C independiente y obviamente no tiene las definiciones del dispositivo. El error que te genera es porque el archivo lcd.c no tiene el archivo de cabecera del micro a usar, es decir te esta compilando el archivo como si fuera el main.
Saludos
-
MLO: Tal cual lo hago en el ppal.Este archivo lcd.c es al q llamo pero me da el error.
#include <16F819.h>
#device adc=10 // Conversión con 10 bits
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use fast_io(b)
#use delay (clock=4000000)
#include <LCD.c> //
-
Hola.
Esta correcto, mi duda es si tu ademas de colocar el #include en el programa principal, tambien lo añades en el Proyect Contex Menu, dandole click derecho a Source Files y escogiendo la opcion Add Files ... ya que asi te compilara el archivo lcd.c y aparecera ese error.
Saludos
-
MLO:
Me cayo la ficha, efectivamente lo habia incluido en el Source Files.
Luego de dejar un rato y volver, las cosas se aclaran.
cha gracias.