آموزش ایجاد کتابخانه در زبان C

در پست قبل در مورد  دلیل استفاده از کتابخانه در زبان C اطلاعاتی ارئه شد در این قسمت از آموزش زبان برنامه نویسی C در الکترولب به نحوه ایجاد کتابخانه در زبان C می پردازیم. برای آموزش مثال ساده ای انتخاب شده که به صورت کتابخانه پیاده سازی می شود. پیش نیاز درک این قسمت از آموزش آشنا بودن به برنامه نویسی C است. سعی می کنم در آینده چند پست آموزش C به زبان ساده داشته باشم.

مثالی که من برای ادامه آموزش در نظر گرفتم ایجاد کتابخانه ی led چشمک زن برای میکروکنترلر AVR در زبان C و محیط کدویژن می باشد. برنامه ای که نوشته شده سه قسمت دارد که به ترتیب توضیح داده خواهد شد:

  1. فایل اصلی main.c
  2. فایل هدر led.h
  3. فایل led.c

فایل اصلی main.c

#include "led.h"
#include <delay.h>


void main (void){

	led_init();
	switch_init();
	
while(TRUE){
	
	if(switch_state()==TRUE){
		
		led_on();
		delay_ms(300);
		led_off();
		delay_ms(300);
	}
}
}

این فایل اصلی برنامه است. اگر متوجه شده باشید دیگر به طور مستقیم در این قسمت با رجیستر های میکروکنترلر کاری نداریم و فهمیدن و دنبال کردن روند برنامه برای ما ساده تر شده است. و این یکی از مزایای استفاده از این نوع برنامه نویسی است. خط به خط برنامه را با هم بررسی می کنیم تا روند نوشتن کتابخانه آشنا شوید.

سطر 1 و 2 دستور include :

توسط این دستور کتابخانه های لازم را به برنامه اضافه می کینم. فقط توجه کنید که در سطر اول وقتی کتابخانه ی led.h را که توسط خودمان ایجاد شده به برنامه اضافه می کنیم از نماد “” استفاده کردیم به این دلیل از این نماد استفاده شده که به کامپایلر بفهمانیم باید دنبال این فایل در جایی که پروژه تعریف شده است بگردد . ولی در مورد delay.h چون این فایل مسیر پیش فرض خود کامپایلر قرار دارد به طور معمول  به صورت <delay.h> تعریف می شود.

تابع led_init و switch_init :

این دو تابع برای تنظیم اولیه ی پورت های متصل به کلید و led به کار می رود که در ادامه در فایل کتابخانه تعریف می شوند.

روند کلی برنامه به این صورت است که در صورت فشرده شدن کلید شرط if داخل حلقه while درست بوده و led  مورد نظر چشمک خواهد زد.

فایل هدر led.h

#ifndef _LED_H
#define _LED_H

#include <mega32.h>


#define		LED_DDR		DDRA.0
#define		LED_PORT	PORTA.0
#define		SWITCH_DDR	DDRD.0
#define		SWITCH_PIN	PIND.0
#define		TRUE		1
#define		FALSE		0

void led_init(void);
void switch_init(void);
int switch_state(void);
void led_on(void);
void led_off(void);

#endif

فایل led.h با یک دستور پیش پردازنده شروع شده است. برای جلوگیری از چندبار include شدن کتابخانه که منجر به بروز اشکال در روند build شدن پروژه می شود. برای هدر فایل ها محافظ (Guard) در نظر می گیریم. به این ترتیب که اگر هدر فایل یک بار include شده باشد ماکروی  _LED_H تعریف شده و در ابتدای برنامه دستور پیش پردازنده ifndef مانع از الحاق دوباره ی هدر فایل می شود.

#ifndef _LED_H
#define _LED_H

بدنه ی فایل

#endif

در ادامه چون از میکروکنترلر mega32 استفاده می کنیم کتابخانه مربوط به آن را به برنامه اضافه می کنیم.

دستور define :

توسط دستور define می توان یک عبارت را با عبارت دیگر جایگزین کرد به عنوان مثال :

#define		LED_DDR		DDRA.0
#define		LED_PORT	PORTA.0

در دستور بالا به جای DDRA.0 تا آخر برنامه می توانیم از عبارت LED_DDR استفاده کنیم. مزیت این کار این است که به راحتی می توانیم بدون تغییر کل برنامه و فقط با تغییر این سطر مثلا پایه led را تغییر دهیم به طور مثال من تصمیم می گیرم به جای پورت A از پورت B استفاده کنم کافی است عبارت بالا را به صورت زیر تغییر دهم و نیازی به ویرایش کل برنامه نیست.

#define		LED_DDR		DDRB.0
#define		LED_PORT	PORTB.0

سطر 14 تا 18 :

در این سطر ها به معرفی تابع هایی که قرار است در فایل بعدی تعریف شود به کامپایلر می پردازیم.

فایل led.c

#include "led.h"

void led_init(void){
	LED_DDR=1;
	LED_PORT=0;
}

void switch_init(void){
	SWITCH_DDR=0;
}

int switch_state(void){
	if(SWITCH_PIN==1){
		return 1;
	}
	else{
	return 0;
	}
}

void led_on(void){
	LED_PORT=1;
}

void led_off(void){
	LED_PORT=0;
}

در این فایل نیز تابع هایی که نیاز داریم را تعریف می کنیم. و با قرار دادن این فایل ها در کنار هم پروژه را کامپایل می کنیم. به این ترتیب موفق شدیم تا یک کتابخانه برای led چشمک زن ایجاد کنیم. در ادمه این فایل ها رو به صورت پروژه کدویژن برای دانلود قرار می دهم

دانلود پروژه ی کدویژن

اگر قسمتی از مطلب گنگ و نامفهوم بود در قسمت نظرات مطرح کنید من سعی می کنم اصلاح و قابل فهم ترش کنم.

 

23 دیدگاه دربارهٔ «آموزش ایجاد کتابخانه در زبان C;

  1. وایییییییییییییییییی………….لایییییییییییییییک
    دمت گرم دادا
    خیلی مطلب خوبی هستش(امیدوارم آخرین مطلب نبوده باشه ^_^)
    =================
    یه سوال داش علی
    به نظرت نوع میکرو کنترلر رو تو “فایل هدر led.h” ذکر نکنیم بهتر نیست؟
    مثلا من میخوام با مگا 8 راه بندازم و از این کتاب خونه استفاده کنم….لذا مجبورم فایل کتاب خونه رو تغییر بدم..

    این نوع میکرو رو از توی هدر برداریم تا کاربر مجبور باشه خودش تو پروژش تعریف کنه این طور بهتر نیست؟؟؟؟؟

    راستی چطور میشه کاری کرد که اگه طرف تو پروژش نوع میکرو رو تعریف کرد کد نوع میکرو تو فایل هدر اجرا نشه و اگه تو پروژش نوع میکرو رو تعریف نکرد…..اون نوع میکرو تو فایل هدر اجرا بشه O_o (امیدوارم خوب گفته باشم منظورم رو)
    چطور میشه این کار رو کرد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

    پاسخ
    • سلام
      من امتحان کردم وقتی include i رو داخل فایل هدر led ننویسیم پروژه کامپایل نمیشه و خطا میده ولی اینی که گفتی یه کاری کنیم که با هر میکرویی که داخل فابل main تعریف کردیم کار کنه باید به کتابخانه خود کدویژن یه نگاهی بنداژم اگر فهمیدم به آموزش هم برای این موضوع می نویسم
      در مورد پست مهمانی هم که قولش رو دادم چند روزی سرم شلوغ بود ولی می نویسم براتون می فرستم

      پاسخ
    • فکر کنم بدون آموزش C بحث کردن در مورد کتابخانه یکم بی فایده است شروع کردم به نوشتن یه دوره ی جدید از آموزش C که امروز هم یک قسمت ش رو منتشر می کنم که توی این دوره آموزش تکمیلی نوشتن کتابخانه هم هستش

      پاسخ
  2. یه سوال—من یه جاش رو متوجه نشدم….
    ببین ما فایل led.h رو تو کدویژن فراخوانی میکنیم و تی این فایل led.h، فایل led.c رو فراخوانی نمیکنیم
    و تو فایل led.c میایم و فایل led.h رو فراخونی میکنیم O_o

    من هر جی فکر میکنم به نظرم باید تو کدویژن فایل led.h رو فراخونی کرد و توی فایل led.h فایل led.c رو فراخونی کرد
    به نظرم این درست تره

    نظرت چیه؟؟؟؟؟؟؟؟؟؟؟؟
    من مشکلم کجاس؟؟؟
    هر چی فک میکنم میبینم روش خودم درسته و…
    ولی وقتی تموم کتابخونه های موجود رو میبینم مثل روش تو رفتن

    پاسخ
    • من می تونستم فایل led.c رو ننویسم و هرچی که توی led.c بود رو در ادامه led.h بنویسم و تمام
      اصولا وقتی تابع تعریف می کنیم اول باید اسم تابع رو قبل از تابع اصلی یعنی main به برنامه معرفی کنیم و بعد هر کجا دلمون خواست خود تابع رو تعریف کنیم اینجا هم دقیقا در فایل led.h یه همچین کاری می کنیم . در ضمن لینکری که این فایل ها رو به هم ارتباط میده تا برنامه کامپایل بشه وقتی دوتا فایل هم نام led.h و led.c داریم می فهمه که اینها باهم هستند و تابع هایی که در فایل led.h معرفی شده رو باید از led.c فراخوانی کنه امیدوارم بتونم منظورمو برسونم

      پاسخ
  3. اگر فایل led.h رو توی مسیر کتابخونه های کدویژن قرار بدیم اونوقت برای معرفی باید به شکل نوشته بشه؟ شرمنده سوال زیاد میپرسم امیدوارم فرصت جواب داشته باشید

    پاسخ
    • اصولاً تنها فرقی این دو روش داره اینکه در حالت “” کامپایلر مسیر پروژه رو هم برای فایل کتابخانه جستجو میکنه ولی در حالت <> فقط مسیر پیش فرض رو برسی می کنه یله اگر این کتابخانه رو هم در مسیر پیش فرض کامپایلر قرار بدید میشه از روش دوم هم استفاده کرد

      پاسخ
  4. یک کتابخونه دارم بررسی میکنم یه کم فرق داره با اموزش خوب شما
    معرفیش به این شکله
    #ifndef __nrf24l01p_h_included__
    #define __nrf24l01p_h_included__

    (توی پیست از راست به چپ افتاده برعکسش کن خودت که بلدی استاد 🙂 )

    یه فرق دیگه هم که داره اینه که دیگه توی کتابخونه میکرو تعریف نکرده
    میشه بگید این –included چیه؟
    عنوان کتابخونه فقط nrf24l01p_h هست .

    پاسخ
    • این ها دستورات پیش پردازنده هستش و کارشون اینه که نذارن کتابخونه پشت سر هم هنگام کامپایل به پروژه اضافه شه و مانع کامپایل کد بشه در واقع میگه اگر یک بار کتابخونه اضافه شد دیگه اضافش نکن این دستورات با دستور #endif که در آخر کتابخانه میاد تکمیل میشوند.

      پاسخ
  5. سلام
    من نتونستم کتاب خانه درست کنم
    یه فایل جدید تو کدویژن درست کردم با نام c هر چی شما تو فایل c نوشته بودی رو بردم تو فایل
    یه فایل جدید تو کدویژن درست کردم با نام h هر چی شما تو فایل h نوشته بودی رو بردم تو فایل
    بعد هم شما هر چی در فایل main نوشته بودی کپی کردم در پروزه جدید
    5 تا ارور میده
    این ماحصل 6 ساعت کاره
    نمی دونم فقط چرا پروژه شما کامپایل میشه ولی پروزه من نه
    کجا اشکال داره ؟

    پاسخ
    • من هم کار اضافه ای نکردم به مکان ذخیره کردن فایل ها دقت کنید و دقت کنید که این فایل ها هم به پروژه ای که ایجاد کردید اضافه شده باشه

      پاسخ
  6. Error: C:\electronic\project\N24\LED.c(1): can’t open #include file: arash.h

    سلام هدمت استاد گرامی میشه بگین این چرا این ارور رو می ده 🙁

    پاسخ
  7. سلام دوست عزیز شما برو توی قسمت project از منوی کدویژن بعد گزینه configure رو بزن و بعد و بعد از قسمت add فایل کتابخانه ای با پسوند c رو ادد کن

    پاسخ

پاسخ دادن به متین لغو پاسخ

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.