خانه / AVR / اسکن صفحه کلید ماتریسی ۴*۴ با avr
keypad4x4
keypad4x4

اسکن صفحه کلید ماتریسی ۴*۴ با avr

اسکن صفحه کلید ماتریسی ۴*۴

در کنار lcd های کاراکتری ، صفحه کلید ماتریسی یکی از پرکاربردترین لوازمی است که کاربران از آنها  در مدارات میکروکنترلری استفاده می کنند و توسط آنها می توانند از دنیای بیرون به میکروکنترلر دیتا ارسال کرده و آن را پردازش کنند.

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

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

در این مقاله ما قصد داریم تا روش اسکن صفحه کلید ماتریسی ۴*۴ یا کلید خوانی کیپد ۴*۴ را توسط میکروکنترلر avr آموزش دهیم. کامپایلر bascom دارای کتابخانه صفحه کلید ماتریسی ۴*۴ می باشد . در حالی که کامپایلر codevision که یکی از پرطرفدارترین محیطهای برنامه نویسی به زبان C   است فاقد این کتابخانه می باشد .

به همین سبب ما بر آن شدیم تا برنامه نوشته شده برای اسکن صفحه کلید ماتریسی ۴*۴ را به یک کتابخانه تبدیل کنیم تا کاربران براحتی بتوانند تنها با بکاربردن چند دستور ساده عمل کلید خوانی را انجام دهند .

صفحه کلید ماتریسی 4*4
صفحه کلید ماتریسی ۴*۴

آموزش اسکن صفحه کلید ماتریسی ۴*۴ با avr

برای اسکن صفحه کلید ماتریسی ۴*۴ از الگوریتمی بسیار ساده استفاده شده است . به این صورت که صفحه کلید ماتریسی ۴*۴ به یک جدول جمع اعداد تشبیه شده است .

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

در این روش مقدار کلید فشرده شده طی دو مرحله بدست می آید که در ادامه به آن خواهیم پرداخت . شکل زیر نحوه اتصال یک صفحه کلید ماتریسی ۴*۴ به یکی از پورتهای میکرو کنترلر avr را نشان می دهد .

صفحه کلید ماتریسی 4*4
صفحه کلید ماتریسی ۴*۴

مرحله اول اسکن صفحه کلید ماتریسی ۴*۴

در مرحله اول اسکن صفحه کلید ماتریسی ۴*۴ پایه هایی را که به ستون های صفحه کلید ماتریسی ۴*۴ وصل کرده ایم به عنوان پایه های خروجی و پایه هایی را که به سطر های  صفحه کلید ماتریسی ۴*۴ وصل کرده ایم به عنوان پایه های ورودی تعریف می کنیم .

سپس مقدار صفر منطقی را روی پایه های خروجی قرار می دهیم و در نهایت شروع به اسکن پایه هایی که به عنوان ورودی تعریف شده اند می کنیم . اگر مقدار پایه ای صفر باشد به منزله این است که کلیدی در آن سطر فشرده شده و مقدار متناظر با آن سطر را از جدول جمعی که تشکیل داده بودیم در یک متغییر ذخیره می کنیم .

اسکن صفحه کلید ماتریسی 4*4
اسکن صفحه کلید ماتریسی ۴*۴

مرحله دوم اسکن صفحه کلید ماتریسی ۴*۴

در مرحله دوم برعکس مرحله اول عمل می کنیم پایه هایی را که به ستون های صفحه کلید ماتریسی ۴*۴ وصل کرده ایم به عنوان پایه های ورودی تعریف می کنیم و پایه هایی را که به سطرهای صفحه کلید ماتریسی ۴*۴ وصل کرده ایم به عنوان پایه های خروجی تعریف می کنیم .

سپس مقدار صفر منطقی را روی پایه های خروجی قرار می دهیم و در نهایت شروع به اسکن پایه هایی که به عنوان ورودی تعریف شده اند می کنیم و اگر مقدار پایه ای صفر باشد به منزله این است که کلیدی در آن ستون فشرده شده و مقدار متناظر با آن ستون را از جدول جمعی که تشکیل داده بودیم در یک متغییر دیگر ذخیره می کنیم .

صفحه کلید ماتریسی 4*4
صفحه کلید ماتریسی ۴*۴

بعد از مراحل اسکن صفحه کلید ماتریسی ۴*۴ ، برای مشخص کردن موقعیت کلید فشرده شده ، کافیست تا اعدادی را که از دو مرحله قبل در متغییرهای row , column ذخیره کردیم با یکدیگر جمع کنیم . در پایان نیز با تعریف یک آرایه شانزده رقمی و قرار دادن مقادیر asci اعداد در آن می توان کاراکتر متناظر با صفحه کلید را از درون این آرایه جهت نمایش روی  lcd کاراکتری  استخراج کرد .

برای درک بهتر مسئله به ذکر یک مثال می پردازیم :
فرض می کنیم کلید شماره ۹ از روی صفحه کلید ماتریسی ۴*۴ را فشرده ایم طبق مرحله اول اسکن صفحه کلید ، P.1  از پایه های پورت ما برابر با مقدار صفر می شود و با توجه به دستور   if(PINx.1==0)  row=8  مقدار ۸ در متغییر row  جا می گیرد .

در مرحله دوم اسکن صفحه کلید ،  P.6  از پایه های پورت ما برابر با مقدار صفر می شود و با توجه به دستور  if(PINx.6==0)  column =1  مقدار ۱ در متغییر column  جا می گیرد و در نهایت با جمع دو متغییر row+column عدد ۹ بدست می آید که همان مقدار کلید فشرده شده است .

معرفی توابع کتابخانه اسکن صفحه کلید ماتریسی ۴*۴ با نرم افزار codevision

اسکن صفحه کلید ماتریسی 4*4
اسکن صفحه کلید ماتریسی ۴*۴

تابع kbd_init  :

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

این تابع جهت initializes  یا مقدار دهی اولیه پورت می باشد .

تابع  debounce :

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

این تابع دارای یک پارامتر با نام Debouncing_time است که مقدار آن از ۰ تا  ۲۰۰ بر حسب میلی ثانیه می باشد  و  یک تاخیر  از ۰ تا ۲۰۰  میلی ثانیه بعد از فشرده شدن هر کلید بوجود می آورد تا لرزشی که در هنگام فشرده شدن کلید پدید می آید از بین برود و این لرزش به منزله فشرده شدن کلید طلقی نگردد .

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

گرفتن لرزش کلید
گرفتن لرزش کلید

تابع waitkey :

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

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

تابع waitnokey :

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

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

تابع readkey :

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

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

تابع getkey :

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

این تابع اصلی ترین تابع می باشد که ما برای اسکن صفحه کلید ماتریسی ۴*۴ از آن استفاده می کنیم ، این تابع  ترکیبی از توابعی است که قبلا ذکر شد .

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

تابع getnum :

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

عملکرد این تابع شبیه عملکرد تابع getkey   می باشد با این تفاوت که فقط مقادیر کاراکتر های ۰ تا ۹ را برمی گرداند .

اگر مقادیر خوانده شده از صفحه کلید ، متناظر با کلید فشرده شده توسط شما نبود . فایل کتابخانه ای keypad.lib  را توسط محیط کدویژن باز نموده و با جابجایی کاراکترها در جدول kbd_lib   این مشکل را برطرف نمایید .

کلیدخوانی با codevision
کلیدخوانی با codevision

اسکن صفحه کلید ماتریسی ۴*۴ و نمایش بر روی lcd 2*16

ابتدا از پوشه library که پیوست این مقاله می باشد فایل هدر keypad.h را در پوشه inc   و فایل کتابخانه ای  keypad.lib   را در پوشه lib   در مسیری که نرم افزار کدویژن را نصب کرده اید کوپی کنید .

سپس  نرم افزار کدویژن را اجرا کرده و توسط کدویزارد از زبانه   Chip  آی سی  مورد  نظر  و  از  قسمت  Alphanumeric   LCD پیکربندی LCD را انجام داده و در ادامه با ذخیره فایل تولید شده توسط codewizard بستری را برای برنامه نویسی خود فراهم کنید.

سپس  با استفاده از دستور پیش پردازنده <include <keypad.h# فایل هدر keypad  را به برنامه خود اضافه کنید . حال نوبت به معرفی پورتی که قرار است کیپد ۴*۴ را به آن متصل کنیم می رسد .

برای سادگی و قابل فهم بودن  پیکربندی keypad روی پورت مورد نظر ، از الگوی پیکربندی lcd   کاراکتری  که در ورژن های قدیمیتر کدویژن و به زبان اسمبلی استفاده می شد بکار گرفته شده است ، برای انجام پیکربندی ابتدا باید آدرس پورتهای خروجی میکروکنترلر AVR را بدانیم.

کی پد 4*4
کی پد ۴*۴

الگوی پیکربندی lcd   کاراکتری به شکل زیر می باشد  :

الگوی پیکربندی ۴*۴ keypad به شکل زیر می باشد  :

 

 

اتصال صفحه کلید ماتریسی ۴*۴ به میکرو کنترلر avr

اسکن صفحه کلید 4*4
اسکن صفحه کلید ۴*۴
در مثال ذکر شده اسکن صفحه کلید ماتریسی ۴*۴ به روش polling  یا سرکشی صورت می پذیرد ، یعنی میکروکنترلر باید دائما به پورتی که کیپد به آن متصل شده سرکشی کند تا فشرده شدن کلیدی را متوجه شود .

این عمل باعث اشغال شدن cpu  می شود و از کارایی میکروکنترلر avr کاسته می شود ، برای رفع این مشکل از روشی به نام wake up در اسکن صفحه کلید ۴*۴ استفاده می کنیم .

در این روش با استفاده از چهار عدد دیود ۱N4148 سطرهای  کیپد ( P.0 تا  P.3) را به یکی از وقفه های خارجی میکروکنترلر متصل می کنیم و با فعال سازی وقفه خارجی ، هنگامی که کلیدی فشرده شود زیر برنامه وقفه خارجی اتفاق می افتد و با نوشتن دستورات مربوط به کلید خوانی در زیر برنامه وقفه ، مقدار کلید فشرده شده را بدون نیاز به سرکشی دائم و اشغال شدن cpu   میکروکنترلر  بدست می آورد .

کلیدخوانی کیپد 4*4 با کدویژن
کلیدخوانی کیپد ۴*۴ با کدویژن

مثال :
ابتدا با استفاده از چهار عدد دیود ۱N4148  پینهای صفر تا سه از پورتی که کیپد به آن متصل شده را مطابق شکل به پایه INT0 میکروکنترلر وصل کنید . سپس PIND.2  که ورودی وقفه خارجی صفر است را به عنوان ورودی و مقاومت poll up  آن را فعال نموده و وقفه خارجی صفر را در مد low level  قرار دهید . در این مثال lcd  روی PORTB پیکربندی شده .

فایلهای پیوست :
کتابخانه کیپد 4*4 با کدویژن
فایل شبیه سازی شده با پروتئوس

رمز فایل : www.avr-city.ir
حجم فایل : 200 کیلو بایت
محیط برنامه نویسی : Codevision AVR
نویسنده : حسین غیاثوند
تاریخ انتشار: 1396/12/12
لینک دانلود :
[ برای دریافت فایل وارد شوید و یا ثبت نام کنید! ]

ارزیابی این مطلب :
  • محتوا
  • رابط کاربری
5

7 دیدگاه

  1. با سلام و خسته نباشید
    فایل پیوست رو دانلود کردم اما روش wake up داخل پروتئوس درست انجام نمیشه. یعنی روی lcd خروجی نداریم.
    لطفا پیگیری بفرمایید.
    از آموزش و سایت بسیار خوبتون تشکر میکنم.

    • سلام
      موردی که شما فرمودین بررسی شد . بدون مشکل و بدرستی عمل می کند . ابتدا هیچگونه نوشته ای بر روی lcd وجود ندارد باید کلیدی را بفشارید تا نمایش داده شود . تغییراتی بر روی برنامه انجام دادم و دوباره برای دانلود در سایت قرار دادم می توانید از فایل جدید استفاده کنید .

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

  3. سلام و خسته نباشید
    لطفا آموزش پیکربندی کی پد 4*6 را قرار دهید تو هیچ سایتی پیدا نکردم
    متشکر

    • سلام و وقت بخیر
      توسط همین آموزش می تونید کیپد 4*6 را هم اسکن کنید . به سطرها دو ردیف سطر اضافه کنید ، و در جدول جمعی که تشبیه شده ، سطر پنجم را عدد 16 و سطر ششم را عدد 20 قرار دهید . فایل کتابخانه keypad.lib رو باز کنید و جدول kbd_table را به 24 عضو افزایش دهید .

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

  5. سلام
    فایل های کتابخانه داخل پوشه lib هستند .

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

نشانی ایمیل شما منتشر نخواهد شد.