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

ویژگی های متمایز کننده:

  • صفحه کلید ماتریسی 64 کلیدی 8 × 8
  • بدون نیاز به اجزای خارجی
  • با فشار دادن دکمه از حالت خواب خارج شوید
  • ادغام آسان با سایر برنامه ها
  • کم مصرف
  • الگوریتم انحراف نرم افزار
  • پشتیبانی از عملکردهای دکمه جایگزین، که به راحتی حذف می شوند تا اندازه برنامه کاهش یابد
  • کد برنامه را می توان توسط هر میکروکنترلر AVR که دارای حداقل 17 پورت I / O و دارای وقفه تغییر خط است استفاده کرد (در حال حاضر فقط ATmega162 و ATmega169)
  • کد را می توان به راحتی برای استفاده در سایر میکروکنترلرها با استفاده از یک وقفه معمولی تغییر داد (به مثال برنامه "AVR240: 4 x 4 Keypad - Wake-up on Keypress" مراجعه کنید)

مقدمه

AT این مثالبرنامه برنامه درایور رابط ماتریس صفحه کلید 8 x 8 را توصیف می کند. مثال برنامه برای استفاده در دستگاه های خود تغذیه طراحی شده است. میکروکنترلر AVR بیشتر زمان خود را در حالت خواب می گذراند و تنها زمانی فعال می شود که دکمه های صفحه کلید فشار داده شود. پس از آن، ماتریس صفحه کلید اسکن می شود، اطلاعات پردازش می شود و سیستم به حالت کم مصرف باز می گردد.

همچنین، دستگاهی که در این مثال کاربردی توضیح داده شده است، از عملکردهای جایگزین قابل برنامه ریزی توسط کاربر مانند درپوش قفل، Ctrl-، Shift- و Alt-. برنامه آزمایشی یک ماتریس صفحه کلید 4×4 را ارائه می دهد که هر دکمه مربوط به یک عدد و سه کاراکتر است. دکمه های جایگزین به شما امکان می دهند عملکرد دکمه فشرده شده را انتخاب کنید.

شکل 1. برنامه آزمایشی

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

دستگاهی که در این مثال کاربردی توضیح داده شده است بر اساس میکروکنترلر ATmega162 است. با این حال، پس از تغییرات کوچککد برنامه را می توان در میکروکنترلر ATmega169 استفاده کرد.

اصول کارکرد، اصول جراحی، اصول عملکرد

اتصال دکمه های ماتریس صفحه کلید 8*8 در شکل 2 نشان داده شده است. هنگامی که دکمه فشار داده می شود، ردیف ها و ستون های مربوطه به هم متصل می شوند. با کلیک بر روی دکمه بالا سمت چپ، سمت چپ ترین ستون و بالاترین ردیف بسته می شود.


شکل 2. اتصال ماتریس صفحه کلید

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

اگر نیاز به نگهداری از صفحه کلیدی است که امکان فشردن همزمان دکمه ها را فراهم می کند، نمی توان از روشی که در بالا توضیح داده شد استفاده کرد. در این حالت، خطوط باید به طور جداگانه اسکن شوند. سطرها باید به صورت متوالی انتخاب شوند (کم تنظیم شوند) و تمام ستون ها حذف شوند. در این حالت، تمام دکمه های فشرده مشخص می شوند. با این حال، در این مورد، ارتباطات متقابل ظاهر می شود. شکل 3 نتیجه فشردن سه کلید را نشان می دهد که به نظر می رسد دکمه ای که با X مشخص شده است نیز فشار داده شده است. این منجر به یک خطای رمزگشایی می شود.


شکل 3. رمزگشایی نادرست هنگامی که دکمه ها به طور همزمان فشار داده می شوند

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

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

دکمه های جایگزین

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

دکمه های جایگزین تنها زمانی در نظر گرفته می شوند که دکمه های اصلی فشار داده شوند. در این مورد، دکمه های جایگزین "تک شات" نامیده می شوند.

همچنین می‌توان دکمه‌های «تریگر» را پیاده‌سازی کرد که با فشار دادن اولین بار، عملکردهای جایگزین را فعال می‌کنند و با فشار دادن مجدد، غیرفعال می‌شوند. در این مورد، عملکردهای جایگزین برای همه دکمه‌هایی که بعداً فشار داده می‌شوند استفاده می‌شود. چنین عملکردهایی دارای دکمه Caps Lock در استاندارد هستند صفحه کلید کامپیوتر. این مثال برنامه از هر دو دکمه تک شات و ماشه استفاده می کند.

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

تماس با چت

شکل 4 جهش مخاطبین را هنگام فشار دادن یک دکمه نشان می دهد. همانطور که می بینید، تقلیدی از پرس مکرر وجود دارد. برای جلوگیری از رمزگشایی نادرست، کد اسکن مدتی پس از وقوع وقفه تغییر حالت خوانده می شود. همچنین این الگوریتم که anti-bounce نام دارد، هنگام قرار گرفتن در معرض نویز از مثبت کاذب جلوگیری می کند. Debouncing را می توان با فیلتر سخت افزاری یا دیجیتالی نیز پیاده سازی کرد، اما روش استفاده شده در این اپلیکیشن کم هزینه ترین است.


شکل 4. گفتگوی تماس

پیاده سازی

در این پیاده سازی از میکروکنترلر ATmega162 استفاده شده است. توصیه هایی برای مهاجرت به میکروکنترلر ATmega169 در انتهای این سند ذکر شده است.

صفحه کلید به دو پورت میکروکنترلر AVR 8 بیتی متصل است. یک پورت (پورت D) برای عملکرد همه خطوط به عنوان خروجی پیکربندی شده است و به ردیف های ماتریس صفحه کلید متصل می شود. پورت دیگر (پورت C) برای عملکرد تمام خطوط به عنوان ورودی پیکربندی شده و به ستون های ماتریس صفحه کلید متصل است. شما می توانید این را با جزئیات بیشتری در شکل 2 ببینید. هنگام اسکن یک ماتریس صفحه کلید، درگاهی که به عنوان خروجی استفاده می شود باید خروجی ها را پایین نگه دارد، و پورتی که به عنوان ورودی استفاده می شود باید دارای مقاومت های pull-up داخلی باشد.

دستگاه توصیف شده از اولین خط پورت E برای تولید یک کد سریال مربوط به کد دکمه فشرده شده استفاده می کند. داده ها با استفاده از UART داخلی منتقل می شوند که استفاده از آن در مثال برنامه کاربردی AVR306 توضیح داده شده است.

هنگامی که به طور معمول فشار داده می شود، یک کد اسکن ایجاد می شود که مقدار آن در محدوده 0 تا 63 (8 ردیف * 8 ستون) قرار دارد. با فشار دادن دکمه فراخوانی عملکرد جایگزین، یک کد اسکن معمولی نیز ایجاد می‌شود، اما علاوه بر این، پرچم‌های عملکرد جایگزین مربوطه تنظیم می‌شوند. این پرچم های وضعیت در یک متغیر سراسری ذخیره می شوند.

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

یک متغیر سراسری دیگر برای ارسال اسکن کد به همراه پرچم ها به برنامه استفاده می شود. شش بیت کم اهمیت برای انتقال کد استفاده می شود (از 0 تا 63) و مهم ترین بیت (MSB) نشان دهنده تغییر حالت است. درایور صفحه کلید این بیت را با فشار دادن یک دکمه تنظیم می کند. برنامه این بیت را نظرسنجی می کند و پس از خواندن کد اسکن آن را بازنشانی می کند. بایت جهانی و کلمه اسکن در شکل 5 نشان داده شده است.


شکل 5. کد اسکن توسعه یافته

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

ماژول شروع و برنامه اصلی

شکل 6 ماژول اولیه سازی و برنامه اصلی را نشان می دهد. بازنشانی پرچم‌های تابع جایگزین و متغیرهای سراسری، و همچنین راه‌اندازی پورت‌ها، در بالا توضیح داده شده است. اگر نیازی به پردازش نباشد، حالت خواب بیکار انتخاب می شود.


شکل 6. ماژول شروع و برنامه اصلی

ماژول اصلی رمزگشای صفحه کلید رمزگشای صفحه کلید یک کنترل کننده وقفه تغییر وضعیت پورت است. ابتدا حالت خواب بیکار انتخاب شده است که اجازه می دهد میکروکنترلر AVRهنگامی که تایمر سرریز می شود، فعال می شود، که زمانی که میکروکنترلر در حالت خاموش کردن خاموش است غیرممکن است. تایمر تنظیم شده است تا پس از 5 میلی ثانیه یک وقفه ایجاد کند که برای پایان دادن به گذر سیگنال ها در خروجی ها کافی است. در طول این زمان تاخیر، برنامه اصلی دوباره کنترل را به دست می آورد و می تواند حالت خواب را فعال کند. در پایان زمان تأخیر، روش پردازش فشار دکمه فراخوانی می شود. این تابع تعریف کد دکمه فشرده شده را کامل می کند. در انتهای آن سطح پایینی روی خطوط پورت تمامی خطوط تنظیم شده و حالت خواب Power-down فعال می شود که خروج از آن با فشار دادن دکمه امکان پذیر است. بلوک دیاگرام این ماژول نرم افزار در شکل 7 نشان داده شده است.

شکل 7. بلوک دیاگرام ماژول نرم افزار اصلی رمزگشای صفحه کلید

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


شکل 8. بلوک دیاگرام روال اسکن صفحه کلید

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


شکل 9. بلوک دیاگرام عملکرد پردازش کد اسکن

کیس تست myCellPhone

یک برنامه آزمایشی وجود دارد که یک ماتریس صفحه کلید شبیه صفحه کلید را پیاده سازی می کند تلفن همراه. کاراکترهای پایانی در آن از طریق رابط USART منتقل می شوند. با استفاده از ماتریس صفحه‌کلید ۴×۴، می‌توانید تمام اعداد و نمادهایی را که می‌توان با استفاده از چهار دکمه فراخوانی عملکرد جایگزین دیگر ارائه کرد، تشکیل داد. سه دکمه برای انتخاب عملکرد جایگزین هر دکمه اصلی استفاده می شود، در حالی که دکمه چهارم به عنوان دکمه Caps Lock (تغییر بین حروف بزرگ یا کوچک) عمل می کند.

برای تبدیل کدهای اسکن به ترکیب کدهای مربوط به کدهای دکمه های فشرده، با در نظر گرفتن دکمه های عملکردهای جایگزین، از جدول تبدیل استفاده می شود. کد اسکن همچنین می تواند برای اسکن یک ماتریس صفحه کلید 8×8 استفاده شود.بنابراین، جدول باید 8 ورودی در هر خط داشته باشد، در حالی که فقط از 4 دکمه در هر خط استفاده می شود. بنابراین، با افزایش تعداد ستون های ماتریس صفحه کلید، اندازه برنامه تغییر نخواهد کرد.

اندازه کد برنامه کاربردیو پارامترهای زمانی

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

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

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

جدول 2. مدت زمان توالی اقدامات انجام شده

اگر حالت خواب Power-down را در نظر نگیرید، می بینید که بیشتر اوقات میکروکنترلر در حالت خواب بیکار کار می کند. در حالت فعال، میکروکنترلر تنها 0.3 میلی ثانیه است که حدود 0.5 درصد کل زمان است. زمان اقامت نسبی در حالت های مختلف عملیاتی در جدول 3 آورده شده است.

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

اگر فرض کنیم که دکمه ها هر 10 دقیقه یک بار فشار داده شوند، میانگین مصرف فقط 2 μA خواهد بود.

استدلال در مورد استفاده از سایر میکروکنترلرها

تنها تفاوت در استفاده از میکروکنترلرهای ATmega162 و ATmega169 این است که آنها باید از پورت های مختلفی برای اتصال ماتریس صفحه کلید استفاده کنند. ATmega162 از پورت C استفاده می کند، در حالی که ATmega169 باید از پورت E استفاده کند. این به این دلیل است که آنها پورت های مختلفی با وقفه تغییر خط دارند. ATmega162 عملکرد ایجاد وقفه در تغییر وضعیت خطوط پورت C و ATmega169 - در تغییر وضعیت خطوط پورت E را دارد. در صورت نیاز به استفاده از سایر عملکردهای جایگزین این پورت ها ، سپس باید برنامه را به گونه ای تغییر دهید که از پورت دیگری استفاده کنید که عملکرد ایجاد وقفه های تغییر حالت خط را دارد.

همچنین توجه داشته باشید که ATmega169 از رجیستر SMCR برای فعال کردن حالت خواب استفاده می کند.

هنگام استفاده از سایر میکروکنترلرها، به اجزای خارجی اضافی و تغییر در وقفه استفاده شده نیاز خواهید داشت. استفاده از چنین میکروکنترلرهایی برای پردازش یک ماتریس صفحه کلید 4x4 در مثال کاربردی AVR240 توضیح داده شده است. عملکردهای باقی مانده از مثال برنامه توصیف شده نیازی به تغییر ندارند.

اغلب، پین های آزاد میکروکنترلر برای اتصال تعداد مورد نیاز دکمه کافی نیست. با اتصال مستقیم برای n دکمه، لازم است که همان تعداد خطوط ورودی / خروجی را اختصاص دهید، که همیشه امکان پذیر نیست. برای استفاده منطقی تر از خطوط پورت، می توانید از نمودار اتصال ماتریسی در شکل 1 استفاده کنید. در این حالت ماتریس متصل به پورت D دارای سایز 4*4=16 دکمه است (4 ردیف r0…r3 و 4 ستون с0…с3). خطوط PD0…PD3، که خطوط r0…r3 هستند، همیشه برای ورودی پیکربندی می‌شوند و توسط مقاومت‌های R به سمت گذرگاه قدرت کشیده می‌شوند (نمره معمولی 4.7…10 کیلو اهم). از روی آنها وضعیت دکمه های SB1-SB16 خوانده می شود. در خطوط PD4 ... PD7 (ستون های c0 ... c3) به نوبه خود سیگنال صفر منطقی تولید می شود. در ابتدا سطح پایین روی ستون c0 و در بقیه ستون ها حالت Z تنظیم می شود. اکنون، تنها زمانی که دکمه های این ستون (SB1…SB4) روی خطوط ردیف های r0…r3 فشار داده شود، سطح منطقی پایینی می تواند رخ دهد. بعد، 0 منطقی روی ستون c1 تنظیم می شود و گروهی از دکمه های SB5 ... SB8 اسکن می شود و غیره. دقیقاً از همان الگوریتم نظرسنجی دکمه ای برای هر صفحه کلید ماتریسی دیگری صرف نظر از تعداد سطرها و ستون ها استفاده می شود. به طور کلی، تعداد دکمه‌های n حاصل ضرب تعداد سطرها و ستون‌ها است. بنابراین، برای مثال، یک ماتریس 2*2 (4 خط) شامل 4 دکمه خواهد بود. اما از طرف دیگر، به همان تعداد خطوط I/O برای اتصال مستقیم همان تعداد دکمه نیاز خواهد بود. بنابراین، صرفه جویی در نتیجه گیری زمانی ظاهر می شود که تعداد دکمه ها از 4 ... 6 تجاوز کند و با افزایش تعداد آنها حتی بیشتر قابل توجه می شود.

شکل 1 نمودار اتصال ماتریسی دکمه ها

عناصر VD1 ... VD4 و R1 ... R4 در نمودار اختیاری هستند. دیودها برای محافظت در برابر مدار کوتاهبین خطوط سطر و ستون به عنوان مثال، اگر وقتی دکمه SB1 را فشار می دهید (در زمان اسکن ستون c0)، خط ردیف r0 ناگهان معلوم شد که خروجی است و سطح منطقی بالایی دارد، آنگاه یک جریان غیرقابل قبول بزرگ شروع به جریان می کند. از طریق مدار c0r0. اگرچه منطق برنامه اجازه این حالت کار را نمی دهد، اما به دلایل مختلف هنوز ممکن است اتفاق بیفتد. بنابراین، حداقل هنگام اشکال زدایی یک برنامه، دیودها اضافی نخواهند بود. اگر ظرفیت نصب داده شده به پین‌های PD3 ... PD0 خیلی زیاد نباشد، می‌توان مقاومت کشش به گذرگاه قدرت را با مقاومت‌های داخلی «کشش» جایگزین کرد. برای انجام این کار، زمانی که خطوط برای ورودی پیکربندی شده اند، باید بیت های مناسب را در ثبات PORTD تنظیم کنید.

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

دکمه Def = R16 ;ثبت نام با کد دکمه فشار داده شده.def temp = R17 ;ثبت نام برای عملیات میانی ldi temp,high(RAMEND) ؛ پشته مقداردهی اولیه SPH, temp ldi temp, low (RAMEND) out SPL, temp . clr temp ;تنظیم خطوط پورت D برای ورودی DDRD,temp ldi temp, (1<< PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3) out PORTD,temp . rcall btn_pol . ; Подпрограмма опроса матричной клавиатуры; R16 – номер нажатой кнопки на выходе из подпрограммы, ; если ни одна кнопка не нажата, то R16=0; ; если нажаты две и более кнопок, то R16=0xFF ; R17 – регистр для определения номера строки; R18 – регистр для задания номера столбца; R19 – счётчик столбцов; R20 – регистр для промежуточных операций btn_pol: clr R16 ;обнуляем регистры с кодом нажатой clr R19 ;кнопки и номером столбца ldi R18,0x0F ;очищаем регистр данных PORTD порта D out PORTD,R18 ldi R18,0x00010000 bp1: out DDRD,R18 ;настраиваем на вывод линию соответствующего nop ;столбца через регистр DDRD порта D in R17,PIND ;считываем состояние строк из регистра PIND com R17 andi R17,0x0F ;выделяем значение 4-х строк ldi R20,0 ;если ни одна кнопка в столбце не нажата, breq bp5 ;перемещаемся на следующий столбец cpi R17,0x01 ;если нажата кнопка в строке c0, ldi R20,1 ;то вычисляем её номер breq bp2 cpi R17,0x02 ;если нажата кнопка в строке c1, ldi R20,2 ;то вычисляем её номер breq bp2 cpi R17,0x04 ;если нажата кнопка в строке c2, ldi R20,3 ;то вычисляем её номер breq bp2 cpi R17,0x08 ;если нажата кнопка в строке c3, ldi R20,4 ;то вычисляем её номер brne bp3 ;если нажато более одной кнопки, завершаем опрос bp2: tst R16 ;если в предыдущих столбцах были нажаты breq bp4 bp3: ldi R16,0xFF ;кнопки, то завершаем опрос с кодом 0xFF ret bp4: push R19 ;иначе вычисляем номер кнопки, как lsl R19 ;N = 4*column + row + 1 = 4*R19 + R20 + 1 lsl R19 add R20,R19 mov R16,R20 pop R19 bp5: inc R19 lsl R18 cpi R19,4 ;повторяем цикл опроса пока не будут brne bp1 ;опрошены все 4 столбца ret

با تمام مزایا، طرح اتصال ماتریسی یک اشکال دارد. با کمک آن، اجرای خواندن ترکیب دکمه ها دشوار است. در صورتی که هر سه دکمه روی چنین صفحه‌کلیدی فشار داده می‌شود که بین آنها زاویه قائمه ایجاد می‌کند (به عنوان مثال، SB1، SB2، SB5)، برنامه نظرسنجی فشار نادرست دکمه‌ای را که در گوشه آزاد قرار دارد ضبط می‌کند. مستطیل (در این مورد SB6). در یک سناریوی خاص، چنین دکمه "فانتوم" می تواند هر دکمه روی صفحه کلید باشد.

فهرست عناصر رادیویی

تعیین نوعی از فرقه تعداد توجه داشته باشیدنمرهدفترچه یادداشت من
DD1 MK AVR 8 بیتی

ATmega8

1 به دفترچه یادداشت
VD1-VD4 دیود 4 به دفترچه یادداشت
R, R, R, R مقاومت 4

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

روش اول - سنتی

fig1a fig1b

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

هنگامی که دکمه آزاد می شود، خروجی میکرون از طریق یک مقاومت به "پلاس" منبع تغذیه متصل می شود (شکل 1a). با فشار دادن دکمه، خروجی میکرو به زمین متصل می شود. مقاومت pull-up R1 جریان در مدار سوئیچ را محدود می کند. اگر آنجا نبود، وقتی دکمه را فشار می دادیم، به سادگی منبع تغذیه خود را اتصال کوتاه می کردیم.

اکثر میکروکنترلرهای مدرن دارای مقاومت های کششی داخلی هستند، بنابراین می توان مقاومت های خارجی را حذف کرد (شکل 1b). در برنامه میکروکنترلر، باید پین استفاده شده را در ورودی پیکربندی کرده و مقاومت کششی داخلی را فعال کنید.

اگر پایه میکروکنترلر در حالت خروجی باشد چه اتفاقی می افتد؟ این به وضعیت آن پین بستگی دارد. اگر خروجی "صفر منطقی" باشد، اتفاق بدی نمی افتد، زیرا - در حالت اول (شکل 1a) مقدار جریان ورودی توسط مقاومت R1 محدود می شود و در حالت دوم (شکل 1b) هیچ جریانی جریان نخواهد داشت. اصلا هنگامی که دکمه فشار داده می شود، هیچ اتفاقی نمی افتد، زیرا اختلاف پتانسیل بین خروجی و "زمین" در این مورد برابر با صفر خواهد بود.

اگر یک "واحد منطقی" روی خروجی وجود داشته باشد و دکمه فشار داده شود، جریانی به اندازه چند ده میلی آمپر از طریق خروجی میکروکنترلر به زمین می گذرد و خروجی پورت ممکن است "سوخته شود". حداکثر جریان مجاز برای خروجی میکروکنترلر AVR طبق مستندات 40 میلی آمپر است. بنابراین، گاهی اوقات قرار دادن مقاومتی با مقدار اسمی چند صد اهم، به عنوان مثال 330 (شکل 1c) بین خروجی MK و دکمه بی جا نیست. بنابراین، به عنوان مثال، دکمه های روی برد اشکال زدایی STK500 به هم متصل هستند. این کار برای اطمینان از اینکه کاربر در طول آزمایشات خود به طور تصادفی میکروکنترلر را نمی سوزاند انجام می شود.

با این حال، برای طرح‌بندی‌های خود، می‌توانید بدون این مقاومت انجام دهید.

راه دوم - استفاده از دیودها

زمانی استفاده می شود که بیش از دو دکمه وجود داشته باشد، و شما می خواهید نتیجه گیری را ذخیره کنید. در این حالت هر دکمه کد دیجیتالی مخصوص به خود را دارد و تعداد دکمه هایی که می توان به این صورت روی N پین آویزان کرد mk = 2 N - 1. یعنی می توان 7 دکمه را روی سه پایه آویزان کرد، 15 دکمه را روی چهار پایه قرار داد. ، و غیره ... اما من بیش از 7 را آویزان نمی کنم. تعداد اجزای خارجی اضافی در حال افزایش است، طرح و برنامه میکروکامپیوتر پیچیده تر می شود. علاوه بر این، برای تعداد زیادی دکمه، طرح های تعویض دیگری نیز وجود دارد. مقاومت های کششی در نمودار نشان داده نشده اند، فرض بر این است که از مقاومت های داخلی استفاده شده است.

به هر حال، از طریق دیودها هنوز امکان ارسال سیگنال از دکمه ها به خروجی یک وقفه کنترل کننده خارجی وجود دارد (شکل 3). وقتی هر دکمه ای را فشار می دهید، خروجی وقفه خارجی از طریق دیود به زمین کوتاه می شود و باعث وقفه می شود (البته به شرط اینکه پیکربندی و فعال باشد). بنابراین، کنترل کننده نیازی به نظرسنجی دائمی دکمه ها نخواهد داشت، این روش تنها با یک رویداد وقفه خارجی فعال می شود.

این طرح برای همه میکروکنترلرهای AVR مرتبط نیست، زیرا در برخی از مدل‌های میکروکنترلرها می‌تواند در هر تغییری در هر پین، یک وقفه خارجی رخ دهد. (به عنوان مثال در ATmega164P)

راه سوم برای صفحه کلید ماتریسی است

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

خروجی‌های PC0، PC1، PC2، PC3 ردیف‌های ماتریس، خروجی‌های PB0، PB1، PB2 ستون‌های ماتریس هستند. دکمه ها را می توان با ردیف یا ستون نظرسنجی کرد. فرض کنید که ستون به ستون آنها را پرس و جو می کنیم. روند رای گیری به این صورت خواهد بود: حالت اولیه همه پین ​​ها ورودی با مقاومت کشش روشن است. پین PB0 را روی حالت خروجی قرار دهید و روی صفر تنظیم کنید. اکنون با فشار دادن دکمه های S1، S2، S3، S4 خروجی های PC0، PC1، PC2، PC3 به 0 برق بسته می شود. ما این خروجی ها را بررسی می کنیم و مشخص می کنیم که آیا دکمه ای در حال حاضر فشار داده شده است یا خیر. پین PB0 را روی حالت خروجی قرار دهید و مقاومت کششی را روشن کنید. خروجی PB1 را روی حالت خروجی قرار دهید و روی صفر تنظیم کنید. مجدداً، ما نتایج PC0، PC1، PC2، PC3 را مورد بازجویی قرار می‌دهیم. اکنون با فشار دادن دکمه های S5، S6، S7، S8 خروجی های PC0، PC1، PC2، PC3 بسته می شوند. آخرین ستون دکمه ها را به همین ترتیب بازجویی می کنیم.

ردیف های ماتریس را می توان از طریق دیودها به خروجی یک وقفه خارجی هدایت کرد. سپس منطق برنامه را می توان به این شکل ساخت. اگر از صفحه کلید برای چند دقیقه استفاده نشود، میکروکنترلر وارد حالت کم مصرف می شود. در این حالت، خروجی‌های PB0، PB1، PB2 به عنوان خروجی‌هایی با سطح منطقی صفر پیکربندی می‌شوند. هنگامی که یکی از دکمه ها فشار داده می شود، خروجی وقفه دیود به صفر می رسد. این یک وقفه خارجی ایجاد می کند، میکروکنترلر بیدار می شود و تایمر را راه اندازی می کند که صفحه کلید روی آن اسکن می شود. به طور موازی، یک شمارنده زمان شروع می شود که با فشار دادن هر یک از دکمه ها، تنظیم مجدد می شود. به محض سرریز شدن، میکروکنترلر دوباره به حالت کم مصرف می رود.

وقت آن است که به شما بگوییم چگونه یک نظرسنجی از چنین کلودیا ترتیب دهید. اجازه دهید به شما یادآوری کنم که clave شامل ردیف هایی است که روی پورت ها و ستون هایی آویزان شده اند که توسط پورت دیگری اسکن می شوند. کد برای کنترلر نوشته شده است ATMega8535، اما با توجه به این واقعیت که همه چیز در آنجا به صورت ماکرو نشان داده شده است، می توان آن را به سرعت به هر کنترل کننده کلاس دیگری منتقل کرد. عظیم، و همچنین تحت بسیاری از مدرن کوچک. اگرچه در مورد کوچکممکن است به دلیل مجموعه ناقص دستوراتی که دارند، مقداری تهوع وجود داشته باشد. شما باید کمی آن را با یک فایل تغییر دهید.

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

حالا به طور خلاصه در مورد فایل ها:
keyboard_define.inc- فایل پیکربندی صفحه کلید
این فایل تمام تعاریف ماکرو استفاده شده توسط صفحه کلید را ذخیره می کند. در اینجا تعیین می کنیم که کدام پایه های میکروکنترلر به کدام خط وصل باشد. یک نکته ظریف - نتیجه گیری در ستون ها ( پورت اسکن) باید مجموعه ای سریالی از خطوط همان پورت باشد. یعنی مثلاً پاها 0,1,2,3 یا 4,5,6,7 ، یا 3,4,5,6 . مهم نیست کدام پورت، نکته اصلی این است که سازگار باشد.
با تعریف پاها فکر کنم مشکلی پیش نیاد ولی در مورد پارامتر ماسک کلیدمیخوام یه چیز خاصی بگم
این ماسکی است که توسط آن پورت اسکن شده تخصیص داده می شود. باید دارای 6 یک و یک 0 باشد. صفر در سمت راست درگاه اسکن تنظیم شده است.

مثال:
پورت اسکن من روی بیت های 7،6،5،4 آویزان است، بیت سمت راست پورت اسکن بیت 4 است، بنابراین ماسک 0b11101111 است - صفر در موقعیت 4 قرار دارد. اگر خطوط اسکن روی پاهای 5،4،3،2 آویزان باشند، ماسک در حال حاضر 0b11111011 خواهد بود - صفر در موقعیت دوم. چرا این همه است در زیر توضیح داده خواهد شد.

همچنین ماسکی از خطوط فعال پورت اسکن وجود دارد - SCANMSK. در آن واحدها فقط در مقابل خطوط ستون ها قرار دارند. ستون‌های من روی بالاترین تتراد پورت تنظیم شده‌اند، بنابراین ماسک اسکن به نظر می‌رسد 0b11110000.

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

این چیزی است که کد تست من به نظر می رسد:

اصلی: SEI ; ما وقفه ها را فعال می کنیم.

RCALL KeyScan ; اسکن صفحه کلید
CPI R16.0 ; اگر 0 برگردانده شد، هیچ کلیکی وجود نداشت
BREQ اصلی ; در این حالت به ابتدا بروید
RCALL Code Gen ; اگر کد اسکن برگشت، آن را به آن ترجمه کنید
; کد اسکی

MOV R17, R16 ; در حال بارگیری در رجیستر دریافت کنترل کننده LCD
RCALL DATA_WR ; نمایش می دهیم.

RJMP اصلی ; ما همه چیز را حلقه می کنیم.

حرفه ای ال سی دینمایش، من هنوز چیزی نمی گویم، زیرا مراحل هنوز به ذهنم نیامده است، اما در آینده نزدیک پست و جویده می شوند.

حالا من به شما می گویم که چگونه کار می کند روش اسکن کلید

Def COUNT = R18
KeyScan: LDI COUNT,4 ; اسکن 4 ستون
LDI R16,KEYMASK ; ماسک را در اسکن 0 ستون بارگذاری کنید.

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

KeyLoop: IN R17,COL_PORT ; مقدار قبلی را از پورت می گیریم
ORI R17، SCANMSK؛ بیت های قسمت اسکن شده را 1 قرار می دهیم.


در ابتدا بارگیری داده ها از ثبت پورتتا پیکربندی پورت اولیه در دسترس باشد. همچنین باید تمام بیت‌های اسکن پورت را روی 1 تنظیم کنیم، این کار از طریق عملیات انجام می‌شود یابا اسکن ماسک در قسمتی که یگان ها بعد از عملیات ایستادند یاتوسط ماسک 11110000 (منظور من ماسک اسکن) همه بیت ها یک می شوند و جایی که صفر بود بدون تغییر باقی می ماند.

و R17,R16 ; بیت ستون اسکن شده را بازنشانی کنید
OUT COL_PORT، R17؛ بایت تولید شده را از پورت خروجی می گیریم.


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

NOP ; تاخیر سوئیچ پا
نه
نه
نه

SBIS ROW0_PIN،ROW0؛ بررسی کنید روی کدام خط کلیک شده است
RJMP bt0

SBIS ROW1_PIN،ROW1
RJMP bt1

SBIS ROW2_PIN،ROW2
RJMP bt2

SBIS ROW3_PIN،ROW3
RJMP bt3


سلسله نهبه منظور دادن زمان به پا قبل از بررسی برای رسیدن به سطح مورد نظر مورد نیاز است. واقعیت این است که یک مدار واقعی مقداری ظرفیت خازنی و اندوکتانس دارد که باعث می شود تغییر سطح فوری غیرممکن استهنوز کمی تاخیر وجود دارد و با سرعت 8 مگاهرتز و بالاتر، پردازنده با سرعتی دستورات را کلیک می کند که هنوز ولتاژ روی ساق پایین نیامده است و ما در حال بررسی وضعیت خروجی هستیم. بنابراین من چند عملیات خالی را انجام دادم. در 8 مگاهرتز همه چیز خوب کار می کند. در فرکانس بالاتر، احتمالاً لازم است پنج یا شش مورد دیگر قرار دهید نهیا یک چرخه ساده بچسبانید. با این حال، در اینجا باید ببینید چه چیزی از نظر بایت مقرون به صرفه تر است.
بعد از حلقه ها، چهار چک در هر خط وجود دارد. و انتقال به مدیریت مناسب رویداد.

ROL R16; ماسک اسکن را حرکت دهید
تعداد دسامبر ; کاهش تعداد ستون ها
BRNE KeyLoop ; اگر هنوز همه چیز مرتب نشده است، یک بار دیگر تکرار می کنیم

CLR R16 ; اگر هیچ کلیکی وجود نداشت، 0 را برگردانید
RET
.undef COUNT

در اینجا ماسک با دستور cyclic shift به سمت چپ منتقل می شود ROL. پس از آن، شمارشگر تکرار را کاهش می دهیم (در ابتدا برابر با چهار، زیرا چهار ستون داریم). اگر هیچ کلیکی وجود نداشت، پس از پایان هر چهار تکرار، از حلقه خارج می‌شویم، رجیستر را بازنشانی می‌کنیم. R16و ما برمی گردیم


bt0: ANDI R16، SCANMSK؛ ما یک کد اسکن تولید می کنیم
ORI R16.0x01 ; ما آن را در ثبت 16 برمی گردانیم
RET

و در اینجا یکی از پایان های ممکن در هنگام فشار دادن است. در اینجا یک کد اسکن تولید می شود که در رجیستر برگردانده می شود R16.تصمیم گرفتم مزاحم نشوم، اما مثل همیشه، یک دوجین بایت را گیره و تا حد امکان سریع و کوتاه کنید. بنابراین، پس از ورود به این قطعه کد چه چیزی داریم. و ما یکی از گزینه های پورت اسکن را داریم ( 1110,1101,1011,0111 ) و همچنین شماره خطی را که به اینجا رسیده ایم را می دانیم. به طور مشخص این قطعه فقط از خط اول با دستور قابل دسترسی است RJMP bt0.
پس بیایید از یک ترکیب اسکن و یک شماره خط یک کد اسکن بسازیم! زودتر گفته شد! ابتدا باید یک ترکیب اسکن را از مقدار پورت استخراج کنیم - آن را در رجیستر ذخیره می کنیم R16، بنابراین نیازی به برداشتن آن از پورت نیست. ما عملیات و مقدار را تحت فشار قرار می دهیم R16از طریق ماسک اسکنو هر چیزی که زیر یکها بود بدون تغییر گذشت و جایی که صفر بود ناپدید شد. Opa، و ما یک قطعه اسکن - نیبل بالا را نمایش داده ایم. اکنون شماره خط را در آنجا می چسبانیم - توسط عملیات یا. یک بار، و ما ساختی از فرم را دریافت کردیم [اسکن] [رشته]
در اینجا ما آن را در رجیستر می گذاریم R16و بیا بریم بیرون به همین ترتیب با بقیه خطوط. به منبع نگاه کنید، من آنها را در اینجا تکرار نمی کنم.

رمزگشایی کد را اسکن کنید.
عالی است، یک کد اسکن وجود دارد، اما با آن چه باید کرد؟ او را به جایی نچسبانید. ما می دانیم که این shnyaga از گونه 01110001 این کد یک و برخی است ال سی دییک صفحه نمایش یا یک ترمینال استاندارد صدایی وحشتناک به ما می دهد و هر آنچه را که او در مورد نماد ما فکر می کند به ما می گوید - می بینید ASCIIآن را بدهد. بسیار خوب، ASCII خواهد بود.

چگونه بودن؟ کل ساختار را اجرا کنید موردجایی که برای هر اسکن یک کد اختصاص دهیم ASCIIمن توسط یک وزغ له می شوم - این چند بررسی است که باید انجام دهید! این است که چند بایت به این همه treyahomudiya می رود؟ و حافظه ما لاستیک نیست، یک هشت کیلوبایت بدبخت، بلکه دو بایت در هر دستور است، این در بهترین حالت است. من می‌توانم همه این کارها را درست در کنترلر صفحه کلید انجام دهم. نه!!! به بالا!!! ما راه خود را خواهیم رفت.
خوب، چه چیزی در انبار داریم؟ روش جدول انتقال به دلیل اختلال وحشتناک کدهای اسکن کار نمی کند. کدو تنبل را خراش دادم، اطراف آپارتمان را زیر و رو کردم... و سپس به من سپیده دم. البته!!! زور بی رحم!!!

کد اسکن بروت فورس
بنابراین، ما یک کد اسکن وحشتناک نامنسجم و همچنین یک جدول باریک داریم ASCIIشخصیت ها. چگونه از مار با جوجه تیغی عبور کنیم؟ بله، همه چیز ساده است! بیایید جدول نماد را در یک دسته در حافظه قرار دهیم [اسکن کد]:و سپس هر کد اسکن مورد نظر را از طریق این جدول اجرا می کنیم و در صورت مطابقت، کد مورد نظر را در خروجی جایگزین می کنیم. ASCIIاز یک دسته یک نمونه کلاسیک از برنامه نویسی - در زمان گم شد، اما در حافظه پیروز شد.

این شکلی است که به نظر می رسد:

CodeGen:LDI ZH،High(Code_Table*2); آدرس جدول کد را آپلود کرد
LDI ZL,Low(Code_Table*2) ; بایت های بالا و پایین

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

Brute: LPM R17,Z+; اولین کاراکتر را از جدول گرفتم - کد اسکن

CPI R17.0xFF ; اگر انتهای جدول
BREQ CG_Exit ; بعد میریم بیرون

CPI R16.0 ; اگر صفر،
BREQ CG_Exit ; سپس ما ترک می کنیم

CP-R16,R17 ; من آن را با کد اسکن کلید مقایسه کردم.
BREQ برابر اگر برابر است، به جایگزینی کد ascii بروید

اولین کد اسکن را از جدول بارگذاری می کنیم و آن را در رجیستر قرار می دهیم R17، به طور همزمان آدرس در رجیستر را افزایش می دهد ز(انتخاب سلول جدول بعدی) و اول از همه آن را با FFکد انتهای جدول است. اگر جدول تمام شد، از اینجا خارج شوید. اگر کل جدول را مرور نکرده باشیم، شروع به مقایسه مقدار ورودی (در ثبات) می کنیم R16) در ابتدا با صفر (بدون فشار دادن)، اگر صفر نیز خارج شده باشد. و با یک کد اسکن از جدول. اگر اسکن جدول با اسکن ورودی مطابقت دارد، سپس به برابر.

LPM R17,Z+ ; Z را 1 افزایش دهید
RJMP Brute ; تکرار چرخه

و اگر چیزی پیدا نشد، دستور را دوباره فراخوانی می کنیم LPM R17,Z+فقط برای بزرگتر کردنش زبه یک - ما باید پا را فراتر بگذاریم ASCIIکد کنید و کد اسکن بعدی را از جدول بگیرید. فقط I.N.C. Zکار نخواهد کرد، زیرا زما داریم دو بایتی. ZL و ZH. در برخی موارد کافی است INC ZL، اما این در صورتی است که مطمئن باشیم آدرس از ابتدا دور نیست و سرریز بایت کم اتفاق نمی افتد (در غیر این صورت به جای آدرس 00000001: 00000000، به سادگی 000000000: 0000000 دریافت می کنیم که از اساس اشتباه است ) و دستور LPMهمه کارها را برای ما انجام خواهد داد، بنابراین در اینجا چند بایت دیگر ذخیره کردیم. سپس به ابتدای چرخه باز خواهیم گشت و دوباره وجود خواهد داشت LPMکه کد اسکن بعدی را بارگذاری می کند.

برابر: LPM R16,Z ; بارگیری کد اسکی از حافظه
RET ما برمی گردیم

اگر تصادفی بود، در نتیجه LPM Z+ما داریم زبه سلول بعدی اشاره می کند ASCIIکد ما آن را در رجیستر آپلود می کنیم R16و میریم بیرون

CG_Exit: CLR R16 ; تنظیم مجدد 0 = بازگشت 0
RET ما برمی گردیم

و در مورد نتیجه صفر، زمانی که جدول تمام شده است، و کد اسکن پیدا نشد، یا صفر در ثبات R16 در ورودی بود، با همان صفر در خروجی برمی گردیم. خودشه.



; داده های استاتیکی
;========================================
Code_Table: .db 0x71,0x31 ;1
.db 0xB1,0x32 ;2
.db 0xD1,0x33 ;3
.db 0x72.0x34 ;4
.db 0xB2,0x35 ;5
.db 0xD2,0x36 ;6
.db 0x73.0x37 ;7
.db 0xB3,0x38 ;8
.db 0xD3,0x39 ;9
.db 0x74.0x30 ;0
.db 0xFF,0 ;END

این فقط یک صفحه از داده های ثابت، در لبه حافظه است. همانطور که می بینید، داده ها توسط دو بایت گروه بندی می شوند - scancode / ASCII

در اینجا، از طریق چنین انحرافی، کل برنامه با پردازش صفحه کلید، رمزگشایی کد اسکن، خواندن / نوشتن در نشانگر LCD و تنظیم مجدد رم (برای اطمینان از صفر بودن حافظه ضروری است) طول کشید. مجموعا 354 بایت. چه کسی می تواند کمتر انجام دهد؟

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

رایج ترین کیبوردها 3x4 و 4x4 به ترتیب با 12 و 16 دکمه هستند. یک کیبورد 4*4 در دستانم بود. اکنون کار با او را در نظر خواهیم گرفت.

من چنین صفحه کلیدی با تماس های غشایی داشتم. خوب است زیرا فقط 1 میلی متر ضخامت دارد و به راحتی می توان آن را به سطوح مورد نظر چسباند.

با زدن دکمه ها، با استفاده از یک مولتی متر، نحوه اتصال دکمه های داخل صفحه کلید را تنظیم می کنم.


یک عملکرد ویژه برای اسکن صفحه کلیدهای ماتریسی در Bascom-AVR وجود دارد Getkbd() . این دستور برای کیبوردهای ۴×۴ طراحی شده است، بنابراین از هر ۸ پین یک پورت میکروکنترلر استفاده می‌کند. و در مورد استفاده از کیبورد با دکمه های کمتر، باید به این موضوع توجه شود.

پیکربندی فرمان شامل اختصاص پورتی است که صفحه کلید به آن متصل می شود، زمان گذراندن تماس و تأخیر پس از تشخیص فشار دادن.

برای مثال در خط زیر:

پیکربندی Kbd = پورت، انحراف= 20 , تاخیر انداختن= 100

اتصال صفحه کلید به PortD پیکربندی شد، زمان پرش روی 20 میلی ثانیه تنظیم شد، زمان تأخیر پس از فشار دادن 100 میلی ثانیه

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

در مثال زیر صفحه کلید با فرکانس 10 هرتز اسکن شده و در حلقه برنامه اصلی قرار دارد. نتیجه فشار دادن روی صفحه نمایش LCD نمایش داده می شود.

$regfile = "m8def.dat"
کریستال دلار = 1000000

"پیکربندی نمایشگر
پیکربندی Lcdpin = پین، Rs = Portc. 0 , E = Portc . 1 , Db4 = Portc . 2 , Db5 = Portc . 3 , Db6 = Portc . 4 , Db7 = Portc . 5
پیکربندی ال سی دی= 20 * 4
مکان نما خاموش
Cls

"پیکربندی صفحه کلید
پیکربندی Kbd = پورت، انحراف= 20 , تاخیر انداختن= 100


"متغیرها
کم نور Key_char مانندبایت ها"تعداد کلید فشرده شده
کم نور Key_str مانندرشته* 1 "شخصیت کلید فشرده روی صفحه کلید
کم نور نتیجه مانندرشته* 20 "نتیجه فشار دادن صفحه کلید

نتیجه= ""

"حلقه اصلی برنامه
انجام دادن

Key_char= Getkbd() "کلید فشار داده نمی شود و تابع مقدار 16 را به متغیر برمی گرداند

اگر Key_char<> 16 سپس"اگر متغیر برابر با 16 نباشد، دکمه فشار داده شده است
Key_str= Lookupstr(key_char، Keyboard_data) "شخصیت کلید فشار داده شده را بیرون بکشید
نتیجه= نتیجه + key_str
پایان اگر

مکان یابی کنید 1 , 1

ال سی دی نتیجه "نتیجه فشار دادن را نشان می دهد

منتظر می ماند 100

حلقه

پایان

صفحه کلید_داده:
داده ها "1" , "4" , "7" , "*" , "2" , "5" , "8" , "0"
داده ها "3"، "6"، "9"، "#"، "A"، "B"، "C"، "D"

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

اضافه کردن مقاومت های محدود کننده جریان به خط صفحه کلید، با مقدار اسمی 100-150 اهم، به مدار ضرری ندارد. در هر صورت، اما برای آزمایش انجام می شود (نکته اصلی این است که چندین دکمه را همزمان فشار ندهید)

ما متصل می شویم، فلاش می زنیم، دکمه ها را فشار می دهیم و نتیجه را می بینیم - نمادهای کلیدهای فشرده روی صفحه نمایش نمایش داده می شوند:


بعداً به محض اینکه چیزی برای فیلمبرداری با کیفیت مناسب پیدا کردم، یک ویدیوی آزمایشی اضافه خواهم کرد.

در ضمن، می توانید آرشیو حاوی فایل شبیه سازی در Proteus و فریمور را دانلود کنید.