دوشنبه , ۳ تیر ۱۳۹۸
آخرین مطالب
LINK TABLES
خانه | میکروکنترلر | ادوات جانبی | اتصال keypad به AVR

اتصال keypad به AVR

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

 از اون جایی که دوس داریم همیشه بهترین آموزش ها رو به شما ارائه کنیم، سعی می کنیم به طور منظم و مرتب پست های قدیمی را آپدیت کنیم تا هم اشکال هاشون گرفته بشه و هم مطالب با کیفیت تری جایگزین مطالب قبلی بشه. امروز (۱۴ شهریور ۹۵) پست کیپد رو حسابی گوش مالی دادم و ساختارش رو براتون عوض کردم. کدنویسی ارائه شده در این پست کاملا عوض شده و کدی بهتر جایگزین کد قبلی شده که بتونید در پروژه های واقعی خودتون ازش استفاده کنید. پیش نهاد می کنم اگه قبلا این پست رو مطالعه کردید حتما یک بار دیگه ویرایش جدیدش رو هم بخونید که خیلی مطالب برای یاد گرفتن بهش اضافه شده.

  • توضیحات 
  • کدنویسی 
  • شبیه سازی/ ویدیو 

آموزش Keypad

هر روز که در مسیر اداره، دانشگاه، مدرسه یا … نیاز به پول پیدا می کنید سریع با مراجعه به یک دستگاه ATM یا خود پرداز پول دریافت می کنید. تا حالا چقدر به کیپد های این دستگاه ها دقت کرده بودید؟ همین کیپد های کوچک روزانه کار انسان های زیادی را راه می اندازد. 😉

امروز درباره این کیپدها بحث مفصلی را دنبال می کنیم. اگر شما بخواهید اطلاعات را به میکروکنترلر وارد کنید راه های زیادی دارید. مثلا از طریق پورت سریال (مطالعه آموزش پورت سریال)، استفاده از SPI و … . یکی از راه های ساده این است که با استفاده از کلید اطلاعات را میکروکنترلر بدهید. اما هر کلید یک پین از میکروکنترلر را مصرف می کند. تصور کنید که بخواهید با استفاده از ۱۶ کلید اطلاعات را به میکرو وارد کنید. در این صورت دو پورت ۸ بیتی کاملا مصرف می شود و اگر پروژه ی شما به ادوات جانبی زیادی نیاز داشته باشد احتمالا با مشکل کمبود پورت مواجه خواهید شد. گذشته از این ۱۶ کلید جدا از هم فضای زیادی روی بورد مصرف می کند. پس باید به فکر راه کاری بهتر بود. چنین مشکلاتی باعث ابداع صفحه کلید های ماتریسی شد.

صفحه کلید ها در پایین ترین سطح خود به صورت ماتریسی از سطر ها و ستون ها تشکیل شده اند که keypad نام دارند. میکروکنترلر از طریق پورت ها می تواند به این سطرها و ستون ها دسترسی داشته باشد. یعنی ما می توانیم با استفاده از یک پورت هشت بیتی یک ماتریس ۴*۴ از کلید ها را به میکرو متصل کنیم. وقتی یک کلید فشار داده می شود یک سطر و ستون به هم متصل می شوند.در غیر این صورت هیچ گونه اتصالی بین سطرها و ستون ها وجود ندارد. همان طور که در شکل زیر مشاهده می کنید. ۴ سطر و ۴ ستون وجود دارد که هیچ گونه اتصالی به هم دیگر ندارند. برای مثال اگر کلید s1 فشرده شود. سطر ۱ و ستون ۱ به هم دیگر وصل می شوند. برای اتصال این صفحه کلید کوچک به میکروکنترلر در بدترین حالت ۸ پین مصرف می شود. یعنی تا این جا توانستیم نصف پین ها را آزاد کنیم.

حال یک سوال اساسی مطرح می شود:  چگونه از چنین صفحه کلید می توانیم داده های ورودی بخوانیم؟

فعلا این سوال را در ذهن داشته باشید تا در ادامه بحث به آن بپردازیم.

حال نحوه اتصال یک کیپد ۴*۴ به میکرو را نشان می دهیم. به شکل زیر دقت کنید:
MatrixKeyboard

همانطور که در شکل بالا ملاحظه می کنید از پورت A برای پیمایش کلید ها استفاده شده است. ستون ها را به ۴ پین کم ارزش پورت A وصل کرده ایم. هم چنین سطر ها به ۴ پین پرارزش پورت A وصل شده اند. مثلا ستون صفر به PINA.0 و سطر سه به PINA.7 وصل شده اند.

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

پایه هایی که به عنوان ورودی تنطیم شده اند باید دارای مقاوت بالاکش باشند چرا که در زمان فشرده نشدن کلید هیچ سطح منطقی رو پورت وجود ندارد و این امری نامطلوب است.(برای خواندن وضعیت یک پورت باید همیشه یک سطح منطقی معین روی آن باشد.)

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

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

مراحل اسکن keypad 4*4

  • سطرها را به خروجی میکرکنترلر و ستون ها را به ورودی میکروکنترلر وصل می کنیم.(برعکس هم می توانیم انجام دهیم.)، برای این کار یک پورت را انتخاب کرده و به دلخواه ۴ بیت پرارزش یا کم ارزش آن را به سطر ها  و ۴ بیت دیگر را به ستون ها وصل می کنیم.(بهتر است یک قرار داد مطابق میل خودتان انجام دهید.)
  • حال باید معلوم شود که آیا کلید فشرده شده یا خیر؟ برای این منظور مقاومت pull-up ستون های ورودی فعال شده و روی سطرهای خروجی صفر قرار داده می شود. سپس باید ستون ها خوانده شوند. در صورتی که هر کدام از ستون ها مقداری غیر از یک داشته باشد به معنای فشرده شدن یک کلید است.
  • بعد اطلاع از فشرده شدن کلید باید شماره کلید تشخیص داده شود. برای این منظور بسته به نیاز به هر کلید یک شماره یا کد اختصاص داده شده و در یک آرایه در ابتدای برنامه ذخیره می شود. حال مقاومت های پول آپ را فعال کرده و روی تمام سطرهای خروجی مقدار یک قرار می دهیم.
  • در ادامه هر کدام از سطرها را جدا گانه(در حالی که سایر سطر ها یک هستند) صفر کرده و اقدام به خواندن ستون ها می کنیم. هر ستونی که مقدار صفر را بازگرداند نشان دهنده کلید فشرده شده است.

در ادامه برای فهم بهتر مراحل اسکن keypad، وارد فاز کدنویسی می شویم. ابتدا کد اصلی را مشاهد می کنید که یک کتابخانه به نام keypad.h به آن ضمیمه شده است. بعد از توضیح این فایل وارد کتابخانه شده و مراحل اسکن کیپد را خط به خط توضیح می دهیم که در tab کدنویسی قابل دسترس است. تمام کدنویسی ها طبق شماتیک زیر انجام می شود.

شماتیک مدار در پروتئوس:

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

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

توضیحات کد بالا:

  • در خطوط ۱ تا ۴ فایل های استاندار به برنامه ضمیمه شده اند
  • در خط ۵ کتابخانه ای که برای خواندن کیپد نوشته شده به برنامه ضمیمه شده است.
  • در خط ۱۰ یک رشته و یک متغیر تعریف شده اند.
  • در خطوط ۱۲ و ۱۳ تابع lcd کاراکتری را فراخوانده و فعال کرده ایم.
  • در خط ۱۴ تابع برای فعال سازی کتابخانه keypad را فراخوانی کرده ایم.(در ادامه این تابع توضیح داده می شود)
  • در خط ۱۷ با استفاده از تابع scan_key کلید فشرده شده را خوانده و در متغیر i ذخیره کرده ایم.
  • سایر خطوط مربوط به نمایش این مقدار روی lcd کاراکتری است.
  • لازم به ذکر است که تابع scan_key در صورتی که کلیدی فشرده نشود مقدار ۲۵۵ را باز می گرداند. بنابراین تنها در صورتی مقادیر را روی lcd نشان می دهیم که کلیدی فشرده شده باشد.

این کتابخانه چند سوال برای شما ایجاد می کند. اصلا چرا برای یک keypad ساده به خودمان دردسر نوشتن دو فایل دیگر را داده ایم؟ آیا نمی شد کدها را داخل همین فایل بنویسیم؟ و سوالاتی از این دست.

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

این کتابخانه شامل دو فایل keypad.h و keypad.c می باشد. فایل اول را باید به خود برنامه ضمیمه کنید. اما فایل دوم را از قسمت project در کدویژن باید به پروژه خود Add کنید. در غیر اینصورت کتابخانه کار نخواهد کرد.

فایل keypad.h

توضیحات کد بالا

  • فقط خطوط مهم توضیح داده می شود، چون فرض بر این است که خواننده با زبان C آشنایی کامل دارد.
  • خطوط ۶ تا ۸ برای تعریف پورت متصل به کیپد است. شما اگر از پورتی دیگر استفاده می کنید می توانید این قسمت از برنامه را عوض کنید. فقط دقت داشته باشید که PIN، PORT و DDR همگی مربوط به یکی باشند. مثلا A .
  • خطوط ۱۰ تا ۱۳ برای تعریف ستون های کیپد است. هر پورتی که در مرحله قبل انتخاب کردید باید در اینجا پین ها را هم طبق همان پورت عوض کنید. مثلا از PINA استفاده کنید.
  • خطوط ۱۸ تا ۲۱ هم پیش تعریف های توابعی است که در فایل keypad.c وجود دارد. این گونه به کدویژن می گویید که چنین توابعی در این کتابخانه وجود دارند که برای دسترسی به متن توابع از فایل keypad.c استفاده می کند.

فایل keypad.c

متغییرها:

در خط ۶ یک آرایه با نام table که شامل کدهای کیپد می باشد تعریف شده است. هم چنین در خط ۱۳ متغیری به نام Delay تعریف شده است. که در ادامه استفاده آن را توضیح می دهیم.

تابع ()keypad_init

در این تابع، پورت متصل به کیپد سازماندهی می شود. به نحوی که ۴ بیت کم ارزش خروجی شده و ۴ بیت پرارزش ورودی می شوند.(خط ۱۸). سپس مقاومت های پول آپ پورت فعال می شوند و روی خروجی ها یک قرار داده می شود.

اولین تابعی که در متن برنامه اصلی و قبل از حلقه بینهایت باید بنویسید این تابع است.

تابع ()key_released

این تابع به منظور تشخیص رها شدن کلید استفاده می شود. در صورتی که کلید رها شود یک را برمی گرداند و در صورتی که کلید نگه داشته شود مقدار صفر را بر می گرداند. در متن تابع اصلی برنامه (main) نیازی به استفاده از این تابع نیست.

همان طور که مشاهده می کنید در خط ۲۴ از تاخیر استفاده شده است. دلیل این کار پایدار شدن ولتاژ های روی پورت قبل از خواندن آن است.

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

چون سخت افزار ما در این پست فقط سه ستون داشته از ۰x70 استفاده کردیم. اگر از کیپد با ۴ ستون استفاده کرده بودیم به جای ۷ باید f قرار می دادیم.

تابع ()key_pressed

از این تابع برای تشخیص فشرده شدن یک کلید استفاده می شود. این تابع برعکس تابع قبل عمل می کند. در صورت فشرده شدن کلید عدد ۱ و در غیر این صورت ۰ را باز می گرداند. دقت شود که تاخیر ۲۰ میلی ثانیه به این دلیل است که از لرزش سخت افزاری جلوگیری شود. چون کلید ها مکانیکی هستند در هنگام فشردن آن ها، کنتاکت ها چندین بار قطع و وصل می شود که این عمل باعث می شود میکروکنترلر چندین قطع و وصل کلید را مشاهده کند و برنامه به غلط چند بار اجرا شود. این قطع و وصل ها معمولا بین ۵ تا ۲۰ میلی ثانیه طول می کشد. به همین دلیل اگر کلیدی فشرده شد، ۲۰ میلی ثانیه صبر کرده و دوباره آن را چک می کنیم و در صورتی که هنوز وضعیت کلید در حالت فشرده شدن بود مطمئن می شویم که وضعیت کلید پایدار شده وسپس اقدام به تشخیص آن می کنیم.

از این تابع هم نیازی نیست در تابع main استفاده کنید.

تابع ()key_scan

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

این تابع در صورت فشرده شدن کلید مقدار کلید و در غیر این صورت ۲۵۵ را باز می گرداند. روال انجام آن طبق توضیحاتی است که داده شد. در حلقه for به اندازه ی ۴ بار که همان تعداد سطرها است اسکن انجام می دهیم. یعنی همه سطرها یک می شود و فقط یکی را صفر می کنیم و سپس اقدام به بررسی ستون ها می کنیم. شماره کلید طبق یک رابطه به دست می آید. برای نمونه یک مورد را توضیح می دهیم. فرض کنید کلید یک فشرده شده باشد. در این صورت ستون C1 و سطر R4 به هم دیگر متصل می شوند. ستون C1 به PIND.4 و سطر R4 به PORTD.3 وصل است. در این صورت در حلقه for متغیر i مقدار ۳ را خواهد داشت وشرط اول یعنی خط ۵۲ اجرا می شود و از آرایه، خانه ۹ را که مقدار یک دارد استخراج می کند.

اگر برای بار اول می خواهید با کیپد کار کنید، احتمالا با خواندن توضیحات بالا کمی سردرگم شدید که طبیعی است. پیشنهاد می کنم یک کاغذ و خودکار برداشته و از اول پست را مطالعه کنید و خطوط برنامه را به صورت دستی روی کاغذ به همراه مقدار دهی برای چند کلید دنبال کنید. قطعا بعد از این کار برنامه برای شما بسیار ساده خواهد شد.

حال از شما خواهش می کنم که از تب شبیه سازی/ ویدیو تست سخت افزاری برنامه را که به صورت فایل ویدیوی است مشاهده کنید. در ضمن خروجی پروتئوس هم در قالب یک تصویر gif برای شما قابل دسترس است.

در ویدیوی زیر تست سخت افزای از این کتابخانه براتون قرار دادیم. پیشنهاد می کنم حتما این ویدیو را مشاهده کنید.

خب دوستای گلم امیدوارم که مورد قبولتون بوده باشه. سعی کردم ویرایش اساسی انجام بدم تا یه کد واقعی که توی عمل هم امتحانشو پس داده خدمتتون ارائه کنم.

برای اینکه بتونید از آموزش امروز در یک پروژه آموزشی استفاده کنید به پست کنترل دور موتور DC بر اساس دما هم سر بزنید. تنها خواهشم اینه که ما رو به دوستاتون معرفی کنید. از هر راهی که خودتون بلدید. مثل تلگرام، معرفی حضوری یا …. از لینک شبکه های اجتماعی هم که این پایین می بینید می تونید برای اشتراک گذاری مطالب ما استفاده کنید. دوستون دارم 😀

درباره ی احسان عبداللهی

احسان عبداللهی هستم | کارشناسی الکترونیک خوندم و کارشناسی ارشد مخابرات |در سال 94 وب سایت میکرولرن را راه اندازی کردم | سعی کردم هر چیزی را به صورت کاربردی دنبال کنم، برای همین از کارشناسی کار با میکروکنترلرهای AVR و ARM، برنامه نویسی C و طراحی PCB را به صورت تخصصی کار کردم و از کارشناسی ارشد برنامه نویسی پایتون ، Computer vision و deep learning را به صورت تخصصی و کاربردی شروع کردم | الان هم سعی میکنم همیشه خودم را به روز نگه دارم و لذت کار کردن با دنیای برنامه نویسی و امبدد سیستم ها را به دیگران انتقال بدم

۳۰ دیدگاه

  1. با سلام بنده می خواهم کی پد را با lcd و atmega16 راه اندازی کنم می خواهم خروجی که میکرو به من میده عدد۳ رقمی باشه و کاراکتر را به من نشان نده باید چه کار کنم و کیپد من ۴*۴ هست لطفا اگر فایلی دارید ممنون میشم برام بفرستید

    naserrahimpanah@gmail.com
    ممنون

  2. سلام
    فایل کتابخونشو دارید؟

  3. برنامه با زبان C نوشته شده این EEPROM رو چطور باید اضافه کنم ؟

  4. سلام .چطورمیشه در ماشین حساب معمولی از eeprom استفاده کرد ؟؟ اینطور که اخرین عدد محاسبه شده رو در eeprom قرار بده و در راه اندازی مجدد قبل از هرکاری اون عدد رو نمایش بده ؟؟؟؟

  5. سلام خیلی ممنون از توضیحاننون
    شرمنده کد ها رو چطوری در کد ویژن بنویسیم

  6. سلام
    خسته نباشید
    من یه کیپد راه اندازی کردم با استفاده از وقفه حالا مشکلی که دارم اینه که ستون ها رو تشخیص نمیده
    بین پایه های خروجی میکرو و زمین خازن گزاشتم الان ۳ تا ستون رو تشخیص میده و یه ستون رو نمیفهمه
    چیکار باید بکنم؟
    ممنونم بابت پاسختون

  7. سلام خسته نباشید.خیلی عجله دارم برا جواب این سوال
    زیر برنامه استفاده از keypad با ۱۶ کلید را نوشته و کلیات برنامه را توضیح دهید.
    خیلی عجله دارم ممنون میشم اگه کمکم کنید

  8. سلام، ممنون بابت توضیح جامع و کاملتون، یه سوال داشتم..
    اگر بخوام همه کدارو توی یک فایل بنویسم چیکار باید بکنم؟؟؟

  9. سلام .میشه این بروزه رو برام توضیح بدین؟
    برنامه ی تایمری که زمان مورد نظر رو توسط کی بد دریافت کند و بس از گذشت آن زمان یکی از خروجی هارو تغییر دهد

  10. مثلا تو همین که گفتین اگر کلید ۱ رو فشار بدیم و… i=3 هستش که یعنی ۰۰۰۰۰۰۱۱ حالا خط ۴۹ روش اعمال بشه ۱۱۱۱۱۰۰۱ میشه…که یعنی دو سطر صفر باشن

    • خیر. قبلا که بهتون گفتم با دقت پست رو بخونید. سوالی که پرسیدید داخل پست جواب داده شده. وقتی i=3 هست یعنی ۱ را به اندازه i به چپ شیفت می دیم. یعنی ۰۰۰۰۱۰۰۰

  11. سلام مهندس کتابخانه keapad.c خط ۴۹ یعنی هر دفه i یه بیت شیفت به چپ داده بشه و مکملش تو key_port ریخته بشه؟ یه توضیحی میدی چرا مچکرم

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

  12. با توجه به توضیحات آقای hossein.m تغییراتی رو که گفتن من در برنامه خودم اعمال کردم
    یعنی به جای آرایه یک بعدی از دو بعدی و در نتیجه حذف دستورات فرمولی (برای بدست آوردن عدد از جدول) استفاده کردم
    و برای دستورات حلقه forاز else if استفاده کردم
    کلا مشکلی که در کامنت قبلی عرض کردم حل شده
    هر جوری که فرمودین برنامه تغییر پیدا کرده رو براتون ارسال کنم

    حالا من پیشنهاد دیگه ای رو اضافه کنم اگر جسارت نباشه

    تابعی داریم برای تشخیص رها شدن کلید
    بهتره در صورتی که پین اضافه در سخت افزارمون داریم یک پین رو برای یک ال ای دی اختصاص بدیم تا مادامی که کلید فشرده هست این پین یک باشه (ال ای دی روشن باشه)
    این پیشنهاد رو از جنبه سخت افزاری عرض کردم که اگر به هر دلیلی یکی از کلید های کی پد خراب و متصل موند به این ترتیب ما متوه عیب در کی پد می شیم
    خودم اگر پین اضافه داشته باشم حتما این ال ای دی رو قرار میدم تا هم از جنبه زیبایی دستگاهی که میسازم (ملت چراغ چشمک زن دوس دارن از جمله خودم) وجهه داشته باشه و هم از جهت عیب یابی کمک کنه
    باز هم به خاطر این برنامه فوق مفید متشکرم

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

  13. سلام
    بابت این کتابخونه عالی و جمع و جور سپاسگزارم
    برنامه شما رو برای کی پد ۴*۴ تغییر دادم
    در فایل keypad.h پورت متصل شده ه کی پد رو به پورت B تغییر دادم
    اما در فایل keypad.c اول table رو ۴*۴ کردم و عدد ۱۶ رو برای تعداد آرایه ها تعیین کردم
    بعد تو دو تابع فشرده شدن کلید و رها شدن کلید به جای ۰x70 نوشتم ۰xF0 همونجور که خودتونم تو توضیحات برنامه فرمایش کردین که در نهایت بیت هفتم پورت B هم برای ستون چهارم فعال بشه
    حالا تو حلقه For شرط if آخری که در حالت اولیه (۳*۴) غیر فعاله رو فعال کردم اما بعد از کامپایل به همین خط ارور میداد
    منم به این شکل تغییرش دادم به سبک سه دستور قبلی
    if(!C4) key = table[i*3+3];
    برنامه به صورت کامل کامپایل میشه ولی تمام اعدادی که برمیگردونه از کی پد دیگه اشتباهن ولی وقتی این دستور غیر فعاله همه چیزا درسته رو این دستور همه عملکرد برنامه اشتباه میشه

    • سلام به شما دوست عزیز
      حتما این کاری که شما می کنید ایجاد اشکال میکنه چون برای کیپد های ۴ در ۴ باید فرمول عوض بشه . شکل فرمون اینطوری میشه.i*4 و الی آخر.

  14. سلام جناب مهندس، خسته نباشید؛ این پست عالی بود! 🙂
    عذر میخوام که وقتتون رو میگیرم. جساراتا دو تا پیشنهاد دارم که فکر کنم این کتابخونه رو یک مقدار منعطف تر و سریعتر میکنه! اگر اشتباه میکنم، لطفا اصلاحش کنید!
    پیشنهاد اول: فکر کنم بهتر باشه به جای استفاده از آرایه معمولی، از یک آرایه دو بعدی (که مثل ماتریس در ریاضیات عمل میکنه) استفاده کنیم؛ به اینصورت که عناصر هر سطر کیپد رو داخل یک بلوک جداگانه از آرایه قرار بدیم؛ در اینصورت تعریف تابع اسکن رو هم یک کوچولو باید تغییر داد تا مقدار سطر و ستون رو به آرایه بده و داده رو تحویل بگیره. اینطور برای تعمیم دادن این کتابخونه به کیپد های با سایز و شکل مختلف، راحت تر میشه کد رو عوض کرد!
    پیشنهاد دوم: فکر کنم برای بهینه کردن کد، بهتر باشه داخل تعریف تابع اسکن، اون قسمت که سه تا شرط برای انتخاب مقدار از آرایه داره، قبل از دو تا if دوم و سوم، از کلمه else استفاده کنیم! در اینصورت cpu وقتش رو برای ارزیابی شرط، بیهوده هدر نمیده و سراغ ادامه کد میره. در یک لحظه، فقط یک کلید فشرده میشه؛ فکر نکنم نیازی باشه بقیه حالت ها ارزیابی بشن!

    • سلام حسین جان
      از این که انقدر دقیق پست رو مطالعه کردی واقعا ممنونم. از این کارت اونقدر انرژی گرفتم که بتونم مطالب و پست های بعدی رو خیلی بهتر تهیه کنم. دو موردی که برای ارتقاء کد گفتی کاملا صحیح است و باعث میشه تا کتابخونه user friendly تر بشه و وقت cpu کمتر مشغول بشه. حتما در اولین فرصت کتابخونه رو اصلاح می کنم و ورژن جدیدش را برای دوستان قرار می دم.

      موفق باشی
      منتظر نظرات بعدیت هستم 🙂

  15. سلام
    بهترین آموزشی بود که تا حالا در باره کیپد خونده بودم. خیلی ممنون از زحمات شما

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

    • سلام به شما 🙂
      برای کیپد تمام موارد به صورت قرار دادی هست. مثلا این که سطرها به نیبل پر ارزش وصل بشن یا نیبل پر ارزش. از مقاومت pull-up استفاده بشه یا pull-down و …
      کاری هم که شما گفتید قابل انجام هست فقط دقت کنید که اگه میخواید با یک کردن پین کلید را تشخیص بدید باید از مقاومت pull-down استفاده کنید ولی این کار منطقی نیست چون باید سخت افزار را بیشتر کنید. در حالی که میشه با صفر کردن کلید فشرده شده را تشخیص داد و از pull-up داخلی AVR استفاده کرد. اگه میخواید کد و پروتئوس را به ایمیل بنده ارسال کنید تا براتون بررسی کنم.
      eaca89@gmail.com

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

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