Отговори на тема  [ 6 мнения ] 
Използване на *.h *.c файлове 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение Използване на *.h *.c файлове
Стигнах до следния проблем:
Искам да разделя в отделни файлове функциите за работа.
Например в LCD.h да си сложа функциите за работа с LCD.Само че нещо не се получава.Част от програмата е това:

#include <pic18f4550.h>
#include <math.h>
#include <stdlib.h>
#define XTAL_FREQ 36MHZ
#include "LCD.h"
#include "delay.h"


static bit LCD_EN @ ((unsigned)&PORTB*8+6); // Enable
static bit LCD_RS @ ((unsigned)&PORTB*8+4); // Register select
static bit LCD_RW @ ((unsigned)&PORTB*8+5); // Register select

extern void LCD_STROBE(void);
extern void lcd_init(void);
extern void lcd_write(unsigned char c);
extern void lcd_poz(unsigned char c);
extern void lcd_puts(const char * s);
extern void lcd_goto(unsigned char row,unsigned char pos);
extern void lcd_clear(void);



void main()
{
init();
lcd_init();
for(;;);
}

Във LCD.h имам :

//----------------------------------------------------------------------------------------
void LCD_STROBE(void){
LCD_EN = 1;
asm("nop");
asm("nop");
LCD_EN = 0;
}
//----------------------------------------------------------------------------------------
void lcd_init(void)
{
int pr;
LCD_RW=0;
LCD_RS = 0;
DelayUs(20);
pr=0x30;
//--------------------------------------------------
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
и така нататък
.........
}
Изкарва се грешка:

Error[192] C:\Program Files\Microchip\work\PIС\LCD.h 11 : undefined identifier "LCD_EN"
Error[192] C:\Program Files\Microchip\work\PIС\LCD.h 20 : undefined identifier "LCD_RW"
Error[192] C:\Program Files\Microchip\work\PIС\LCD.h 21 : undefined identifier "LCD_RS"

Как се ползват функции от друг файл?И какви са особенностите?


Съб Май 05, 2007 4:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
В .h файловете се слагат декларациите на функциите. В .c файловете - дефинициите им.

void LCD_STROBE(void); // Tова е декларацията

А това дефиницията на LCD_STROBE():

void LCD_STROBE(void){
LCD_EN = 1;
asm("nop");
asm("nop");
LCD_EN = 0;
}

В твоя случай грешката идва от това че си декларирал:
static bit LCD_EN @ ((unsigned)&PORTB*8+6); // Enable
static bit LCD_RS @ ((unsigned)&PORTB*8+4); // Register select
static bit LCD_RW @ ((unsigned)&PORTB*8+5); // Register select
след като си написал:
#include "LCD.h"
Понеже в LCD.h неправилно си сложил дефинициите там не можеш да използваш LCD_EN, LCD_RS и LCD_RW. Които декларираш по-късно.

Въобще заформил си една малка боза.

Направи така:
Съдържание на LCD.h

Код:
#ifndef LCD_H
#define LCD_H

extern void LCD_STROBE(void);
extern void lcd_init(void);
extern void lcd_write(unsigned char c);
extern void lcd_poz(unsigned char c);
extern void lcd_puts(const char * s);
extern void lcd_goto(unsigned char row,unsigned char pos);
extern void lcd_clear(void);

#endif // LCD_H


Съдържание на LCD.c
Код:
#include "LCD.h"
#include "delay.h"
// Тука слагаш всички заглавни файлове които се изискват от функциите за работа с LCD

static bit LCD_EN @ ((unsigned)&PORTB*8+6); // Enable
static bit LCD_RS @ ((unsigned)&PORTB*8+4); // Register select
static bit LCD_RW @ ((unsigned)&PORTB*8+5); // Register select

/----------------------------------------------------------------------------------------
void LCD_STROBE(void){
LCD_EN = 1;
asm("nop");
asm("nop");
LCD_EN = 0;
}
//----------------------------------------------------------------------------------------
void lcd_init(void)
{
int pr;
LCD_RW=0;
LCD_RS = 0;
DelayUs(20);
pr=0x30;
//--------------------------------------------------
PORTB=(0x0f&(pr>>4));
LCD_STROBE();
и така нататък
.........
}


След това където искаш да използваш функциите за LCD просто пишеш
#include "LCD.h"
Разбира се в началото на файла преди да си използвал още някоя от функциите.


Съб Май 05, 2007 4:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Благодаря за спасителната сламка - излязох от бозата :)


Съб Май 05, 2007 8:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение 
Tooo ако позлваш CCS той е малко странен в това отношение.


Съб Май 05, 2007 9:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Ползвам Хайтек компилатор 9.50 PL 3 ,пробвах и ПРО версията,излекували са я но е бъгава все още.


Съб Май 05, 2007 9:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
ToHu написа:
Tooo ако позлваш CCS той е малко странен в това отношение.


Какво ти "странен", той си е направо ненормален.


Съб Май 05, 2007 9:24 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни