تمرین پروژه راه ندازی صفحه کلید و LCD کارکتری قسمت ۱۱

در این قسمت از آموزش تمرینی ساده برای یادگیری بهتر آموزش های قبلی انجام خواهید داد در این تمرین به یک صفحه کلید ماتریسی ۴*۴ و یک نمایشگر کارکتری ۲*۱۶ و یک میکرو AVR نیاز داریم منظور از صفحه کلید ماتریسی همان صفحه کلید های معمولی موجود در بازار می باشد که کلید های آن به صورت ماتریسی به هم وصل شده اند یعنی یک پایه از کلید ها به خط ستونی و یک پایه دیگر به خط افقی مدار وصل شده است مانند شکل زیر:

Keypad-3x4

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

برای اسکن صفحه کلید باید سطر یا ستون را ورودی در نظر گرفته و دیگری را خروجی در اینجا ستون را ورودی صفحه کلید در نظر میگیریم و ردیف ها را خروجی مدار صفحه کلید، حال به روش زیر عمل میکنیم:

حال باید به ترتیب به ستون ۱ الی ۳ ولتاژ وصل کنیم و چک کنیم که آیا در خروجی صفحه کلید ولتاژی هست یا نه در صورتی که در خروجی ولتاژی وجود داشته باشد به معنی اینست که کلیدی فشرده شده است و باید با توجه به ردیف شماره کلید را بدست آورد به شکل زیر نگاه کنید:ani1وقتی یکی از کلیدها زده شود مداری به شکل زیر تغییر کرده و در یکی از ردیف ها ولتاژ وجود خواهد داشت:

ani2حال مداری به شکل زیر ببندید تا شروع به نوشتن برنامه کنیم:sh

همان طور که در شکل میبینید نمایشگر به پورت A و ردیف های ABCD کیپد به پورت ۰ تا ۳ پورت B و همچنین ستون های ۱ تا ۳ به پایه های ۴ تا ۶ پورت B متصل شده است و طبق گفته های بالا باید به ستون های ۱ تا سه ولتاژ ۵ ولت وصل کرده و خروجی کیپد را چک کنیم که آیا ولتاژی هست یا خیر . در روشی که گفته شد یک مشکل بزرگ وجود دارد که موجب سوختن میکرو میباشد و اینست که اگر دو کلید همزمان زده شود اتصال کوتاه رخ داده و موجب آسیب رسیدن به میکرو خواهد شد به شکل زیر دقت کنید:

exبرای برطرف کردن مشکل بالا به جای ولتاژ دادن به ستون ها آنها را به ۰ ولت  وصل و بقیه ستون ها را Hi-z خواهیم کرد و ردیف ها را با مقاومت داخلی یا خارجی پول آپ خواهیم کرد و آنان را از نظر صفر بودن چک خواهیم نمود حال به برنامه زیر دقت کنید:

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

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

دانلود پروژه فوق با شبیه سازی (لینک کمکی) رمز تمامی فایل ها آدرس سایت با حروف کوچک می باشد(www.agd.ir)

 

32 دیدگاه در “تمرین پروژه راه ندازی صفحه کلید و LCD کارکتری قسمت ۱۱

  1. با سلام و تشکر از وقتی‌ که برای آموزش گذاشته اید

    سئوالی دارم که چندان ارتباطی به‌‌‌ این سلسله آموزش‌ها ندارد؛میخواهم روی یک lcd کارکتری ۲*۱۶ حروف فقط یک خط به‌‌‌ سمت چپ شیفت شود ،مانند یک تابلو روان چطور این کار را بکنم لطفا مرا راهنمایی کنید

    با تشکر

    1. در کدویژن دستور خاصی برای اینکار نیست شما باید کد شیف که در دیتا شیت ال سی دی هست را برای ال سی دی ارسال کنید:
      برای شیفت به چپ کد ۰b00000110 و برای شیفت به راست ۰b00000111
      مثلا برای اینکه نوشته ها ۴ بار به سمت راست حرکت کنند کد شیفت به راست باید چهار بار با تاخیر مثلا ۵۰۰ میلی ثانیه ای به ال سی دی ارسال شوند
      برای ارسال دستور از تابع زیر استفاده کنید:
      _lcd_write_data()

    1. %d یعنی مقداری عددی متغییر key رو در جایی که %d نوشته شده قرار بده و ۰۲ هم عدد رو دو رقمی قرار بده و اگه کم تر از دو رقم بود به اول اون عدد صفر اضافه کن

  2. ببخشید میشه بگین خط آخر دقیقا چیکار میکنه؟
    lcd_puts(buff);
    و اینکه من اگه بخام کنار اون عددی که روی ال سی دی نمایش داده میشه یک اسم هم نوشته بشه باید با چه دستوری اینکارو کنم؟
    مثلا: ۲=پویا نعیمی

    1. خط مورد نظر محتویات buff رو روی نمایشگر نشون میده.
      خط sprintf(buff,”key is:%02d “,key); هم محتویات buff رو تعیین میکنه که بجای key is میتونی هرچیزی بنویسی ولی باید لاتین بنویسی چون نمایشگر کارکتری حروف فارسی رو پشتیبانی نمیکنه و %۰۲d هم مقدار مقابل خودش رو بصورت دو رقمی توی محلی که نوشته شده جایگزین میکنه. در ضمن این مطالب در آموزش های قبلی توضیح داده شده به مطالب قبلی هم روجوع کنید

  3. خیلی عالی بود تا الان ده تا برنامه واسه اسکن صفحه کلید دیده بودم هیچ کدوم رو نمیتونستم بفهمم برنامه شما و توضیحاتتون عالی بود

  4. با سلام
    من از کیبور می خوام دو تا عدد دورقمی در دو متغییر جدا بگیرم چه باید بکنم ؟!
    مثلا ۵۶۱۴ رو بگیرم و در دو متغییر بریزم A=56،و B=14 به طور مثال.

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

  6. سلام .ضمن تشکر از توضیحات شما ،من این چیزی که در پاسخ دوستان فرمودید رو متوجه نمیشم میشه با مثال بفرماییدچون من هم در درک این مورد مشکل دارم:
    ” ۰۲ هم عدد رو دو رقمی قرار بده و اگه کم تر از دو رقم بود به اول اون عدد صفر اضافه کن “

  7. ببخشید این دو تا کد رو متوجه نشدم میشه توضیح بدین
    DDRB=0b00000000;// تمام پایه ها ورودی
    PORTB=0b00001111;//پول آپ کردن چهار پایه اول پورت
    منظور از تمام پایه ها؟
    و چهر پایه ی اول کدوما میشن و چرا پول آپ میکنیم

    1. سلام
      احتمالا پست های ابتدایی سایت رو مطالعه نکردید.
      منظور از تمام پایه ها پایه هایی هستند که در روی خود پردازنده یا همون میکروی avr با نام پورت B مشخص شده اند که پورت B دارای ۸ تا پایه هست و به ترتیب از راست به چپ صفر های مقابل DDRB مر بوط به پایه های یک تا ۸ هست
      در خط دوم نیز چهار تا پایه اول مربوط به پورت B هست که با نام B.0 , B.1,B.2,B3 هست
      برای اینکه بیشتر متوجه بشید از آموزش های قبلی استفاده کنید

    1. کاری نداره ۵ خط به ادامه اسکن اضافه میشه کمی دقت کنید و دوباره این آموزش رو از اول خودتون هم میتونید بنویسید
      اگه سوالی بود بپرسین

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

  9. سوال بعد اینکه این تابع رو چرا int get_key(void) ووید کردید؟
    بعضی وقتا داخل پرانتز خالیه بعضی وقتها هم داخلش ووید نوشته میشه چرا؟

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

  11. سلاام من ی سوالی داشتم ی برنامه نوشتم با codevision که قسمت اولش کیپد اجرا بشه و تا زمانی که کلید اینترو نزدیم(کلید مربع)نره مرحله ی بعد کیپدم ۳*۴ و به سه تا ستون مقاوت ۵k وصل کردم پول دان کردم برنامه تو شبیه سازی کاملن درسته ولی وختی تو عمل بستم کیپد کار نمکنه ینی بدون اینکه اینترو بزنم میره مرحله ی بعد و اصن کیپد کار نمکنه بره ساختش هم مث شبیه سازی مقاومتارو وصل کردم نمدونم مشکل کجاس ممنون میشم کمکم کنین

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

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

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