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

در صورت لزوم استفاده از صفحه کلید با تعداد زیادی دکمه در یک دستگاه، به عنوان مثال، در قفل ترکیبی، اغلب از صفحه کلید ماتریسی استفاده می شود. اگر 12 دکمه را به روش معمول وصل کنید، به 12 پایه میکروکنترلر به اضافه یک سیم مشترک نیاز خواهید داشت، اما ماتریس تنها از یک پورت کنترلر استفاده می کند که باعث ذخیره پین ​​های کنترلر می شود. دکمه های موجود در چنین صفحه کلید به ستون های مشترک و به ردیف های مشترک متصل می شوند، خطوط پورت میکروکنترلر به ورودی PB7-PB4 و خروجی PB3-PB0 تقسیم می شوند. در هر لحظه سیگنال سطح پایین(صفر منطقی) فقط به یک ردیف از دکمه ها تغذیه می شود، بقیه باید به یک واحد منطقی تغذیه شوند. این امر باعث رفع ابهام در تعیین تعداد دکمه فشرده می شود. سیگنال های باینری موجود در همان زمان روی ستون های صفحه کلید از طریق درگاه ورودی میکروکنترلر خوانده می شوند.

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

در زیر نمونه ای از برنامه ای را مشاهده می کنید که در آن با فشردن کلید خاصی، مقدار آن بر روی یک نمایشگر هفت بخش نمایش داده می شود. میکروکنترلر Atmega8 توسط یک نوسانگر داخلی 8 مگاهرتز تغذیه می شود.

/*** اتصال صفحه کلید ماتریسی به میکروکنترلرهای AVR ***/ #include #عبارتند از // آرایه مقادیر برای پورت خروجی char key_tab بدون علامت = (0b11111110, 0b11111101, 0b11111011, 0b11110111)؛ // تابع نظرسنجی صفحه کلید علامت علامت نشده scan_key(void) ( char key_value بدون علامت = 0; char i بدون علامت; for(i = 0; i< 4;i++) { PORTB = key_tab[i]; // выводим лог. 0 в порт вывода _delay_us(10); switch (PINB & 0xF0) { case 0b11100000: key_value = 1 + i * 3; return (key_value); case 0b11010000: key_value = 2 + i * 3; return (key_value); case 0b10110000: key_value = 3 + i * 3; return (key_value); default: break; } } return (key_value); } int main(void) { // массив цифр для индикатора unsigned char num = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; DDRB |= (1 << PB3)|(1 << PB2)|(1 << PB1)|(1 << PB0); // Порт вывода DDRB &= ~(1 << PB7)|(1 << PB6)|(1 << PB5)|(1 << PB4); // Порт ввода PORTB = 0xF0; // Устанавливаем лог. 1 в порт ввода DDRD = 0xFF; // Выход на индикатор PORTD = 0x00; _delay_ms(10); while(1) { // Выводим значение нажатой кнопки на индикатор if(scan_key()==1) PORTD = num; if(scan_key()==2) PORTD = num; if(scan_key()==3) PORTD = num; if(scan_key()==4) PORTD = num; if(scan_key()==5) PORTD = num; if(scan_key()==6) PORTD = num; if(scan_key()==7) PORTD = num; if(scan_key()==8) PORTD = num; if(scan_key()==9) PORTD = num; if(scan_key()==11) PORTD = num; } }

آرشیو مقاله "اتصال صفحه کلید ماتریسی به میکروکنترلرهای AVR"
شرح:پروژه AVRStudio و Proteus
حجم فایل: 37.33 کیلوبایت تعداد دانلود: 1 905

در این مقاله می خواهم خوانندگان را با اتصال کیبورد به میکروکنترلر آشنا کنم. واقعیت این است که معمولاً اکثر مدارهای روی میکروکنترلرها برای وارد کردن داده ها به یک یا چند دکمه نیاز دارند. اما با پیچیده تر شدن پروژه ها، ممکن است استفاده از صفحه کلید کوچک ضروری شود. انواع صفحه کلید 3x4 یا 4x4 وجود دارد و تقریباً همیشه کلیدهای موجود در آنها طبق طرح ماتریس به هم متصل می شوند. استفاده از ماتریس به دلیل این واقعیت است که اتصال آن به حداقل تعداد خطوط ورودی-خروجی نیاز دارد. به عنوان مثال، برای یک صفحه کلید 4x4، متشکل از 16 دکمه، 16 خط ورودی مورد نیاز است، بنابراین منطقی تر است که آن را در قالب یک ماتریس سازماندهی کنید، یعنی. 4 دکمه را در 4 ردیف با استفاده از 8 خط ورودی / خروجی (یک پورت میکروکنترلر) مرتب کنید. رایج ترین راه حل برای اتصال یک ماتریس به یک پورت، اتصال ردیف ها به بیت های بالا و ستون ها به بیت های پایین است. با این حال، در اینجا یک مشکل وجود دارد - خواندن وضعیت صفحه کلید زمانی رخ می دهد که وقفه رخ دهد، اما در میکروکنترلر ATtiny2313 می توانیم از دو وقفه خارجی استفاده کنیم (بقیه پین ​​ها مشغول هستند). این مشکل با اتصال چهار دیود، که یک عنصر "OR" را با یک مقاومت کششی در ورودی INT0 تشکیل می دهند، حل می شود.

طرح اتصال یک صفحه کلید ماتریس 4x4 به میکروکنترلر در شکل 1 نشان داده شده است. دارای کانکتور DB-9F، مبدل سطح MAX3232 است که برای ارتباط UART میکروکنترلر با RS-232 ضروری است و عملکرد آن در مقاله قبلی توضیح داده شد. مقاومت های R3 - R6 از میکروکنترلر در برابر اتصال کوتاه در منبع تغذیه به زمین محافظت می کنند. در ورودی INT0 یک مقاومت کششی R7 وجود دارد. چهار دیود VD1 - VD4 به خطوط ورودی / خروجی صفحه کلید (کاتد) و به خروجی INT0 (آند) متصل می شوند. حالا وقتی هر دکمه ای را فشار می دهید، اگر صفر روی ستون ها اعمال شود، سطح پایینی در ورودی INT0 ظاهر می شود.

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

بیایید فرض کنیم که کل پورت B روی ورودی تنظیم شده است، و همه ورودی ها یک pullup دارند:

DDRB = &B00000000

PORTB = &B11111111

اجازه دهید دکمه ها (شکل 2) نیز به نحوی به "زمین" (GND) متصل شوند، سپس هنگامی که مثلاً دکمه "1" را روی پین های پورت B PB3 و PB4 فشار دهید، سطح پایینی وجود خواهد داشت. یعنی پورت مقدار PORTB = &B11100111 را می گیرد که کد دکمه "1" است. همین امر در مورد سایر دکمه ها نیز صدق می کند (کد دکمه "B" - 01111011، "5" - 11011011، و غیره). اما از آنجایی که دکمه ها به GND متصل نیستند، لازم است تعریف جداگانه ای از ردیف ها و ستون ها وارد شود و سپس جمع بندی و شناسایی نتیجه با نام دکمه انجام شود.

بیایید ردیف های ورودی PB0 - PB3 را بسازیم و pull-up آنها را روشن کنیم و ستون های PB3 - PB7 - خروجی:

DDRB = &B11110000

PORTB = &B00001111

وقتی دکمه فشار داده می شود، رشته خاصی کم می شود. به عنوان مثال، هنگامی که دکمه "1" را فشار می دهید، پورت B مقدار 00000111 را می گیرد که کد رشته است. در همان زمان، یک وقفه روشن می شود که در طول پردازش آن لازم است این کد را در متغیر Stro بخوانید:

تنظیمات پورت را برعکس کنید - ستون های ورودی PB3 - PB7 را ایجاد کنید و pull-up آنها را روشن کنید و ردیف PB0 - PB3 - خروجی:

DDRB = &B00001111

PORTB = &B11110000

حالا وقتی دکمه "1" را فشار دهید، پورت دارای مقدار 11100000 می شود که کد ستون است. ما این کد را در متغیر Col می خوانیم.

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

رایج ترین کیبوردها 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 اهم، به مدار ضرری ندارد. در هر صورت، اما برای آزمایش انجام می شود (نکته اصلی این است که چندین دکمه را همزمان فشار ندهید)

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


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

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

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

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

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

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

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

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

باید با 8 پین به تخته متصل شود، هر کدام از آنها مقادیری را از ردیف ها و ستون های خاص می خواند. آنها باید به پایانه های پنل دیجیتال متصل شوند. من برای مثال به پین ​​های 2 تا 9 وصل خواهم شد. توصیه نمی شود که صفر و اول را لمس کنید، زیرا آنها برای رابط UART در نظر گرفته شده اند (به عنوان مثال، برای اتصال یک ماژول بلوتوث). بهتر است آنها را آزاد بگذارید.

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

پس از نصب کتابخانه، می توانید به Arduino IDE (برنامه ای از وب سایت آردوینو) بروید و نمونه هایی از اسکچ ها را ببینید.

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

#عبارتند از // شامل کتابخانه ما شود




{"2","5","8","0"},
{"3","6","9","#"},
("آ ب پ ت")
};




void setup()(
Serial.begin(9600);
}
حلقه خالی()(

اگر (کلید سفارشی)(
Serial.println(customKey);
}
}

طرح بسیار ساده است. شایان ذکر است خطوط اول کد. ابتدا کتابخانه را به هم وصل می کنیم، سپس مشخص می کنیم که صفحه کلید دارای چند ردیف و ستون است و سپس باید نام کلیدها را به درستی مرتب کنیم تا کار راحت تر شود.

اگر این کار به اشتباه انجام شود، مثلاً وقتی عدد 4 را فشار می دهید، عدد 6 یا هر کاراکتر دیگری وارد پورت می شود. این را می توان به صورت تجربی تعیین کرد و کاراکترها را همانطور که روی صفحه کلید قرار دارند مرتب کرد.

در عمل تنظیم خالیسرعت اتصال سریال با مانیتور پورت را مشخص کنید 9600 باد. این عملکرد فقط برای تامین برق ماژول ها مورد نیاز است. در عمل حلقه خالیشرط را بنویس متغیر Charبرای ذخیره فقط یک کاراکتر، مانند 1، A، یا 5، هر کدام که مناسب موقعیت باشد، استفاده می شود. اگر فشار ثابت باشد، کاراکتر با استفاده از عملکرد به مانیتور پورت خروجی می شود چاپ سریالدر پرانتز، باید مشخص کنید که کدام متغیر را به پورت خروجی می دهیم. اگر همه چیز به درستی انجام شود، نمادی را دریافت می کنیم که در مانیتور پورت کلیک شده است. فراموش نکنید که نرخ باود را در مانیتور پورت در پایین سمت راست تنظیم کنید تا مانند طرح باشد.

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

بیایید داده ها را نمایش دهیم.

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

در مرحله بعد، باید اندازه نمایشگر را مشخص کنید. صفحه نمایش استفاده شده در مثال دارای 16 کاراکتر در هر یک از 2 خط است که من به آن اشاره می کنم. در عمل تنظیم خالیباید صفحه نمایش را روشن کنید و نور پس زمینه را روشن کنید. این کار با استفاده از دو تابع انجام می شود: lcd.beginو ال سی دی. نور پس زمینه.

#عبارتند از // شامل کتابخانه ما
#عبارتند از
ال سی دی LiquidCrystal_I2C (0x27, 16, 2);
بایت const ROWS = 4; //تعداد خطوط روی صفحه کلید ما
بایت const COLS = 4; //تعداد ستون ها برای صفحه کلید ما
char hexaKeys = (
("S""4""7"""*")، // در اینجا نام کلیدهای خود را مانند روی صفحه کلید، برای سهولت استفاده قرار می دهیم.
("O"، "5"، "8"، "0")،
("S"، "6"، "9"، "#")،
("I"، "B"، "C"، "D")
};
پین ردیف بایت = (5، 4، 3، 2); // کنترل رشته را به کدام پین ها وصل می کنیم
colPins بایت = (9، 8، 7، 6); //کنترل ستون را به کدام پین ها وصل می کنیم
// یک نمونه از کلاس NewKeypad را راه اندازی کنید
صفحه کلید سفارشی Keypad = Keypad (makeKeymap(HexaKeys)، rowPins، colPins، ROWS، COLS);
void setup()(
Serial.begin(9600);
lcd.begin(); // صفحه را مقدار دهی اولیه کنید
lcd.backlight();
}
حلقه خالی()(
char customKey = customKeypad.getKey();
اگر (کلید سفارشی)(
Serial.println(customKey);
lcd.setCursor(1,4); //تنظیم مکان نما
lcd.print(customKey);
}
}

در عمل حلقه Voilشما باید خط را در خود شرط بنویسید چاپ ال سی دیبرای نمایش داده ها و هنوز باید موقعیت مکان نما را از قبل تنظیم کنید. دو رقم در پرانتز وجود دارد: اولی شماره کاراکتر و دومی شماره خط است. باید به خاطر داشت که برای این نمایش، شمارش سطرها و ستون ها از یک شروع نمی شود، بلکه از صفر شروع می شود. یعنی خطوطی با شماره 0 و 1 وجود دارد و نه 1 و 2، همانطور که در ابتدا به نظر می رسد. سپس کد را روی برد آپلود می کنیم و می بینیم چه اتفاقی می افتد.

از آنجایی که نمایشگر از طریق رابط I2C کار می کند، آن را به خروجی های آنالوگ متصل می کنیم. خروجی های SDA و SCL را به ترتیب به A4 و A5 وصل می کنیم و دو خروجی دیگر از قبل برق و زمین هستند.

همانطور که مشاهده می کنید با کلیک بر روی هر علامتی نمایش آن را روی نمایشگر مشاهده می کنیم.

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

اتصال کیبورد به آردوینو و کنترل اکشن

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

بیایید سعی کنیم با فشار دادن یک کلید خاص، LED را روشن یا خاموش کنیم. ما آن را به نمودار اضافه می کنیم.

اتصال LED

من از برد برد و مقاومت (ترجیحاً 150 تا 220 اهم) استفاده خواهم کرد. مدار را با دو جامپر می بندم و آنها را به پایه های پاور و زمین روی برد آردوینو وصل می کنم.

مدار به این صورت عمل می کند: با فشار دادن 1، LED روشن می شود، زمانی که 2 را فشار می دهید، خاموش می شود.

LED در مثال به پایه 8 برد آردوینو متصل است.

#عبارتند از
بایت const ROWS = 4; // چهار ردیف
بایت const COLS = 4; // سه ستون
کلیدهای char = ( // نقشه کلید را تعریف کنید
("1"، "4"، "7"، "*")، // در اینجا برای سهولت استفاده، نام کلیدهای خود را مانند روی صفحه کلید قرار می دهیم.
{"2","5","8","0"},
{"3","6","9","#"},
("آ ب پ ت")
};
پین ردیف بایت = ( 5، 4، 3، 2)؛ // صفحه کلید ROW0، ROW1، ROW2 و ROW3 را به این پین‌های آردوینو وصل کنید.
بایت colPins = ( 9، 8، 7،6); // صفحه کلید COL0، COL1 و COL2 را به این پین های آردوینو وصل کنید.
صفحه کلید kpd = صفحه کلید (makeKeymap (کلیدها)، پین ردیف، colPins، ROWS، COLS)؛// ایجاد صفحه کلید
#Ledpin 8 را تعریف کنید
تنظیم خالی ()
{
pinMode (ledpin، OUTPUT)؛
Serial.begin(9600);
}
حلقه خالی()
{
کلید char = kpd.getKey();
if(key) // کلید معتبر را بررسی کنید.
{
سوئیچ (کلید)
{
مورد 1":
digitalWrite (ledpin، HIGH)؛
زنگ تفريح؛
مورد "2":
digitalWrite (ledpin، LOW)؛
زنگ تفريح؛
}
}
}

بیایید به طرح نگاهی بیندازیم.

بیایید اولین طرح درس را بگیریم و فقط آن را اضافه کنیم. در ابتدا با یک تابع مفید تعریف کردنیک نام به LED متصل به پین ​​8 اختصاص دهید ledpin. در عمل تنظیم خالیسیگنال LED را به عنوان خروجی مشخص کنید.

اگر نه برای کتابخانه صفحه کلیدبرای صفحه کلید، باید همان را برای 8 پینی که صفحه کلید به آن متصل است بنویسید. در عمل حلقه خالیوضعیت. با فشار دادن یک کلید خاص، مقدار یک متغیر "برابر" می شود کلیددستور switch مقادیر یک متغیر را مقایسه می کند کلیدو بسته به این مقدار دستورات خاصی را می دهد. از دو اپراتور کمکی تشکیل شده است موردو زنگ تفريح. به بیان ساده، اگر مقدار متغیری برابر با 1 پیدا شود، عمل انجام خواهد شد. اپراتور زنگ تفريحبه عنوان یک دستور خروج از بیانیه عمل می کند مورد.

بر این اساس وقتی عدد 1 را فشار دهید حداکثر ولتاژ به ال ای دی اعمال می شود و روشن می شود. وقتی 2 را فشار دهید روشن نمی شود. این در تابع نشان داده شده است نوشتن دیجیتال، جایی که نام متغیر و "نشان" آن در داخل پرانتز آمده است. بنابراین می توانید دستورات خاصی را برای هر دکمه بنویسید و تعداد زیادی LED را کنترل کنید یا دستوری برای روشن کردن همه LED ها به طور همزمان ایجاد کنید.

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

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

مقدمه

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

همچنین، دستگاهی که در این مورد کاربردی توضیح داده شده است، از عملکردهای قابل برنامه ریزی توسط کاربر جایگزین مانند Caps Lock، 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 توضیح داده شده است. عملکردهای باقی مانده از مثال برنامه توصیف شده نیازی به تغییر ندارند.