AVRSTM32کدویژن

اسکن صفحه کلید ماتریسی 4*4 با AVR و STM32

آموزش راه اندازی کیپد 4X4

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

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

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

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

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

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

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

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

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

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

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

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

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

اسکن صفحه کلید ماتریسی 4*4
اسکن صفحه کلید ماتریسی ۴*۴
unsigned char row;
DDRx =0XF0; // 4 OUT 4 IN
PORTx=0X0F; // key columns all low and active pull ups on rows enabled
if(PINx.3==0) row=0;
if(PINx.2==0) row=4;
if(PINx.1==0) row=8;
if(PINx.0==0) row=12;

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

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

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

صفحه کلید ماتریسی 4*4
صفحه کلید ماتریسی ۴*۴
unsigned char column;
DDRx =0X0F; // 4 IN 4 OUT / change port configuration
PORTx=0XF0; // enable pull ups on columns and write 0s to rows
if(PINx.7==0) column =0;
if(PINx.6==0) column =1;
if(PINx.5==0) column =2;
if(PINx.4==0) column =3;

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

flash char kbd_table[16]={‘۱’,’۲′,’۳′,’A
‘۴’,’۵’,’۶’,’B’,
‘۷’,’۸’,’۹’,’C’,
‘*’,’۰’,’#’,’D’};

char key;
key=kbd_table [ row + column ];

برای درک بهتر مسئله به ذکر یک مثال می پردازیم :
فرض می کنیم کلید شماره ۹ از روی صفحه کلید ماتریسی ۴*۴ را فشرده ایم طبق مرحله اول اسکن صفحه کلید ، 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

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

void kbd_init(void);

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

تابع  debounce

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

void debounce(unsigned char Debouncing_time);

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

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

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

تابع waitkey 

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

void waitkey(void);

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

تابع waitnokey

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

void waitnokey(void);

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

تابع readkey

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

char readkey(void);

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

تابع getkey

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

char getkey(void);

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

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

تابع getnum

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

char getnum(void);

عملکرد این تابع شبیه عملکرد تابع 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   کاراکتری به شکل زیر می باشد  :

#asm
.equ __lcd_port=0x18 ;portb
#endasm
#include <lcd.h>;

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

 

#asm
.equ __kbd_port=0x1b ;porta
#endasm
#include <keypad.h>;

 

نمایش کلید فشرده شده بر روی lcd کاراکتری

اسکن صفحه کلید 4*4
اسکن صفحه کلید ۴*۴
/****************************************************
Project : 4 x 4 Keypad - polling
Version : 1
Date    : 4/5/2013
Author  : hossein ghiasvand
Company : http://www.micronik.ir
E-mail  :hossein.ghiasvand@gmail.com

Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
****************************************************/
#include <mega16.h>
#include <delay.h>
#include <alcd.h>

#asm
    .equ __kbd_port=0x1b ;PORTA
#endasm
#include <keypad.h>

void main(void)
{
lcd_init(16);
kbd_init();

while (1)
      { 
      unsigned char keypressed;
      lcd_clear();      
      lcd_gotoxy(0,0);
      lcd_putsf("Enter Key:");
      lcd_gotoxy(0,1); 
      _lcd_write_data(0x0f);     //Cursor blanked
          while(1)
          { 
          keypressed=getkey();
          lcd_putchar(keypressed);
          if(keypressed=='C') break; //'C'-----> clear screen
          }
      }
}

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

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

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

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

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

/****************************************************
Project : 4 x 4 Keypad - Wake-up on Keypress
Version : 2
Date    : 4/5/2013
Author  : hossein ghiasvand
Company : http://www.micronik.ir
E-mail  :hossein.ghiasvand@gmail.com
Comments: 
• ۱۶ Key Pushbutton Pad in 4 x 4 Matrix
Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
****************************************************/
#include <mega16.h>
#include <delay.h>
#include <alcd.h>

#include <keypad.h>
#asm
.equ __kbd_port=0x1b ;PORTA
#endasm

_Bool wakeup=0;
char k;

void main(void)
{
DDRD=0X00;
PORTD=0Xff;
MCUCR=0x30;
GIMSK=0x40;
lcd_init(16);
lcd_clear();
kbd_init();
#asm("sei")
while (1)
      {  
      if(wakeup){  
        k=getkey(); 
        wakeup=0;
        lcd_putchar(k);
        if( k=='C') lcd_clear(); //'C'-----> clear 
        };
      // Place your code here
      }
}
 
interrupt [EXT_INT0] void ext_int0_isr(void)
{
wakeup=1;
}     


برای کاربرانی که از میکروکنترلر stm32 استفاده می کنند یک کتابخانه کاملا استاندارد برای کیپدهای 4*4 و 4*3 آماده کرده ایم که به راحتی می توانید در پروژه های خود از آن استفاده نمایید .

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

قابلیت های کتابخانه صفحه کلید 4*4 و 4*3 برای STM32

اسکن صفحه کلید به روش polling
اسکن صفحه کلید به روش external inrerrupt
اسکن صفحه کلید به روش timer
اتصال پایه های صفحه کلید به پایه های دلخواه از میکروکنترلر
پیکربندی پایه ها در محیط نرم افزار stm32cubemx ، بدون نیاز تغییر در کتابخانه
قابل استفاده در keil و  stm32cubeide
نوشته شده توسط توابع HAL
به همراه کتابخانه LCD کاراکتری ، مثال و راهنمای استفاده

پروژه قفل رمزدار دیجیتال توسط STM32

قابلیت نمایش رمز تایپ شده تا 8 رقم بر روی LCD کاراکتری
قابلیت پاک کردن رمز و کاراکترهای تایپ شده بر روی LCD
قفل شدن اتوماتیک ، در صورت عدم تایپ بعد از 15 ثانیه
قابلیت تغییر رمز عبور و ذخیره در حافظه EEPROM Emulation میکروکنترلر STM32
قابلیت بازنشانی رمز عبور به رمز پیشفرض با نگهداشتن کلید مخفی به مدت 6 ثانیه
به همراه کتابخانه کیپد و LCD کاراکتری برای STM32

نویسنده : حسین غیاثوند
خرید و دانلود در لحظه :

Admin

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

نوشته های مشابه

guest
29 دیدگاه
قدیمی ترین
جدیدترین محبوب ترین
بازخورد داخلی
مشاهده همه نظرات