آموزش برنامه نویسی C/C++برنامه نویسیتازه ها

آموزش ایجاد کتابخانه در زبان 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 چشمک زن ایجاد کنیم. در ادمه این فایل ها رو به صورت پروژه کدویژن برای دانلود قرار می دهم

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

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

 

علی عزتی

علی عزتی هستم. رشته ی مهندسی برق الکترونیک رو خوندم. علاقه ی من به یادگیری و به اشتراک گذاشتن چیز هایی که یاد گرفتم. باعث شد تا الکترولب ایجاد بشه. علاقه ی زیادی به الکترونیک دارم. و دوست دارم چیزهای جدید یادبگیرم و بسازم ... :))

Related Articles

23 Comments

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

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

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

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

  2. سلام مهندس
    ممنون بابت آموزش کتاب خانه.
    ممنون میشم آموزش رو ادامه بدین.
    یاعلی

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. Error: C:\electronic\project\N24\LED.c(1): can’t open #include file: arash.h

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

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

  9. سلام. خیلی عالی هستش استفاده کردم. انشاالله برکت بیوفته تو کارات و همیشه موفق باشی

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

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