Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Използване на *.h *.c файлове
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4155
Страница 1 от 1

Автор:  Ки4о [ Съб Май 05, 2007 4:27 pm ]
Заглавие:  Използване на *.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"

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

Автор:  Zdrav [ Съб Май 05, 2007 4:54 pm ]
Заглавие: 

В .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"
Разбира се в началото на файла преди да си използвал още някоя от функциите.

Автор:  Ки4о [ Съб Май 05, 2007 8:10 pm ]
Заглавие: 

Благодаря за спасителната сламка - излязох от бозата :)

Автор:  ToHu [ Съб Май 05, 2007 9:16 pm ]
Заглавие: 

Tooo ако позлваш CCS той е малко странен в това отношение.

Автор:  Ки4о [ Съб Май 05, 2007 9:21 pm ]
Заглавие: 

Ползвам Хайтек компилатор 9.50 PL 3 ,пробвах и ПРО версията,излекували са я но е бъгава все още.

Автор:  bateAz [ Съб Май 05, 2007 9:24 pm ]
Заглавие: 

ToHu написа:
Tooo ако позлваш CCS той е малко странен в това отношение.


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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/