اطلاعیه

Collapse
No announcement yet.

نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

    (کلیه مطالب ، مربوط به زبان سی است که البته برای زبان های دیگر و انواع سیستم ها و سخت افزارها قابل تعمیم است)
    برای اینکار شما در پروژه خود بایستی دو فایل همنام ولی با فرمت های مختلف ایجاد کنید. یکی با فرمت h. و دیگری با فرمت c. به عنوان مثال test.h و test.c .
    خوب وظایف این دو فایل را بررسی میکنیم:
    فایل test.h : این فایل به منظور اضافه کردن بعضی از هدر های پایه ای دیگر به لایبرری( include ) و تعریف ( define) یکسری کلمه وهمچنین اعلان توابع و دیتا آبجکت هایی که در لایبرری نیاز است و استفاده میشوند ، ایجاد میگردد.
    برای اضافه کردن بعضی از هدر های پایه ای دیگر به لایبرری ( فرضا میخواهیم در هدر test.h از توابع stdlib.h استفاده کنیم. ) بایستی اینگونه عمل کنیم:
    کد:
    #include <stdlib.h>
    درصورتی که هدر فایلی که میخواهیم اضافه کنیم را خودمان نوشتیم و درون پوشه ی پروژه قرار دادیم باید به شکل زیر اضافه کنیم:
    کد:
    #include "otherheader.h"
    -----------------------------------------------------------------------------------------------------------------------------------------------------

    خوب بخش اول تمام شد میریم سراغ بخش بعدی:
    تعریف ( define) یکسری کلمه:
    امکان دارد شما بخواهید یک سری کلمه کلیدی که در سی وجود ندارد، برای خودتون تعریف کنید. در این بخش اینکار را میکنید: به شکل زیر:
    کد:
    #define DD_DATA     DDRB
    #define PORT_DATA   PORTB
    خوب حالا که چی ؟ به چه دردی میخوره این کار . مگه مرض داریم خوب تو کدمون همون DDRB و PORTB را استفاده میکردیم . چرا کلمه های دیگه تعریف کردیم؟!!
    این کار به دلیل بالا بردن انعطاف لایبرری است و برای این است که برنامه نویسی که از لایبرری شما استفاده میکند دستش باز باشه. به عنوان برنامه نویس(کلا در اینجا برنامه نویس حکم کاربر ما را دارد) می خواهد پورتی که به دیتا وصل می شود را تغییر دهد و از پورت D استفاده کند ، خیلی سریع با عوض کردن دیفاین به صورت زیر ، دیگه نیاز نیست برای اینکار لایبرری ای که شما نوشتین را دستکاری کند:
    کد:
     #define DD_DATA     DDRD
    #define PORT_DATA   PORTD
    خیلی بهتر است که برای تعریف هر کلمه ( define ) قبلش یک شرط بزاریم که فقط درصورتی که قبلا کلمه دیفاین نشده بود ، اینکار را کنیم:
    برای اینکار باید از ماکرو های شرطی استفاده کنیم:
    کد:
    #ifndef DATA
    #define DD_DATA     DDRD
    #define PORT_DATA   PORTD
    #endif
    -----------------------------------------------------------------------------------------------------------------------------------------------------

    بخش بعدی:
    اعلان توابع و دیتا آبجکت هایی که در لایبرری نیاز است و استفاده میشوند:

    اصولا اول دیتا آبجکت هایی که در لایبرری استفاده میشود ، اعلان میگردند:
    برای اینکار از کلمه کلیدی extern استفاده میشود:
    کد:
    extern unsigned char rxToken;
    این دستور به کامپایلر میگوید: آقای کامپایلر درسته که من متغییر سراسری rxToken از نوع کاراکتری بدون علامت را تعریف نکردم ولی شما اگر جایی تو این فایل به اسم این متغییر برخوردی ، ارور نگیر ، من جای دیگه ای تعریفش میکنم ( بعدا میگم کجا) ، جناب لینکر بعدا خودش میاد این هارو به هم پیوند میده . بهت قول میدم :icon_razz: :mrgreen:

    بعد از اون توابعی که درون لایبرری موجودند ، اعلان میشود:
    برای اینکار باید prototype توابع را بنویسید، به شکل زیر:
    کد:
    void lcd_gotoxy(unsigned char x, unsigned char y);
    فقط باید نوع خروجی و تعداد پارامترها و نوع آنها برای کامپایلر مشخص شود. ( همیشه بالای هر تابعی که اعلان میشود ، توضیحاتی به صورت کامنت باید نوشت تا برنامه نویسی که از تابع استفاده میکند ، از عملکرد تابع و ورودی خروجی ها باخبر شود )

    تقریبا فایل h. تمومه . فقط یک نکته باقی میماند :
    درصورتی که تو پروژه ای فایل h. شما چند دفعه include شود که خیلی بد میشود: برای اینکار باید چاره ای بیندیشید:
    باید کاری کنیم که در این شرایط کامپایلر فقط یکبار کدهای داخل فایل h. را ببند.
    اصولیش به این صورت است که کل کدهای فایل h. را درون یک ماکرو شرطی بزرگ قرار میدهیم. به صورت زیر:
    کد:
    #ifndef __test_h_included__
    #define __test_h_included__
    
    
    #include "otherheader.h"
    
    #ifndef DATA
    #define DD_DATA     DDRD
    #define PORT_DATA   PORTD
    #endif
    
    extern unsigned char rxToken;
    
    void lcd_gotoxy(unsigned char x, unsigned char y);
    
    
    #endif /* __test_h_included__ */

    ------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------------------------
    خوب بریم سراغ فایل c. :
    دیدیم که تو فایل h. فقط یکسری اعلان و تعریف انجام دادیم و کدی ننوشتیم. برای نوشتن بدنه ی توابع و تعریف دیتا آبجکت ها باید تو این فایل اینکار را انجام بدید.
    در کل یعنی برنامه نویس استفاده کننده بیشتر با h. کار دارد ولی شما بیشتر با c. کار دارید و کدهاتون را باید اینجا قرار بدید. فقط قبلش بایستی فایل h. را اینکلود کنید:

    کد:
    #include "test.h"
    اگر سوالی بود در خدمتم.

    همین الان برید هدرهای مختلف را بخونید و اگر به چیز عجیبی برخوردید ، بیاید همینجا بگید تا باهم دربارش بحث کنیم.


    راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
    کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
    نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
    انشالله به زودي تاپيک ها به روز رساني خواهد شد،

    #2
    پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

    سلام.
    اول تشکر میکنم از پست های خیلی مفیدتون.
    سید من یه سوالی داشتم:
    میخاستم فرق این دو نوع تابع نوشتن رو برام توضیح بدی لطفن و اینکه
    کجاها باید بدونیم که از کدوم نوع باید استفاده کنیم و بنویسیم.
    کد:
    void lcdControlWrite(u08 data);
    و این
    کد:
    u08 lcdControlRead(void);
    اینهارو از lcd.h مربوط به WinAVR برداشتم.
    خیلی ممنوم.

    دیدگاه


      #3
      پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

      با اجازه از سید:
      تا یادم نرفته اول لینک آموزش نوشتن تابع رو بذارم:
      http://www.hpkclasses.ir/Courses/cpp/cpp0700.html

      خب حالا جواب شما!
      در چیزی که نوشتی باید به چند نکته اشاره کرد!

      1- هر تابع سه قسمت داره:
      -- ورودی ها
      -- نام تابع
      -- خروجی
      الگوش هم اینطوریه:
      کد:
      return_type function_name( arg-type name-1,...,arg-type name-n)
      خب حالا تابع از حیث ورودی خروجی میتونه چهار حالت داشته باشه:
      -- با ورودی و با خروجی
      -- بدون ورودی و بدون خروجی
      -- با ورودی بدون خروجی
      -- بدون ورودی با خروجی

      2- یک نوع تعریفی هست برای نوع متغیرها و ...
      مثلا شما میدونی int چه نوع متغیریه
      اما در مثالی که زدی u08 چه نوع متغیریه؟
      بعضی مواقع از typedef استفاده میشه
      کاربردهای مختلفی داره
      که برات دو تا لینک گذاشتم
      اما یک مورد ساده ش رو بهت میگم:
      typedef int sina
      تعریفی که در بالا ارائه شده
      sina دقیقا همون int ه!
      یعنی اگه شما تاحالا فقط میتونستی یک متغیر رو به صورت:
      int a
      تعریف کنی، حالا میتونی بنویسی:
      sina a

      اینم لینکا:
      http://en.wikipedia.org/wiki/Typedef
      http://www.tutorialspoint.com/cprogr.../c_typedef.htm

      3- در مورد void
      این تعریف روببین:
      کد:
      void lcdControlWrite(u08 data);
      در اینجا تابع یک ورودی داره (همون data)
      ولی خروجی نداره: void
      در توابع جاهایی که خروجی یا ورودی نداریم از void استفاده میکنیم

      :read:
      1: اللهم صل علي محمد و آل محمد و عجل فرجهم و ...
      2: دانش بهتره يا ثروت؟ بدون شعور هيچکدوم!
      3: دلا معاش چنان کن که گر بلغزد پاي *** فرشته‌ات به دو دست دعا نگه دارد (حافظ)

      دیدگاه


        #4
        پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

        نوشته اصلی توسط سینا_80
        سلام.
        اول تشکر میکنم از پست های خیلی مفیدتون.
        سید من یه سوالی داشتم:
        میخاستم فرق این دو نوع تابع نوشتن رو برام توضیح بدی لطفن و اینکه
        کجاها باید بدونیم که از کدوم نوع باید استفاده کنیم و بنویسیم.
        کد:
        void lcdControlWrite(u08 data);
        و این
        کد:
        u08 lcdControlRead(void);
        اینهارو از lcd.h مربوط به WinAVR برداشتم.
        خیلی ممنوم.
        سلام
        خواهش میکنم،لطف دارید.

        باتشکر از جناب رستمی بخاطر توضیحات کاملشون.

        من یه سری توضیح در رابطه با توابعی که مطرح شد میدم:

        این توابع ( مربوط به کتابخانه avrlib و درایور نرم افزاری السیدی کاراکتری است ) ، نکته خیلی خوبی میتونه برسونه.

        برای نوشتن یک درایور نرم افزاری( firmware ) صحیح ، بایستی از توابع چند سطحی استفاده کنیم که پایین ترین سطح مربوط به رابط ( اینترفیس) بین میکرو و سخت افزار مربوطه می باشد( پورت های موازی ، USART ، SPI و ... ) و توابع دیگر برای ارتباط با سخت افزار از این توابع استفاده میکنند.
        توابع با بالاترین سطح به برنامه نویس اجازه میدهند تا کار های پیچیده را به صورت خیلی ساده و با فراخوانی تابع انجام دهند.
        برای مثال در همین lcd.h :
        توابعی که فرمودید ، توابع سطح پایین هستند:
        کد:
        void lcdControlWrite(u08 data);
        کد:
        u08 lcdControlRead(void);
        و یک مثال از توابع سطح بالا ، میتواند تابع زیر باشد:
        کد:
        void lcdProgressBar(u16 progress, u16 maxprogress, u08 length);
        توضیحات تابع lcdControlWrite :
        از اسمش هم پیداست ، این تابع جهت نوشتن یک دیتای کنترلی ( دستور) نوشته شده است. (چون سطح پایین است بیشتر جهت استفاده ی آن توسط توابع دیگر نوشته شده است)
        اگر با نحوه ارتباط با السیدی آشنا باشید( بصورت موازی اطلاعات رد وبدل میشود) ، برای دادن یک دستور به آن بایستی خط RS را صفر کنیم و همچنین چون میخواهیم عمل نوشتن انجام بدیم باید خط RW را صفر کنیم و با توجه به جدولی که در دیتاشیت موجود است ، دستور مربوطه را روی خط دیتا قرا بدهیم و با ایجاد یک لبه پایین رونده روی خط E ، دستور مربوطه را به چیپ السیدی ارسال کنیم.
        کار این تابع همین است، دستور را میگیرد و همینطور که گفتم به چیپ ارسال میکند.

        توضیحات تابع lcdControlRead :
        خوب اینهم که معلومه ، این تابع برای گرفتن دیتای کنترلی است. که اینجا به آن گرفتن وضعیت( status ) میگویید.
        خوب پس با فراخوانی این تابع ، یک بایت برمیگرداند که نشان دهنده وضعیت کنونی السیدی می باشد.

        توضیحات تابع lcdProgressBar:
        این تابع یک تابع سطح بالاست و اصلا کاری نداریم که چه جوری اطلاعات را بریزیم رو السیدی و... (برای اینکار داخل بدنه از توابع دیگر(سطح پایین تر) استفاده میکند.
        امکانی که به ما میدهد ، ایجاد یک progressbar یا نوار پیشرفت است.(مثل Loading) بدون اینکه برنامه نویس از چیزی خبر داشته باشه فقط با فراخوانی آن با پارامتر های دلخواه خودش ، اینکار را انجام میدهد.

        راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
        کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
        نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
        انشالله به زودي تاپيک ها به روز رساني خواهد شد،

        دیدگاه


          #5
          پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

          یک سوال دیگه هم داشتم.
          میتونیم به جای
          کد:
           u08 lcdControlRead(void);
          بنویسیم
          کد:
           void lcdControlRead(void);
          ؟
          خیلی ممنون

          دیدگاه


            #6
            پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

            پاسخ سینا_80 :

            توضیحات تابع lcdControlRead :
            خوب اینهم که معلومه ، این تابع برای گرفتن دیتای کنترلی است. که اینجا به آن گرفتن وضعیت( status ) میگویید.
            خوب پس با فراخوانی این تابع ، یک بایت برمیگرداند که نشان دهنده وضعیت کنونی السیدی می باشد.
            خب حالا تابع از حیث ورودی خروجی میتونه چهار حالت داشته باشه:
            -- با ورودی و با خروجی
            -- بدون ورودی و بدون خروجی
            -- با ورودی بدون خروجی
            -- بدون ورودی با خروجی
            در توابع جاهایی که خروجی یا ورودی نداریم از void استفاده میکنیم
            نتیجه گیری:
            تابع شما چیه؟ اینه:
            کد:
            u08 lcdControlRead(void);
            در توضیحات سید گفتن که این تابع "یک بایت رو برمیگردونه"!
            یعنی خروجی این تابع یک بایته
            اما اگه شما بنویسی:
            کد:
            void lcdControlRead(void);
            یعنی این تابع نه خروجی داره نه ورودی!

            پس با این اوصاف نمیشه!
            1: اللهم صل علي محمد و آل محمد و عجل فرجهم و ...
            2: دانش بهتره يا ثروت؟ بدون شعور هيچکدوم!
            3: دلا معاش چنان کن که گر بلغزد پاي *** فرشته‌ات به دو دست دعا نگه دارد (حافظ)

            دیدگاه


              #7
              پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

              با تشکر از زحمات سید مرتضی جان.
              راستی سید من یه پیشنهاد دارم.
              داشتم با ال سی دی گرافیکی کار میکردم که متوجه شدم کد هایی که واسه نمایش عکس تولید میشن رو بصورت یه فایل هدر بنویسیم و بعد هر کدومشون رو که خواستیم اینکلود کنیم.آیا این کار اصولی تره یا نوشتن این نوع کد ها داخل یه تابع؟
              تکاور شدن جرات افزون کند.....هراس از دل مرد بیرون کند....


              تا تکاور به تن زخمی خود جان دارد....مرز اسلام در این ملک نگهبان دارد.........

              دیدگاه


                #8
                پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

                نوشته اصلی توسط سعید دلشاد منور
                با تشکر از زحمات سید مرتضی جان.
                راستی سید من یه پیشنهاد دارم.
                داشتم با ال سی دی گرافیکی کار میکردم که متوجه شدم کد هایی که واسه نمایش عکس تولید میشن رو بصورت یه فایل هدر بنویسیم و بعد هر کدومشون رو که خواستیم اینکلود کنیم.آیا این کار اصولی تره یا نوشتن این نوع کد ها داخل یه تابع؟
                خواهش میکنم( منظورتون منم؟! اسمم مرتضی نیستا :rolleyes: )

                من متوجه قسمت اول سوالتون نشدم. (دقیق مثال بزنید) یعنی هر تابع را تو یک فایل مجزای h. بنویسید و بعد اینکلودشون کنید؟

                اگر منظورتون همینه ، که نه اصلا از این کارا نکنید. اصولیترین نحوه کتابخونه نویسی همونه که تو پست اول توضیح دادم ، اولا که اصلا خوب نیست شما چیزی تو h. بنویسید که باعث ایجاد کد شود ، ثانیا تیکه تیکه کردن توابع و اینکلود کردن اونها به صورت مجزا نبایستی انجام شود. چون اکثر توابع در یک کتابخانه به هم وابسته اند و همچنین اینطوری درستی برنامه به مکان اینکلود در برنامه تاثیر داره که اصلا خوب نیست.
                نمونه مثال کتابخونه اصولی ، همون کتابخونه ای است که برای السیدی کاراکتری قرار دادم. فقط چون برای دو کامپایلر نوشته شده یکم پیچیده شده ولی درکل اصولا کتابخونه را فقط برای یک کامپایلر بخصوص مینویسند.(ولی من برای جامع بودنش و همچنین فراگیر بودن استفاده از کدویژن اونجوری نوشتم)
                راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                دیدگاه


                  #9
                  پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

                  نوشته اصلی توسط RubeuS
                  خواهش میکنم( منظورتون منم؟! اسمم مرتضی نیستا :rolleyes: )

                  من متوجه قسمت اول سوالتون نشدم. (دقیق مثال بزنید) یعنی هر تابع را تو یک فایل مجزای h. بنویسید و بعد اینکلودشون کنید؟

                  اگر منظورتون همینه ، که نه اصلا از این کارا نکنید. اصولیترین نحوه کتابخونه نویسی همونه که تو پست اول توضیح دادم ، اولا که اصلا خوب نیست شما چیزی تو h. بنویسید که باعث ایجاد کد شود ، ثانیا تیکه تیکه کردن توابع و اینکلود کردن اونها به صورت مجزا نبایستی انجام شود. چون اکثر توابع در یک کتابخانه به هم وابسته اند و همچنین اینطوری درستی برنامه به مکان اینکلود در برنامه تاثیر داره که اصلا خوب نیست.
                  نمونه مثال کتابخونه اصولی ، همون کتابخونه ای است که برای السیدی کاراکتری قرار دادم. فقط چون برای دو کامپایلر نوشته شده یکم پیچیده شده ولی درکل اصولا کتابخونه را فقط برای یک کامپایلر بخصوص مینویسند.(ولی من برای جامع بودنش و همچنین فراگیر بودن استفاده از کدویژن اونجوری نوشتم)
                  ای دل غافل.... :"> :"> :"> :"> :"> :">
                  خب سید حسن جان
                  وقتی توی lcd گرافیکی میخاییم کار بکنیم و کد های یه تعداد عکس رو دستمون مونده.چیکار میشه کرد؟
                  یعنی توی توابع نوشت؟
                  اینطوری ظاهر برنامه پیچیده نمیشه؟
                  تکاور شدن جرات افزون کند.....هراس از دل مرد بیرون کند....


                  تا تکاور به تن زخمی خود جان دارد....مرز اسلام در این ملک نگهبان دارد.........

                  دیدگاه


                    #10
                    پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

                    نوشته اصلی توسط سعید دلشاد منور
                    ای دل غافل.... :"> :"> :"> :"> :"> :">
                    خب سید حسن جان
                    وقتی توی lcd گرافیکی میخاییم کار بکنیم و کد های یه تعداد عکس رو دستمون مونده.چیکار میشه کرد؟
                    یعنی توی توابع نوشت؟
                    اینطوری ظاهر برنامه پیچیده نمیشه؟
                    آهان.
                    خوب اون کد عکسها دیگه ربطی به کتابخونه نداره . شما کتابخونه ( فایل h. و فایل c. ) را نباید دست بزنید . اون کد های عکسها یک آرایه هستند . آره میتونید مثلا فایل های image1.h و image2.h و... داشته باشید و آرایه ها را درونشون بریزید . و از هر کدوم خواستید استفاده کنید به پروژه اضافه ( اینکلود) کنید. اون دیگه سلیقه ایه و ربطی به کتابخونه نداره. ( اونا آرایه های مستقل هستند و دیگه ربطی به هیچ تابعی ندارند- تابع ها فقط کارشون اینه که آرایه از شما بگیرند و نمایش دهند همین )
                    راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                    کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                    نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                    http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                    انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                    دیدگاه


                      #11
                      پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

                      با عرض سلام خدمت سید جان
                      سید تو هدر فایلی که واسه ال سی دی کاراکتری نوشتین این خط رو که نوشته شده:
                      کد:
                      #define clearRS   LCDPORT&=(~(1<<RS))
                      میشه اینطوری بنویسیم؟
                      کد:
                      #define clearRS   LCDPORT&=~(1<<RS)
                      تکاور شدن جرات افزون کند.....هراس از دل مرد بیرون کند....


                      تا تکاور به تن زخمی خود جان دارد....مرز اسلام در این ملک نگهبان دارد.........

                      دیدگاه


                        #12
                        پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

                        نوشته اصلی توسط سعید دلشاد منور
                        با عرض سلام خدمت سید جان
                        سید تو هدر فایلی که واسه ال سی دی کاراکتری نوشتین این خط رو که نوشته شده:
                        کد:
                        #define clearRS   LCDPORT&=(~(1<<RS))
                        میشه اینطوری بنویسیم؟
                        کد:
                        #define clearRS   LCDPORT&=~(1<<RS)
                        سلام
                        بله میشه .
                        علت:
                        اولویت عملگر ~ از =& بیشتر است پس اول ~ اعمال میشود و بعد از آن =&.

                        البته بسیار بهتر و خواناتر است که تا جایی که ممکنه از پرانتز استفاده شود . دیگه اینجوری نگران اولویتها هم نیستیم.
                        راه اندازي ماژول nrf24l01p براي codevision (ارتباط بيسيم بين دو ميکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                        کوچ کردن از کدويژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                        نحوه نوشتن اصولي يک لايبرري و درايور نرم افزاري( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                        http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول هاي مختلف توسط اعضاي انجمن
                        انشالله به زودي تاپيک ها به روز رساني خواهد شد،

                        دیدگاه


                          #13
                          پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور ن

                          حیف که یه همچین آموزش خوبی در این نقطه قطع شده

                          ممنون از تمام دوستان

                          ******** یَاربَّ الحسَینِ ؛ بحَقٍِّ الحسَینِ ؛ اِشفِ صَدرَ الحسَینِ ؛ بِظُهوُرِالحجَّةِ *******
                          اللهم صل علی محمد وآل محمد و عجل فرجهم

                          دیدگاه


                            #14
                            پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

                            lمنم متاسفم شدم. کاش میشد ادامه بدین.... :-(( :cry:
                            خدا نور است و من اشعه ای از او ...

                            دیدگاه


                              #15
                              پاسخ : نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده)

                              سلام
                              این خط به چه معنیه؟
                              +pragma used#
                              - pragma used#

                              دیدگاه

                              لطفا صبر کنید...
                              X