نمایش نتایج: از 1 به 1 از 1

موضوع: تابع جایگزین shiftout بسکام برای زبان سی

  1. #1
    مدیریت سایت LightIran آواتار ها
    تاریخ عضویت
    Apr 2014
    نوشته ها
    1,122
    تشکر
    224
    تشکر شده 1,440 بار در 641 پست

    تابع جایگزین shiftout بسکام برای زبان سی

    برای ساخت تابلو روان معمولا از شیفت رجیسترهایی جهت کاهش استفاده از پین های میکروکنترلر استفاده می شود. این آی سی اطلاعات را به صورت سریال دریافت و به صورت سریال نیز به شیفت رجیستر بعدی اعمال می کند. برای استفاده از این آی سی نیاز به تابعی می باشد که دیتا را به صورت سریال از یکی از پین های میکروکنترلر به خروجی ارسال نماید. اگر با نرم افزار Bascom آشنایی داشته باشید این نرم افزار تابعی با نام Shiftout دارد که دقیقا به همین منظورایجاد شده است و اطلاعات را به صورت سریال و با انتخاب های متعدد به خروجی ارسال می نماید ولی در زبان سی چنین تابعی تاکنون نوشته نشده است و یا اگر نوشته شده باشد توسط کسی به صورت آزاد روی اینترنت قرار نگرفته است. در برخی موارد از تابع spi برای این منظور استفاده می شود ولی این تابع محدودیت های خاص خود را دارد.
    ما در اینجا تابع معادل دستور shiftout را برای دوستان قرار می دهیم.
    این تابع دارای دو آرگومان است. آرگومان اول دیتای ارسالی و آرگومان بعدی اولویت بیت های ارسالی است. آرگومان اول باید حداکثر 8 بیتی باشد و در غیر اینصورت فقط 8 بیت آخر آن استفاده می شود. در مورد آرگومان دوم در مواردی پیش میاد که نیاز است که اولین بیت ارسالی MSB باشد و در برخی موارد اولین بیت LSB باشد!برای همین این آرگومان ایجاد شده است. با انتخاب عدد یک بیت MSB و با انتخاب عدد 0 بیت LSB ارسال خواهد شد.
    کد:
    shiftout(1th Argument,2th Argument)
    قبل از استفاده از تابع باید مواردی Define بشوند که عبارتند از : پورت ارسال دادهDS_PORT، پین ارسال دادهDS، پین کلاک دادهSH و پین کلاک ذخیره سازیST
    کد:
    #define DS_PORT PORTB #define DS 0 #define SH 1 #define ST 2
    در پایان هم تابع shiftout:
    کد:
    void shiftout(char data,char option) { option=(option==1)?0x80:0x01; for(char i=0;i<8;i++) { if((data&option)!=0) DS_PORT |= (1<<DS); else DS_PORT &= !(1<<DS); data = (option==0x01)?(data>>1):(data<<1); DS_PORT |= (1<<SH); _delay_us(10); DS_PORT &= !(1<<SH); _delay_us(10); } }
    یک تابع کمکی هم به نام setout قرار داده شده است که بعد از اتمام عملیات shiftout خروجی شیفت رجیسترها را فعال کند.
    کد:
    void setout(void) { DS_PORT |= (1<<ST); _delay_us(10); DS_PORT &= !(1<<ST); _delay_us(10); }
    You can if you want!Trust Me
    تنها غیرممکن غیرممکن است پس تلاش کنید!

  2. کاربران زیر از این پست مفید LightIran تشکر کرده اند:

    (IOJOI) (09-03-2014),mohammad19 (12-29-2016)

کلمات کلیدی این موضوع

باز و بسته کردن مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  
با کلیک بر روی 1+ ما را در گوگل محبوب کنید